17
17
#include < __functional/binary_function.h>
18
18
#include < __functional/invoke.h>
19
19
#include < __functional/unary_function.h>
20
- #include < __iterator/iterator_traits.h>
21
20
#include < __memory/addressof.h>
22
- #include < __memory/allocator.h>
23
- #include < __memory/allocator_destructor.h>
24
- #include < __memory/allocator_traits.h>
25
- #include < __memory/compressed_pair.h>
26
- #include < __memory/unique_ptr.h>
27
21
#include < __type_traits/aligned_storage.h>
28
22
#include < __type_traits/decay.h>
29
23
#include < __type_traits/is_core_convertible.h>
34
28
#include < __type_traits/strip_signature.h>
35
29
#include < __utility/forward.h>
36
30
#include < __utility/move.h>
37
- #include < __utility/piecewise_construct.h>
38
31
#include < __utility/swap.h>
39
- #include < __verbose_abort>
40
32
#include < tuple>
41
33
#include < typeinfo>
42
34
@@ -133,71 +125,9 @@ _LIBCPP_HIDE_FROM_ABI bool __not_null(_Rp (^__p)(_Args...)) {
133
125
134
126
namespace __function {
135
127
136
- // __alloc_func holds a functor and an allocator.
137
-
138
- template <class _Fp , class _Ap , class _FB >
139
- class __alloc_func ;
140
128
template <class _Fp , class _FB >
141
129
class __default_alloc_func ;
142
130
143
- template <class _Fp , class _Ap , class _Rp , class ... _ArgTypes>
144
- class __alloc_func <_Fp, _Ap, _Rp(_ArgTypes...)> {
145
- _LIBCPP_COMPRESSED_PAIR (_Fp, __func_, _Ap, __alloc_);
146
-
147
- public:
148
- using _Target _LIBCPP_NODEBUG = _Fp;
149
- using _Alloc _LIBCPP_NODEBUG = _Ap;
150
-
151
- _LIBCPP_HIDE_FROM_ABI const _Target& __target () const { return __func_; }
152
-
153
- // WIN32 APIs may define __allocator, so use __get_allocator instead.
154
- _LIBCPP_HIDE_FROM_ABI const _Alloc& __get_allocator () const { return __alloc_; }
155
-
156
- _LIBCPP_HIDE_FROM_ABI explicit __alloc_func (_Target&& __f) : __func_(std::move(__f)), __alloc_() {}
157
-
158
- _LIBCPP_HIDE_FROM_ABI explicit __alloc_func (const _Target& __f, const _Alloc& __a) : __func_(__f), __alloc_(__a) {}
159
-
160
- _LIBCPP_HIDE_FROM_ABI explicit __alloc_func (const _Target& __f, _Alloc&& __a)
161
- : __func_(__f), __alloc_(std::move(__a)) {}
162
-
163
- _LIBCPP_HIDE_FROM_ABI explicit __alloc_func (_Target&& __f, _Alloc&& __a)
164
- : __func_(std::move(__f)), __alloc_(std::move(__a)) {}
165
-
166
- _LIBCPP_HIDE_FROM_ABI _Rp operator ()(_ArgTypes&&... __arg) {
167
- return std::__invoke_r<_Rp>(__func_, std::forward<_ArgTypes>(__arg)...);
168
- }
169
-
170
- _LIBCPP_HIDE_FROM_ABI __alloc_func* __clone () const {
171
- typedef allocator_traits<_Alloc> __alloc_traits;
172
- typedef __rebind_alloc<__alloc_traits, __alloc_func> _AA;
173
- _AA __a (__alloc_);
174
- typedef __allocator_destructor<_AA> _Dp;
175
- unique_ptr<__alloc_func, _Dp> __hold (__a.allocate (1 ), _Dp (__a, 1 ));
176
- ::new ((void *)__hold.get ()) __alloc_func (__func_, _Alloc (__a));
177
- return __hold.release ();
178
- }
179
-
180
- _LIBCPP_HIDE_FROM_ABI void destroy () _NOEXCEPT {
181
- __func_.~_Fp ();
182
- __alloc_.~_Alloc ();
183
- }
184
-
185
- _LIBCPP_HIDE_FROM_ABI static void __destroy_and_delete (__alloc_func* __f) {
186
- typedef allocator_traits<_Alloc> __alloc_traits;
187
- typedef __rebind_alloc<__alloc_traits, __alloc_func> _FunAlloc;
188
- _FunAlloc __a (__f->__get_allocator ());
189
- __f->destroy ();
190
- __a.deallocate (__f, 1 );
191
- }
192
- };
193
-
194
- template <class _Tp >
195
- struct __deallocating_deleter {
196
- _LIBCPP_HIDE_FROM_ABI void operator ()(void * __p) const {
197
- std::__libcpp_deallocate<_Tp>(static_cast <_Tp*>(__p), __element_count (1 ));
198
- }
199
- };
200
-
201
131
template <class _Fp , class _Rp , class ... _ArgTypes>
202
132
class __default_alloc_func <_Fp, _Rp(_ArgTypes...)> {
203
133
_Fp __f_;
@@ -215,20 +145,9 @@ class __default_alloc_func<_Fp, _Rp(_ArgTypes...)> {
215
145
return std::__invoke_r<_Rp>(__f_, std::forward<_ArgTypes>(__arg)...);
216
146
}
217
147
218
- _LIBCPP_HIDE_FROM_ABI __default_alloc_func* __clone () const {
219
- using _Self = __default_alloc_func;
220
- unique_ptr<_Self, __deallocating_deleter<_Self>> __hold (std::__libcpp_allocate<_Self>(__element_count (1 )));
221
- _Self* __res = ::new ((void *)__hold.get ()) _Self (__f_);
222
- (void )__hold.release ();
223
- return __res;
224
- }
148
+ _LIBCPP_HIDE_FROM_ABI __default_alloc_func* __clone () const { return new __default_alloc_func (__f_); }
225
149
226
150
_LIBCPP_HIDE_FROM_ABI void destroy () _NOEXCEPT { __f_.~_Target (); }
227
-
228
- _LIBCPP_HIDE_FROM_ABI static void __destroy_and_delete (__default_alloc_func* __f) {
229
- __f->destroy ();
230
- std::__libcpp_deallocate<__default_alloc_func>(__f, __element_count (1 ));
231
- }
232
151
};
233
152
234
153
// __base provides an abstract interface for copyable functors.
@@ -257,84 +176,38 @@ class __base<_Rp(_ArgTypes...)> {
257
176
258
177
// __func implements __base for a given functor type.
259
178
260
- template <class _FD , class _Alloc , class _FB >
179
+ template <class _FD , class _FB >
261
180
class __func ;
262
181
263
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
264
- class __func <_Fp, _Alloc, _Rp(_ArgTypes...)> : public __base<_Rp(_ArgTypes...)> {
265
- __alloc_func< _Fp, _Alloc, _Rp(_ArgTypes...)> __f_ ;
182
+ template <class _Fp , class _Rp , class ... _ArgTypes>
183
+ class __func <_Fp, _Rp(_ArgTypes...)> : public __base<_Rp(_ArgTypes...)> {
184
+ _Fp __func_ ;
266
185
267
186
public:
268
- _LIBCPP_HIDE_FROM_ABI explicit __func (_Fp&& __f) : __f_(std::move(__f)) {}
187
+ _LIBCPP_HIDE_FROM_ABI explicit __func (_Fp&& __f) : __func_(std::move(__f)) {}
188
+ _LIBCPP_HIDE_FROM_ABI explicit __func (const _Fp& __f) : __func_(__f) {}
269
189
270
- _LIBCPP_HIDE_FROM_ABI explicit __func ( const _Fp& __f, const _Alloc& __a) : __f_(__f, __a) { }
190
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL __base<_Rp(_ArgTypes...)>* __clone () const override { return new __func (__func_); }
271
191
272
- _LIBCPP_HIDE_FROM_ABI explicit __func ( const _Fp& __f, _Alloc&& __a) : __f_(__f, std::move(__a)) {}
273
-
274
- _LIBCPP_HIDE_FROM_ABI explicit __func (_Fp&& __f, _Alloc&& __a) : __f_(std::move(__f), std::move(__a)) { }
192
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL void __clone (__base<_Rp(_ArgTypes...)>* __p) const override {
193
+ :: new (( void *)__p) __func (__func_);
194
+ }
275
195
276
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual __base<_Rp(_ArgTypes...)>* __clone () const ;
277
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __clone (__base<_Rp(_ArgTypes...)>*) const ;
278
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void destroy () _NOEXCEPT;
279
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void destroy_deallocate () _NOEXCEPT ;
280
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual _Rp operator ()(_ArgTypes&&... __arg);
196
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL void destroy () _NOEXCEPT override { __func_. ~_Fp (); }
197
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL void destroy_deallocate () _NOEXCEPT override { delete this ; }
198
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL _Rp operator ()(_ArgTypes&&... __arg) override {
199
+ return std::__invoke_r<_Rp>(__func_, std::forward<_ArgTypes>(__arg)...) ;
200
+ }
281
201
# if _LIBCPP_HAS_RTTI
282
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual const void * target (const type_info&) const _NOEXCEPT;
283
- _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual const std::type_info& target_type () const _NOEXCEPT;
202
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL const void * target (const type_info& __ti) const _NOEXCEPT override {
203
+ if (__ti == typeid (_Fp))
204
+ return std::addressof (__func_);
205
+ return nullptr ;
206
+ }
207
+ _LIBCPP_HIDE_FROM_ABI_VIRTUAL const std::type_info& target_type () const _NOEXCEPT override { return typeid (_Fp); }
284
208
# endif // _LIBCPP_HAS_RTTI
285
209
};
286
210
287
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
288
- __base<_Rp(_ArgTypes...)>* __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const {
289
- typedef allocator_traits<_Alloc> __alloc_traits;
290
- typedef __rebind_alloc<__alloc_traits, __func> _Ap;
291
- _Ap __a (__f_.__get_allocator ());
292
- typedef __allocator_destructor<_Ap> _Dp;
293
- unique_ptr<__func, _Dp> __hold (__a.allocate (1 ), _Dp (__a, 1 ));
294
- ::new ((void *)__hold.get ()) __func (__f_.__target (), _Alloc (__a));
295
- return __hold.release ();
296
- }
297
-
298
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
299
- void __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const {
300
- ::new ((void *)__p) __func (__f_.__target (), __f_.__get_allocator ());
301
- }
302
-
303
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
304
- void __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT {
305
- __f_.destroy ();
306
- }
307
-
308
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
309
- void __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT {
310
- typedef allocator_traits<_Alloc> __alloc_traits;
311
- typedef __rebind_alloc<__alloc_traits, __func> _Ap;
312
- _Ap __a (__f_.__get_allocator ());
313
- __f_.destroy ();
314
- __a.deallocate (this , 1 );
315
- }
316
-
317
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
318
- _Rp __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator ()(_ArgTypes&&... __arg) {
319
- return __f_ (std::forward<_ArgTypes>(__arg)...);
320
- }
321
-
322
- # if _LIBCPP_HAS_RTTI
323
-
324
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
325
- const void * __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT {
326
- if (__ti == typeid (_Fp))
327
- return std::addressof (__f_.__target ());
328
- return nullptr ;
329
- }
330
-
331
- template <class _Fp , class _Alloc , class _Rp , class ... _ArgTypes>
332
- const std::type_info& __func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT {
333
- return typeid (_Fp);
334
- }
335
-
336
- # endif // _LIBCPP_HAS_RTTI
337
-
338
211
// __value_func creates a value-type from a __func.
339
212
340
213
template <class _Fp >
@@ -354,29 +227,19 @@ class __value_func<_Rp(_ArgTypes...)> {
354
227
public:
355
228
_LIBCPP_HIDE_FROM_ABI __value_func () _NOEXCEPT : __f_(nullptr ) {}
356
229
357
- template <class _Fp , class _Alloc >
358
- _LIBCPP_HIDE_FROM_ABI __value_func (_Fp&& __f, const _Alloc& __a) : __f_(nullptr ) {
359
- typedef allocator_traits<_Alloc> __alloc_traits;
360
- typedef __function::__func<_Fp, _Alloc, _Rp (_ArgTypes...)> _Fun;
361
- typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc;
230
+ template <class _Fp , __enable_if_t <!is_same<__decay_t <_Fp>, __value_func>::value, int > = 0 >
231
+ _LIBCPP_HIDE_FROM_ABI explicit __value_func (_Fp&& __f) : __f_(nullptr ) {
232
+ typedef __function::__func<_Fp, _Rp (_ArgTypes...)> _Fun;
362
233
363
234
if (__function::__not_null (__f)) {
364
- _FunAlloc __af (__a);
365
- if (sizeof (_Fun) <= sizeof (__buf_) && is_nothrow_copy_constructible<_Fp>::value &&
366
- is_nothrow_copy_constructible<_FunAlloc>::value) {
367
- __f_ = ::new ((void *)&__buf_) _Fun (std::move (__f), _Alloc (__af));
235
+ if (sizeof (_Fun) <= sizeof (__buf_) && is_nothrow_copy_constructible<_Fp>::value) {
236
+ __f_ = ::new (std::addressof (__buf_)) _Fun (std::move (__f));
368
237
} else {
369
- typedef __allocator_destructor<_FunAlloc> _Dp;
370
- unique_ptr<__func, _Dp> __hold (__af.allocate (1 ), _Dp (__af, 1 ));
371
- ::new ((void *)__hold.get ()) _Fun (std::move (__f), _Alloc (__a));
372
- __f_ = __hold.release ();
238
+ __f_ = new _Fun (std::move (__f));
373
239
}
374
240
}
375
241
}
376
242
377
- template <class _Fp , __enable_if_t <!is_same<__decay_t <_Fp>, __value_func>::value, int > = 0 >
378
- _LIBCPP_HIDE_FROM_ABI explicit __value_func (_Fp&& __f) : __value_func(std::forward<_Fp>(__f), allocator<_Fp>()) {}
379
-
380
243
_LIBCPP_HIDE_FROM_ABI __value_func (const __value_func& __f) {
381
244
if (__f.__f_ == nullptr )
382
245
__f_ = nullptr ;
@@ -544,7 +407,7 @@ struct __policy {
544
407
545
408
template <typename _Fun>
546
409
_LIBCPP_HIDE_FROM_ABI static void __large_destroy (void * __s) {
547
- _Fun::__destroy_and_delete ( static_cast <_Fun*>(__s) );
410
+ delete static_cast <_Fun*>(__s);
548
411
}
549
412
550
413
template <typename _Fun>
@@ -641,28 +504,6 @@ class __policy_func<_Rp(_ArgTypes...)> {
641
504
public:
642
505
_LIBCPP_HIDE_FROM_ABI __policy_func () : __policy_(__policy::__create_empty()) {}
643
506
644
- template <class _Fp , class _Alloc >
645
- _LIBCPP_HIDE_FROM_ABI __policy_func (_Fp&& __f, const _Alloc& __a) : __policy_(__policy::__create_empty()) {
646
- typedef __alloc_func<_Fp, _Alloc, _Rp (_ArgTypes...)> _Fun;
647
- typedef allocator_traits<_Alloc> __alloc_traits;
648
- typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc;
649
-
650
- if (__function::__not_null (__f)) {
651
- __invoker_ = __invoker::template __create<_Fun>();
652
- __policy_ = __policy::__create<_Fun>();
653
-
654
- _FunAlloc __af (__a);
655
- if (__use_small_storage<_Fun>()) {
656
- ::new ((void *)&__buf_.__small ) _Fun (std::move (__f), _Alloc (__af));
657
- } else {
658
- typedef __allocator_destructor<_FunAlloc> _Dp;
659
- unique_ptr<_Fun, _Dp> __hold (__af.allocate (1 ), _Dp (__af, 1 ));
660
- ::new ((void *)__hold.get ()) _Fun (std::move (__f), _Alloc (__af));
661
- __buf_.__large = __hold.release ();
662
- }
663
- }
664
- }
665
-
666
507
template <class _Fp , __enable_if_t <!is_same<__decay_t <_Fp>, __policy_func>::value, int > = 0 >
667
508
_LIBCPP_HIDE_FROM_ABI explicit __policy_func (_Fp&& __f) : __policy_(__policy::__create_empty()) {
668
509
typedef __default_alloc_func<_Fp, _Rp (_ArgTypes...)> _Fun;
@@ -673,9 +514,7 @@ class __policy_func<_Rp(_ArgTypes...)> {
673
514
if (__use_small_storage<_Fun>()) {
674
515
::new ((void *)&__buf_.__small ) _Fun (std::move (__f));
675
516
} else {
676
- unique_ptr<_Fun, __deallocating_deleter<_Fun>> __hold (std::__libcpp_allocate<_Fun>(__element_count (1 )));
677
- __buf_.__large = ::new ((void *)__hold.get ()) _Fun (std::move (__f));
678
- (void )__hold.release ();
517
+ __buf_.__large = ::new _Fun (std::move (__f));
679
518
}
680
519
}
681
520
}
@@ -954,7 +793,7 @@ function<_Rp(_ArgTypes...)>::function(_Fp __f) : __f_(std::move(__f)) {}
954
793
# if _LIBCPP_STD_VER <= 14
955
794
template <class _Rp , class ... _ArgTypes>
956
795
template <class _Fp , class _Alloc , class >
957
- function<_Rp(_ArgTypes...)>::function(allocator_arg_t , const _Alloc& __a , _Fp __f) : __f_(std::move(__f), __a ) {}
796
+ function<_Rp(_ArgTypes...)>::function(allocator_arg_t , const _Alloc&, _Fp __f) : __f_(std::move(__f)) {}
958
797
# endif
959
798
960
799
template <class _Rp , class ... _ArgTypes>
0 commit comments