]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/__functional_03
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / include / __functional_03
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_FUNCTIONAL_03
12 #define _LIBCPP_FUNCTIONAL_03
13
14 // manual variadic expansion for <functional>
15
16 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17 #pragma GCC system_header
18 #endif
19
20 namespace __function {
21
22 template<class _Fp> class __base;
23
24 template<class _Rp>
25 class __base<_Rp()>
26 {
27     __base(const __base&);
28     __base& operator=(const __base&);
29 public:
30     __base() {}
31     virtual ~__base() {}
32     virtual __base* __clone() const = 0;
33     virtual void __clone(__base*) const = 0;
34     virtual void destroy() = 0;
35     virtual void destroy_deallocate() = 0;
36     virtual _Rp operator()() = 0;
37 #ifndef _LIBCPP_NO_RTTI
38     virtual const void* target(const type_info&) const = 0;
39     virtual const std::type_info& target_type() const = 0;
40 #endif  // _LIBCPP_NO_RTTI
41 };
42
43 template<class _Rp, class _A0>
44 class __base<_Rp(_A0)>
45 {
46     __base(const __base&);
47     __base& operator=(const __base&);
48 public:
49     __base() {}
50     virtual ~__base() {}
51     virtual __base* __clone() const = 0;
52     virtual void __clone(__base*) const = 0;
53     virtual void destroy() = 0;
54     virtual void destroy_deallocate() = 0;
55     virtual _Rp operator()(_A0) = 0;
56 #ifndef _LIBCPP_NO_RTTI
57     virtual const void* target(const type_info&) const = 0;
58     virtual const std::type_info& target_type() const = 0;
59 #endif  // _LIBCPP_NO_RTTI
60 };
61
62 template<class _Rp, class _A0, class _A1>
63 class __base<_Rp(_A0, _A1)>
64 {
65     __base(const __base&);
66     __base& operator=(const __base&);
67 public:
68     __base() {}
69     virtual ~__base() {}
70     virtual __base* __clone() const = 0;
71     virtual void __clone(__base*) const = 0;
72     virtual void destroy() = 0;
73     virtual void destroy_deallocate() = 0;
74     virtual _Rp operator()(_A0, _A1) = 0;
75 #ifndef _LIBCPP_NO_RTTI
76     virtual const void* target(const type_info&) const = 0;
77     virtual const std::type_info& target_type() const = 0;
78 #endif  // _LIBCPP_NO_RTTI
79 };
80
81 template<class _Rp, class _A0, class _A1, class _A2>
82 class __base<_Rp(_A0, _A1, _A2)>
83 {
84     __base(const __base&);
85     __base& operator=(const __base&);
86 public:
87     __base() {}
88     virtual ~__base() {}
89     virtual __base* __clone() const = 0;
90     virtual void __clone(__base*) const = 0;
91     virtual void destroy() = 0;
92     virtual void destroy_deallocate() = 0;
93     virtual _Rp operator()(_A0, _A1, _A2) = 0;
94 #ifndef _LIBCPP_NO_RTTI
95     virtual const void* target(const type_info&) const = 0;
96     virtual const std::type_info& target_type() const = 0;
97 #endif  // _LIBCPP_NO_RTTI
98 };
99
100 template<class _FD, class _Alloc, class _FB> class __func;
101
102 template<class _Fp, class _Alloc, class _Rp>
103 class __func<_Fp, _Alloc, _Rp()>
104     : public  __base<_Rp()>
105 {
106     __compressed_pair<_Fp, _Alloc> __f_;
107 public:
108     explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
109     explicit __func(_Fp __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
110     virtual __base<_Rp()>* __clone() const;
111     virtual void __clone(__base<_Rp()>*) const;
112     virtual void destroy();
113     virtual void destroy_deallocate();
114     virtual _Rp operator()();
115 #ifndef _LIBCPP_NO_RTTI
116     virtual const void* target(const type_info&) const;
117     virtual const std::type_info& target_type() const;
118 #endif  // _LIBCPP_NO_RTTI
119 };
120
121 template<class _Fp, class _Alloc, class _Rp>
122 __base<_Rp()>*
123 __func<_Fp, _Alloc, _Rp()>::__clone() const
124 {
125     typedef allocator_traits<_Alloc> __alloc_traits;
126     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
127     _Ap __a(__f_.second());
128     typedef __allocator_destructor<_Ap> _Dp;
129     unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
130     ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
131     return __hold.release();
132 }
133
134 template<class _Fp, class _Alloc, class _Rp>
135 void
136 __func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const
137 {
138     ::new (__p) __func(__f_.first(), __f_.second());
139 }
140
141 template<class _Fp, class _Alloc, class _Rp>
142 void
143 __func<_Fp, _Alloc, _Rp()>::destroy()
144 {
145     __f_.~__compressed_pair<_Fp, _Alloc>();
146 }
147
148 template<class _Fp, class _Alloc, class _Rp>
149 void
150 __func<_Fp, _Alloc, _Rp()>::destroy_deallocate()
151 {
152     typedef allocator_traits<_Alloc> __alloc_traits;
153     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
154     _Ap __a(__f_.second());
155     __f_.~__compressed_pair<_Fp, _Alloc>();
156     __a.deallocate(this, 1);
157 }
158
159 template<class _Fp, class _Alloc, class _Rp>
160 _Rp
161 __func<_Fp, _Alloc, _Rp()>::operator()()
162 {
163     typedef __invoke_void_return_wrapper<_Rp> _Invoker;
164     return _Invoker::__call(__f_.first());
165 }
166
167 #ifndef _LIBCPP_NO_RTTI
168
169 template<class _Fp, class _Alloc, class _Rp>
170 const void*
171 __func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const
172 {
173     if (__ti == typeid(_Fp))
174         return &__f_.first();
175     return (const void*)0;
176 }
177
178 template<class _Fp, class _Alloc, class _Rp>
179 const std::type_info&
180 __func<_Fp, _Alloc, _Rp()>::target_type() const
181 {
182     return typeid(_Fp);
183 }
184
185 #endif  // _LIBCPP_NO_RTTI
186
187 template<class _Fp, class _Alloc, class _Rp, class _A0>
188 class __func<_Fp, _Alloc, _Rp(_A0)>
189     : public  __base<_Rp(_A0)>
190 {
191     __compressed_pair<_Fp, _Alloc> __f_;
192 public:
193     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
194     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
195         : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
196     virtual __base<_Rp(_A0)>* __clone() const;
197     virtual void __clone(__base<_Rp(_A0)>*) const;
198     virtual void destroy();
199     virtual void destroy_deallocate();
200     virtual _Rp operator()(_A0);
201 #ifndef _LIBCPP_NO_RTTI
202     virtual const void* target(const type_info&) const;
203     virtual const std::type_info& target_type() const;
204 #endif  // _LIBCPP_NO_RTTI
205 };
206
207 template<class _Fp, class _Alloc, class _Rp, class _A0>
208 __base<_Rp(_A0)>*
209 __func<_Fp, _Alloc, _Rp(_A0)>::__clone() const
210 {
211     typedef allocator_traits<_Alloc> __alloc_traits;
212     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
213     _Ap __a(__f_.second());
214     typedef __allocator_destructor<_Ap> _Dp;
215     unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
216     ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
217     return __hold.release();
218 }
219
220 template<class _Fp, class _Alloc, class _Rp, class _A0>
221 void
222 __func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const
223 {
224     ::new (__p) __func(__f_.first(), __f_.second());
225 }
226
227 template<class _Fp, class _Alloc, class _Rp, class _A0>
228 void
229 __func<_Fp, _Alloc, _Rp(_A0)>::destroy()
230 {
231     __f_.~__compressed_pair<_Fp, _Alloc>();
232 }
233
234 template<class _Fp, class _Alloc, class _Rp, class _A0>
235 void
236 __func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate()
237 {
238     typedef allocator_traits<_Alloc> __alloc_traits;
239     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
240     _Ap __a(__f_.second());
241     __f_.~__compressed_pair<_Fp, _Alloc>();
242     __a.deallocate(this, 1);
243 }
244
245 template<class _Fp, class _Alloc, class _Rp, class _A0>
246 _Rp
247 __func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0)
248 {
249     typedef __invoke_void_return_wrapper<_Rp> _Invoker;
250     return _Invoker::__call(__f_.first(), __a0);
251 }
252
253 #ifndef _LIBCPP_NO_RTTI
254
255 template<class _Fp, class _Alloc, class _Rp, class _A0>
256 const void*
257 __func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const
258 {
259     if (__ti == typeid(_Fp))
260         return &__f_.first();
261     return (const void*)0;
262 }
263
264 template<class _Fp, class _Alloc, class _Rp, class _A0>
265 const std::type_info&
266 __func<_Fp, _Alloc, _Rp(_A0)>::target_type() const
267 {
268     return typeid(_Fp);
269 }
270
271 #endif  // _LIBCPP_NO_RTTI
272
273 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
274 class __func<_Fp, _Alloc, _Rp(_A0, _A1)>
275     : public  __base<_Rp(_A0, _A1)>
276 {
277     __compressed_pair<_Fp, _Alloc> __f_;
278 public:
279     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
280     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
281         : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
282     virtual __base<_Rp(_A0, _A1)>* __clone() const;
283     virtual void __clone(__base<_Rp(_A0, _A1)>*) const;
284     virtual void destroy();
285     virtual void destroy_deallocate();
286     virtual _Rp operator()(_A0, _A1);
287 #ifndef _LIBCPP_NO_RTTI
288     virtual const void* target(const type_info&) const;
289     virtual const std::type_info& target_type() const;
290 #endif  // _LIBCPP_NO_RTTI
291 };
292
293 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
294 __base<_Rp(_A0, _A1)>*
295 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const
296 {
297     typedef allocator_traits<_Alloc> __alloc_traits;
298     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
299     _Ap __a(__f_.second());
300     typedef __allocator_destructor<_Ap> _Dp;
301     unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
302     ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
303     return __hold.release();
304 }
305
306 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
307 void
308 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const
309 {
310     ::new (__p) __func(__f_.first(), __f_.second());
311 }
312
313 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
314 void
315 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy()
316 {
317     __f_.~__compressed_pair<_Fp, _Alloc>();
318 }
319
320 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
321 void
322 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate()
323 {
324     typedef allocator_traits<_Alloc> __alloc_traits;
325     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
326     _Ap __a(__f_.second());
327     __f_.~__compressed_pair<_Fp, _Alloc>();
328     __a.deallocate(this, 1);
329 }
330
331 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
332 _Rp
333 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1)
334 {
335     typedef __invoke_void_return_wrapper<_Rp> _Invoker;
336     return _Invoker::__call(__f_.first(), __a0, __a1);
337 }
338
339 #ifndef _LIBCPP_NO_RTTI
340
341 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
342 const void*
343 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const
344 {
345     if (__ti == typeid(_Fp))
346         return &__f_.first();
347     return (const void*)0;
348 }
349
350 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
351 const std::type_info&
352 __func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const
353 {
354     return typeid(_Fp);
355 }
356
357 #endif  // _LIBCPP_NO_RTTI
358
359 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
360 class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>
361     : public  __base<_Rp(_A0, _A1, _A2)>
362 {
363     __compressed_pair<_Fp, _Alloc> __f_;
364 public:
365     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
366     _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
367         : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
368     virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const;
369     virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const;
370     virtual void destroy();
371     virtual void destroy_deallocate();
372     virtual _Rp operator()(_A0, _A1, _A2);
373 #ifndef _LIBCPP_NO_RTTI
374     virtual const void* target(const type_info&) const;
375     virtual const std::type_info& target_type() const;
376 #endif  // _LIBCPP_NO_RTTI
377 };
378
379 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
380 __base<_Rp(_A0, _A1, _A2)>*
381 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone() const
382 {
383     typedef allocator_traits<_Alloc> __alloc_traits;
384     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
385     _Ap __a(__f_.second());
386     typedef __allocator_destructor<_Ap> _Dp;
387     unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
388     ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
389     return __hold.release();
390 }
391
392 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
393 void
394 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const
395 {
396     ::new (__p) __func(__f_.first(), __f_.second());
397 }
398
399 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
400 void
401 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy()
402 {
403     __f_.~__compressed_pair<_Fp, _Alloc>();
404 }
405
406 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
407 void
408 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate()
409 {
410     typedef allocator_traits<_Alloc> __alloc_traits;
411     typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
412     _Ap __a(__f_.second());
413     __f_.~__compressed_pair<_Fp, _Alloc>();
414     __a.deallocate(this, 1);
415 }
416
417 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
418 _Rp
419 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2)
420 {
421     typedef __invoke_void_return_wrapper<_Rp> _Invoker;
422     return _Invoker::__call(__f_.first(), __a0, __a1, __a2);
423 }
424
425 #ifndef _LIBCPP_NO_RTTI
426
427 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
428 const void*
429 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const
430 {
431     if (__ti == typeid(_Fp))
432         return &__f_.first();
433     return (const void*)0;
434 }
435
436 template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
437 const std::type_info&
438 __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const
439 {
440     return typeid(_Fp);
441 }
442
443 #endif  // _LIBCPP_NO_RTTI
444
445 }  // __function
446
447 template<class _Rp>
448 class _LIBCPP_TYPE_VIS_ONLY function<_Rp()>
449 {
450     typedef __function::__base<_Rp()> __base;
451     aligned_storage<3*sizeof(void*)>::type __buf_;
452     __base* __f_;
453
454 public:
455     typedef _Rp result_type;
456
457     // 20.7.16.2.1, construct/copy/destroy:
458     _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
459     _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
460     function(const function&);
461     template<class _Fp>
462       function(_Fp,
463                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
464
465     template<class _Alloc>
466       _LIBCPP_INLINE_VISIBILITY
467       function(allocator_arg_t, const _Alloc&) : __f_(0) {}
468     template<class _Alloc>
469       _LIBCPP_INLINE_VISIBILITY
470       function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
471     template<class _Alloc>
472       function(allocator_arg_t, const _Alloc&, const function&);
473     template<class _Fp, class _Alloc>
474       function(allocator_arg_t, const _Alloc& __a, _Fp __f,
475                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
476
477     function& operator=(const function&);
478     function& operator=(nullptr_t);
479     template<class _Fp>
480       typename enable_if
481       <
482         !is_integral<_Fp>::value,
483         function&
484       >::type
485       operator=(_Fp);
486
487     ~function();
488
489     // 20.7.16.2.2, function modifiers:
490     void swap(function&);
491     template<class _Fp, class _Alloc>
492       _LIBCPP_INLINE_VISIBILITY
493       void assign(_Fp __f, const _Alloc& __a)
494         {function(allocator_arg, __a, __f).swap(*this);}
495
496     // 20.7.16.2.3, function capacity:
497     _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
498
499 private:
500     // deleted overloads close possible hole in the type system
501     template<class _R2>
502       bool operator==(const function<_R2()>&) const;// = delete;
503     template<class _R2>
504       bool operator!=(const function<_R2()>&) const;// = delete;
505 public:
506     // 20.7.16.2.4, function invocation:
507     _Rp operator()() const;
508
509 #ifndef _LIBCPP_NO_RTTI
510     // 20.7.16.2.5, function target access:
511     const std::type_info& target_type() const;
512     template <typename _Tp> _Tp* target();
513     template <typename _Tp> const _Tp* target() const;
514 #endif  // _LIBCPP_NO_RTTI
515 };
516
517 template<class _Rp>
518 function<_Rp()>::function(const function& __f)
519 {
520     if (__f.__f_ == 0)
521         __f_ = 0;
522     else if (__f.__f_ == (const __base*)&__f.__buf_)
523     {
524         __f_ = (__base*)&__buf_;
525         __f.__f_->__clone(__f_);
526     }
527     else
528         __f_ = __f.__f_->__clone();
529 }
530
531 template<class _Rp>
532 template<class _Alloc>
533 function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f)
534 {
535     if (__f.__f_ == 0)
536         __f_ = 0;
537     else if (__f.__f_ == (const __base*)&__f.__buf_)
538     {
539         __f_ = (__base*)&__buf_;
540         __f.__f_->__clone(__f_);
541     }
542     else
543         __f_ = __f.__f_->__clone();
544 }
545
546 template<class _Rp>
547 template <class _Fp>
548 function<_Rp()>::function(_Fp __f,
549                                      typename enable_if<!is_integral<_Fp>::value>::type*)
550     : __f_(0)
551 {
552     if (__function::__not_null(__f))
553     {
554         typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
555         if (sizeof(_FF) <= sizeof(__buf_))
556         {
557             __f_ = (__base*)&__buf_;
558             ::new (__f_) _FF(__f);
559         }
560         else
561         {
562             typedef allocator<_FF> _Ap;
563             _Ap __a;
564             typedef __allocator_destructor<_Ap> _Dp;
565             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
566             ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
567             __f_ = __hold.release();
568         }
569     }
570 }
571
572 template<class _Rp>
573 template <class _Fp, class _Alloc>
574 function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
575                                      typename enable_if<!is_integral<_Fp>::value>::type*)
576     : __f_(0)
577 {
578     typedef allocator_traits<_Alloc> __alloc_traits;
579     if (__function::__not_null(__f))
580     {
581         typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
582         if (sizeof(_FF) <= sizeof(__buf_))
583         {
584             __f_ = (__base*)&__buf_;
585             ::new (__f_) _FF(__f, __a0);
586         }
587         else
588         {
589             typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
590             _Ap __a(__a0);
591             typedef __allocator_destructor<_Ap> _Dp;
592             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
593             ::new (__hold.get()) _FF(__f, _Alloc(__a));
594             __f_ = __hold.release();
595         }
596     }
597 }
598
599 template<class _Rp>
600 function<_Rp()>&
601 function<_Rp()>::operator=(const function& __f)
602 {
603     function(__f).swap(*this);
604     return *this;
605 }
606
607 template<class _Rp>
608 function<_Rp()>&
609 function<_Rp()>::operator=(nullptr_t)
610 {
611     if (__f_ == (__base*)&__buf_)
612         __f_->destroy();
613     else if (__f_)
614         __f_->destroy_deallocate();
615     __f_ = 0;
616     return *this;
617 }
618
619 template<class _Rp>
620 template <class _Fp>
621 typename enable_if
622 <
623     !is_integral<_Fp>::value,
624     function<_Rp()>&
625 >::type
626 function<_Rp()>::operator=(_Fp __f)
627 {
628     function(_VSTD::move(__f)).swap(*this);
629     return *this;
630 }
631
632 template<class _Rp>
633 function<_Rp()>::~function()
634 {
635     if (__f_ == (__base*)&__buf_)
636         __f_->destroy();
637     else if (__f_)
638         __f_->destroy_deallocate();
639 }
640
641 template<class _Rp>
642 void
643 function<_Rp()>::swap(function& __f)
644 {
645     if (_VSTD::addressof(__f) == this)
646       return;
647     if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
648     {
649         typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
650         __base* __t = (__base*)&__tempbuf;
651         __f_->__clone(__t);
652         __f_->destroy();
653         __f_ = 0;
654         __f.__f_->__clone((__base*)&__buf_);
655         __f.__f_->destroy();
656         __f.__f_ = 0;
657         __f_ = (__base*)&__buf_;
658         __t->__clone((__base*)&__f.__buf_);
659         __t->destroy();
660         __f.__f_ = (__base*)&__f.__buf_;
661     }
662     else if (__f_ == (__base*)&__buf_)
663     {
664         __f_->__clone((__base*)&__f.__buf_);
665         __f_->destroy();
666         __f_ = __f.__f_;
667         __f.__f_ = (__base*)&__f.__buf_;
668     }
669     else if (__f.__f_ == (__base*)&__f.__buf_)
670     {
671         __f.__f_->__clone((__base*)&__buf_);
672         __f.__f_->destroy();
673         __f.__f_ = __f_;
674         __f_ = (__base*)&__buf_;
675     }
676     else
677         _VSTD::swap(__f_, __f.__f_);
678 }
679
680 template<class _Rp>
681 _Rp
682 function<_Rp()>::operator()() const
683 {
684     if (__f_ == 0)
685         __throw_bad_function_call();
686     return (*__f_)();
687 }
688
689 #ifndef _LIBCPP_NO_RTTI
690
691 template<class _Rp>
692 const std::type_info&
693 function<_Rp()>::target_type() const
694 {
695     if (__f_ == 0)
696         return typeid(void);
697     return __f_->target_type();
698 }
699
700 template<class _Rp>
701 template <typename _Tp>
702 _Tp*
703 function<_Rp()>::target()
704 {
705     if (__f_ == 0)
706         return (_Tp*)0;
707     return (_Tp*)__f_->target(typeid(_Tp));
708 }
709
710 template<class _Rp>
711 template <typename _Tp>
712 const _Tp*
713 function<_Rp()>::target() const
714 {
715     if (__f_ == 0)
716         return (const _Tp*)0;
717     return (const _Tp*)__f_->target(typeid(_Tp));
718 }
719
720 #endif  // _LIBCPP_NO_RTTI
721
722 template<class _Rp, class _A0>
723 class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0)>
724     : public unary_function<_A0, _Rp>
725 {
726     typedef __function::__base<_Rp(_A0)> __base;
727     aligned_storage<3*sizeof(void*)>::type __buf_;
728     __base* __f_;
729
730 public:
731     typedef _Rp result_type;
732
733     // 20.7.16.2.1, construct/copy/destroy:
734     _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
735     _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
736     function(const function&);
737     template<class _Fp>
738       function(_Fp,
739                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
740
741     template<class _Alloc>
742       _LIBCPP_INLINE_VISIBILITY
743       function(allocator_arg_t, const _Alloc&) : __f_(0) {}
744     template<class _Alloc>
745       _LIBCPP_INLINE_VISIBILITY
746       function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
747     template<class _Alloc>
748       function(allocator_arg_t, const _Alloc&, const function&);
749     template<class _Fp, class _Alloc>
750       function(allocator_arg_t, const _Alloc& __a, _Fp __f,
751                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
752
753     function& operator=(const function&);
754     function& operator=(nullptr_t);
755     template<class _Fp>
756       typename enable_if
757       <
758         !is_integral<_Fp>::value,
759         function&
760       >::type
761       operator=(_Fp);
762
763     ~function();
764
765     // 20.7.16.2.2, function modifiers:
766     void swap(function&);
767     template<class _Fp, class _Alloc>
768       _LIBCPP_INLINE_VISIBILITY
769       void assign(_Fp __f, const _Alloc& __a)
770         {function(allocator_arg, __a, __f).swap(*this);}
771
772     // 20.7.16.2.3, function capacity:
773     _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
774
775 private:
776     // deleted overloads close possible hole in the type system
777     template<class _R2, class _B0>
778       bool operator==(const function<_R2(_B0)>&) const;// = delete;
779     template<class _R2, class _B0>
780       bool operator!=(const function<_R2(_B0)>&) const;// = delete;
781 public:
782     // 20.7.16.2.4, function invocation:
783     _Rp operator()(_A0) const;
784
785 #ifndef _LIBCPP_NO_RTTI
786     // 20.7.16.2.5, function target access:
787     const std::type_info& target_type() const;
788     template <typename _Tp> _Tp* target();
789     template <typename _Tp> const _Tp* target() const;
790 #endif  // _LIBCPP_NO_RTTI
791 };
792
793 template<class _Rp, class _A0>
794 function<_Rp(_A0)>::function(const function& __f)
795 {
796     if (__f.__f_ == 0)
797         __f_ = 0;
798     else if (__f.__f_ == (const __base*)&__f.__buf_)
799     {
800         __f_ = (__base*)&__buf_;
801         __f.__f_->__clone(__f_);
802     }
803     else
804         __f_ = __f.__f_->__clone();
805 }
806
807 template<class _Rp, class _A0>
808 template<class _Alloc>
809 function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f)
810 {
811     if (__f.__f_ == 0)
812         __f_ = 0;
813     else if (__f.__f_ == (const __base*)&__f.__buf_)
814     {
815         __f_ = (__base*)&__buf_;
816         __f.__f_->__clone(__f_);
817     }
818     else
819         __f_ = __f.__f_->__clone();
820 }
821
822 template<class _Rp, class _A0>
823 template <class _Fp>
824 function<_Rp(_A0)>::function(_Fp __f,
825                                      typename enable_if<!is_integral<_Fp>::value>::type*)
826     : __f_(0)
827 {
828     if (__function::__not_null(__f))
829     {
830         typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
831         if (sizeof(_FF) <= sizeof(__buf_))
832         {
833             __f_ = (__base*)&__buf_;
834             ::new (__f_) _FF(__f);
835         }
836         else
837         {
838             typedef allocator<_FF> _Ap;
839             _Ap __a;
840             typedef __allocator_destructor<_Ap> _Dp;
841             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
842             ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
843             __f_ = __hold.release();
844         }
845     }
846 }
847
848 template<class _Rp, class _A0>
849 template <class _Fp, class _Alloc>
850 function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
851                                      typename enable_if<!is_integral<_Fp>::value>::type*)
852     : __f_(0)
853 {
854     typedef allocator_traits<_Alloc> __alloc_traits;
855     if (__function::__not_null(__f))
856     {
857         typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
858         if (sizeof(_FF) <= sizeof(__buf_))
859         {
860             __f_ = (__base*)&__buf_;
861             ::new (__f_) _FF(__f, __a0);
862         }
863         else
864         {
865             typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
866             _Ap __a(__a0);
867             typedef __allocator_destructor<_Ap> _Dp;
868             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
869             ::new (__hold.get()) _FF(__f, _Alloc(__a));
870             __f_ = __hold.release();
871         }
872     }
873 }
874
875 template<class _Rp, class _A0>
876 function<_Rp(_A0)>&
877 function<_Rp(_A0)>::operator=(const function& __f)
878 {
879     function(__f).swap(*this);
880     return *this;
881 }
882
883 template<class _Rp, class _A0>
884 function<_Rp(_A0)>&
885 function<_Rp(_A0)>::operator=(nullptr_t)
886 {
887     if (__f_ == (__base*)&__buf_)
888         __f_->destroy();
889     else if (__f_)
890         __f_->destroy_deallocate();
891     __f_ = 0;
892     return *this;
893 }
894
895 template<class _Rp, class _A0>
896 template <class _Fp>
897 typename enable_if
898 <
899     !is_integral<_Fp>::value,
900     function<_Rp(_A0)>&
901 >::type
902 function<_Rp(_A0)>::operator=(_Fp __f)
903 {
904     function(_VSTD::move(__f)).swap(*this);
905     return *this;
906 }
907
908 template<class _Rp, class _A0>
909 function<_Rp(_A0)>::~function()
910 {
911     if (__f_ == (__base*)&__buf_)
912         __f_->destroy();
913     else if (__f_)
914         __f_->destroy_deallocate();
915 }
916
917 template<class _Rp, class _A0>
918 void
919 function<_Rp(_A0)>::swap(function& __f)
920 {
921     if (_VSTD::addressof(__f) == this)
922       return;
923     if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
924     {
925         typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
926         __base* __t = (__base*)&__tempbuf;
927         __f_->__clone(__t);
928         __f_->destroy();
929         __f_ = 0;
930         __f.__f_->__clone((__base*)&__buf_);
931         __f.__f_->destroy();
932         __f.__f_ = 0;
933         __f_ = (__base*)&__buf_;
934         __t->__clone((__base*)&__f.__buf_);
935         __t->destroy();
936         __f.__f_ = (__base*)&__f.__buf_;
937     }
938     else if (__f_ == (__base*)&__buf_)
939     {
940         __f_->__clone((__base*)&__f.__buf_);
941         __f_->destroy();
942         __f_ = __f.__f_;
943         __f.__f_ = (__base*)&__f.__buf_;
944     }
945     else if (__f.__f_ == (__base*)&__f.__buf_)
946     {
947         __f.__f_->__clone((__base*)&__buf_);
948         __f.__f_->destroy();
949         __f.__f_ = __f_;
950         __f_ = (__base*)&__buf_;
951     }
952     else
953         _VSTD::swap(__f_, __f.__f_);
954 }
955
956 template<class _Rp, class _A0>
957 _Rp
958 function<_Rp(_A0)>::operator()(_A0 __a0) const
959 {
960     if (__f_ == 0)
961         __throw_bad_function_call();
962     return (*__f_)(__a0);
963 }
964
965 #ifndef _LIBCPP_NO_RTTI
966
967 template<class _Rp, class _A0>
968 const std::type_info&
969 function<_Rp(_A0)>::target_type() const
970 {
971     if (__f_ == 0)
972         return typeid(void);
973     return __f_->target_type();
974 }
975
976 template<class _Rp, class _A0>
977 template <typename _Tp>
978 _Tp*
979 function<_Rp(_A0)>::target()
980 {
981     if (__f_ == 0)
982         return (_Tp*)0;
983     return (_Tp*)__f_->target(typeid(_Tp));
984 }
985
986 template<class _Rp, class _A0>
987 template <typename _Tp>
988 const _Tp*
989 function<_Rp(_A0)>::target() const
990 {
991     if (__f_ == 0)
992         return (const _Tp*)0;
993     return (const _Tp*)__f_->target(typeid(_Tp));
994 }
995
996 #endif  // _LIBCPP_NO_RTTI
997
998 template<class _Rp, class _A0, class _A1>
999 class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1)>
1000     : public binary_function<_A0, _A1, _Rp>
1001 {
1002     typedef __function::__base<_Rp(_A0, _A1)> __base;
1003     aligned_storage<3*sizeof(void*)>::type __buf_;
1004     __base* __f_;
1005
1006 public:
1007     typedef _Rp result_type;
1008
1009     // 20.7.16.2.1, construct/copy/destroy:
1010     _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
1011     _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
1012     function(const function&);
1013     template<class _Fp>
1014       function(_Fp,
1015                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
1016
1017     template<class _Alloc>
1018       _LIBCPP_INLINE_VISIBILITY
1019       function(allocator_arg_t, const _Alloc&) : __f_(0) {}
1020     template<class _Alloc>
1021       _LIBCPP_INLINE_VISIBILITY
1022       function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
1023     template<class _Alloc>
1024       function(allocator_arg_t, const _Alloc&, const function&);
1025     template<class _Fp, class _Alloc>
1026       function(allocator_arg_t, const _Alloc& __a, _Fp __f,
1027                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
1028
1029     function& operator=(const function&);
1030     function& operator=(nullptr_t);
1031     template<class _Fp>
1032       typename enable_if
1033       <
1034         !is_integral<_Fp>::value,
1035         function&
1036       >::type
1037       operator=(_Fp);
1038
1039     ~function();
1040
1041     // 20.7.16.2.2, function modifiers:
1042     void swap(function&);
1043     template<class _Fp, class _Alloc>
1044       _LIBCPP_INLINE_VISIBILITY
1045       void assign(_Fp __f, const _Alloc& __a)
1046         {function(allocator_arg, __a, __f).swap(*this);}
1047
1048     // 20.7.16.2.3, function capacity:
1049     operator bool() const {return __f_;}
1050
1051 private:
1052     // deleted overloads close possible hole in the type system
1053     template<class _R2, class _B0, class _B1>
1054       bool operator==(const function<_R2(_B0, _B1)>&) const;// = delete;
1055     template<class _R2, class _B0, class _B1>
1056       bool operator!=(const function<_R2(_B0, _B1)>&) const;// = delete;
1057 public:
1058     // 20.7.16.2.4, function invocation:
1059     _Rp operator()(_A0, _A1) const;
1060
1061 #ifndef _LIBCPP_NO_RTTI
1062     // 20.7.16.2.5, function target access:
1063     const std::type_info& target_type() const;
1064     template <typename _Tp> _Tp* target();
1065     template <typename _Tp> const _Tp* target() const;
1066 #endif  // _LIBCPP_NO_RTTI
1067 };
1068
1069 template<class _Rp, class _A0, class _A1>
1070 function<_Rp(_A0, _A1)>::function(const function& __f)
1071 {
1072     if (__f.__f_ == 0)
1073         __f_ = 0;
1074     else if (__f.__f_ == (const __base*)&__f.__buf_)
1075     {
1076         __f_ = (__base*)&__buf_;
1077         __f.__f_->__clone(__f_);
1078     }
1079     else
1080         __f_ = __f.__f_->__clone();
1081 }
1082
1083 template<class _Rp, class _A0, class _A1>
1084 template<class _Alloc>
1085 function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f)
1086 {
1087     if (__f.__f_ == 0)
1088         __f_ = 0;
1089     else if (__f.__f_ == (const __base*)&__f.__buf_)
1090     {
1091         __f_ = (__base*)&__buf_;
1092         __f.__f_->__clone(__f_);
1093     }
1094     else
1095         __f_ = __f.__f_->__clone();
1096 }
1097
1098 template<class _Rp, class _A0, class _A1>
1099 template <class _Fp>
1100 function<_Rp(_A0, _A1)>::function(_Fp __f,
1101                                  typename enable_if<!is_integral<_Fp>::value>::type*)
1102     : __f_(0)
1103 {
1104     if (__function::__not_null(__f))
1105     {
1106         typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
1107         if (sizeof(_FF) <= sizeof(__buf_))
1108         {
1109             __f_ = (__base*)&__buf_;
1110             ::new (__f_) _FF(__f);
1111         }
1112         else
1113         {
1114             typedef allocator<_FF> _Ap;
1115             _Ap __a;
1116             typedef __allocator_destructor<_Ap> _Dp;
1117             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1118             ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
1119             __f_ = __hold.release();
1120         }
1121     }
1122 }
1123
1124 template<class _Rp, class _A0, class _A1>
1125 template <class _Fp, class _Alloc>
1126 function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
1127                                  typename enable_if<!is_integral<_Fp>::value>::type*)
1128     : __f_(0)
1129 {
1130     typedef allocator_traits<_Alloc> __alloc_traits;
1131     if (__function::__not_null(__f))
1132     {
1133         typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
1134         if (sizeof(_FF) <= sizeof(__buf_))
1135         {
1136             __f_ = (__base*)&__buf_;
1137             ::new (__f_) _FF(__f, __a0);
1138         }
1139         else
1140         {
1141             typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
1142             _Ap __a(__a0);
1143             typedef __allocator_destructor<_Ap> _Dp;
1144             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1145             ::new (__hold.get()) _FF(__f, _Alloc(__a));
1146             __f_ = __hold.release();
1147         }
1148     }
1149 }
1150
1151 template<class _Rp, class _A0, class _A1>
1152 function<_Rp(_A0, _A1)>&
1153 function<_Rp(_A0, _A1)>::operator=(const function& __f)
1154 {
1155     function(__f).swap(*this);
1156     return *this;
1157 }
1158
1159 template<class _Rp, class _A0, class _A1>
1160 function<_Rp(_A0, _A1)>&
1161 function<_Rp(_A0, _A1)>::operator=(nullptr_t)
1162 {
1163     if (__f_ == (__base*)&__buf_)
1164         __f_->destroy();
1165     else if (__f_)
1166         __f_->destroy_deallocate();
1167     __f_ = 0;
1168     return *this;
1169 }
1170
1171 template<class _Rp, class _A0, class _A1>
1172 template <class _Fp>
1173 typename enable_if
1174 <
1175     !is_integral<_Fp>::value,
1176     function<_Rp(_A0, _A1)>&
1177 >::type
1178 function<_Rp(_A0, _A1)>::operator=(_Fp __f)
1179 {
1180     function(_VSTD::move(__f)).swap(*this);
1181     return *this;
1182 }
1183
1184 template<class _Rp, class _A0, class _A1>
1185 function<_Rp(_A0, _A1)>::~function()
1186 {
1187     if (__f_ == (__base*)&__buf_)
1188         __f_->destroy();
1189     else if (__f_)
1190         __f_->destroy_deallocate();
1191 }
1192
1193 template<class _Rp, class _A0, class _A1>
1194 void
1195 function<_Rp(_A0, _A1)>::swap(function& __f)
1196 {
1197     if (_VSTD::addressof(__f) == this)
1198       return;
1199     if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1200     {
1201         typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1202         __base* __t = (__base*)&__tempbuf;
1203         __f_->__clone(__t);
1204         __f_->destroy();
1205         __f_ = 0;
1206         __f.__f_->__clone((__base*)&__buf_);
1207         __f.__f_->destroy();
1208         __f.__f_ = 0;
1209         __f_ = (__base*)&__buf_;
1210         __t->__clone((__base*)&__f.__buf_);
1211         __t->destroy();
1212         __f.__f_ = (__base*)&__f.__buf_;
1213     }
1214     else if (__f_ == (__base*)&__buf_)
1215     {
1216         __f_->__clone((__base*)&__f.__buf_);
1217         __f_->destroy();
1218         __f_ = __f.__f_;
1219         __f.__f_ = (__base*)&__f.__buf_;
1220     }
1221     else if (__f.__f_ == (__base*)&__f.__buf_)
1222     {
1223         __f.__f_->__clone((__base*)&__buf_);
1224         __f.__f_->destroy();
1225         __f.__f_ = __f_;
1226         __f_ = (__base*)&__buf_;
1227     }
1228     else
1229         _VSTD::swap(__f_, __f.__f_);
1230 }
1231
1232 template<class _Rp, class _A0, class _A1>
1233 _Rp
1234 function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const
1235 {
1236     if (__f_ == 0)
1237         __throw_bad_function_call();
1238     return (*__f_)(__a0, __a1);
1239 }
1240
1241 #ifndef _LIBCPP_NO_RTTI
1242
1243 template<class _Rp, class _A0, class _A1>
1244 const std::type_info&
1245 function<_Rp(_A0, _A1)>::target_type() const
1246 {
1247     if (__f_ == 0)
1248         return typeid(void);
1249     return __f_->target_type();
1250 }
1251
1252 template<class _Rp, class _A0, class _A1>
1253 template <typename _Tp>
1254 _Tp*
1255 function<_Rp(_A0, _A1)>::target()
1256 {
1257     if (__f_ == 0)
1258         return (_Tp*)0;
1259     return (_Tp*)__f_->target(typeid(_Tp));
1260 }
1261
1262 template<class _Rp, class _A0, class _A1>
1263 template <typename _Tp>
1264 const _Tp*
1265 function<_Rp(_A0, _A1)>::target() const
1266 {
1267     if (__f_ == 0)
1268         return (const _Tp*)0;
1269     return (const _Tp*)__f_->target(typeid(_Tp));
1270 }
1271
1272 #endif  // _LIBCPP_NO_RTTI
1273
1274 template<class _Rp, class _A0, class _A1, class _A2>
1275 class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1, _A2)>
1276 {
1277     typedef __function::__base<_Rp(_A0, _A1, _A2)> __base;
1278     aligned_storage<3*sizeof(void*)>::type __buf_;
1279     __base* __f_;
1280
1281 public:
1282     typedef _Rp result_type;
1283
1284     // 20.7.16.2.1, construct/copy/destroy:
1285     _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
1286     _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
1287     function(const function&);
1288     template<class _Fp>
1289       function(_Fp,
1290                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
1291
1292     template<class _Alloc>
1293       _LIBCPP_INLINE_VISIBILITY
1294       function(allocator_arg_t, const _Alloc&) : __f_(0) {}
1295     template<class _Alloc>
1296       _LIBCPP_INLINE_VISIBILITY
1297       function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
1298     template<class _Alloc>
1299       function(allocator_arg_t, const _Alloc&, const function&);
1300     template<class _Fp, class _Alloc>
1301       function(allocator_arg_t, const _Alloc& __a, _Fp __f,
1302                typename enable_if<!is_integral<_Fp>::value>::type* = 0);
1303
1304     function& operator=(const function&);
1305     function& operator=(nullptr_t);
1306     template<class _Fp>
1307       typename enable_if
1308       <
1309         !is_integral<_Fp>::value,
1310         function&
1311       >::type
1312       operator=(_Fp);
1313
1314     ~function();
1315
1316     // 20.7.16.2.2, function modifiers:
1317     void swap(function&);
1318     template<class _Fp, class _Alloc>
1319       _LIBCPP_INLINE_VISIBILITY
1320       void assign(_Fp __f, const _Alloc& __a)
1321         {function(allocator_arg, __a, __f).swap(*this);}
1322
1323     // 20.7.16.2.3, function capacity:
1324     _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
1325
1326 private:
1327     // deleted overloads close possible hole in the type system
1328     template<class _R2, class _B0, class _B1, class _B2>
1329       bool operator==(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
1330     template<class _R2, class _B0, class _B1, class _B2>
1331       bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
1332 public:
1333     // 20.7.16.2.4, function invocation:
1334     _Rp operator()(_A0, _A1, _A2) const;
1335
1336 #ifndef _LIBCPP_NO_RTTI
1337     // 20.7.16.2.5, function target access:
1338     const std::type_info& target_type() const;
1339     template <typename _Tp> _Tp* target();
1340     template <typename _Tp> const _Tp* target() const;
1341 #endif  // _LIBCPP_NO_RTTI
1342 };
1343
1344 template<class _Rp, class _A0, class _A1, class _A2>
1345 function<_Rp(_A0, _A1, _A2)>::function(const function& __f)
1346 {
1347     if (__f.__f_ == 0)
1348         __f_ = 0;
1349     else if (__f.__f_ == (const __base*)&__f.__buf_)
1350     {
1351         __f_ = (__base*)&__buf_;
1352         __f.__f_->__clone(__f_);
1353     }
1354     else
1355         __f_ = __f.__f_->__clone();
1356 }
1357
1358 template<class _Rp, class _A0, class _A1, class _A2>
1359 template<class _Alloc>
1360 function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&,
1361                                       const function& __f)
1362 {
1363     if (__f.__f_ == 0)
1364         __f_ = 0;
1365     else if (__f.__f_ == (const __base*)&__f.__buf_)
1366     {
1367         __f_ = (__base*)&__buf_;
1368         __f.__f_->__clone(__f_);
1369     }
1370     else
1371         __f_ = __f.__f_->__clone();
1372 }
1373
1374 template<class _Rp, class _A0, class _A1, class _A2>
1375 template <class _Fp>
1376 function<_Rp(_A0, _A1, _A2)>::function(_Fp __f,
1377                                      typename enable_if<!is_integral<_Fp>::value>::type*)
1378     : __f_(0)
1379 {
1380     if (__function::__not_null(__f))
1381     {
1382         typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
1383         if (sizeof(_FF) <= sizeof(__buf_))
1384         {
1385             __f_ = (__base*)&__buf_;
1386             ::new (__f_) _FF(__f);
1387         }
1388         else
1389         {
1390             typedef allocator<_FF> _Ap;
1391             _Ap __a;
1392             typedef __allocator_destructor<_Ap> _Dp;
1393             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1394             ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
1395             __f_ = __hold.release();
1396         }
1397     }
1398 }
1399
1400 template<class _Rp, class _A0, class _A1, class _A2>
1401 template <class _Fp, class _Alloc>
1402 function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
1403                                      typename enable_if<!is_integral<_Fp>::value>::type*)
1404     : __f_(0)
1405 {
1406     typedef allocator_traits<_Alloc> __alloc_traits;
1407     if (__function::__not_null(__f))
1408     {
1409         typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
1410         if (sizeof(_FF) <= sizeof(__buf_))
1411         {
1412             __f_ = (__base*)&__buf_;
1413             ::new (__f_) _FF(__f, __a0);
1414         }
1415         else
1416         {
1417             typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
1418             _Ap __a(__a0);
1419             typedef __allocator_destructor<_Ap> _Dp;
1420             unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1421             ::new (__hold.get()) _FF(__f, _Alloc(__a));
1422             __f_ = __hold.release();
1423         }
1424     }
1425 }
1426
1427 template<class _Rp, class _A0, class _A1, class _A2>
1428 function<_Rp(_A0, _A1, _A2)>&
1429 function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f)
1430 {
1431     function(__f).swap(*this);
1432     return *this;
1433 }
1434
1435 template<class _Rp, class _A0, class _A1, class _A2>
1436 function<_Rp(_A0, _A1, _A2)>&
1437 function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t)
1438 {
1439     if (__f_ == (__base*)&__buf_)
1440         __f_->destroy();
1441     else if (__f_)
1442         __f_->destroy_deallocate();
1443     __f_ = 0;
1444     return *this;
1445 }
1446
1447 template<class _Rp, class _A0, class _A1, class _A2>
1448 template <class _Fp>
1449 typename enable_if
1450 <
1451     !is_integral<_Fp>::value,
1452     function<_Rp(_A0, _A1, _A2)>&
1453 >::type
1454 function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f)
1455 {
1456     function(_VSTD::move(__f)).swap(*this);
1457     return *this;
1458 }
1459
1460 template<class _Rp, class _A0, class _A1, class _A2>
1461 function<_Rp(_A0, _A1, _A2)>::~function()
1462 {
1463     if (__f_ == (__base*)&__buf_)
1464         __f_->destroy();
1465     else if (__f_)
1466         __f_->destroy_deallocate();
1467 }
1468
1469 template<class _Rp, class _A0, class _A1, class _A2>
1470 void
1471 function<_Rp(_A0, _A1, _A2)>::swap(function& __f)
1472 {
1473     if (_VSTD::addressof(__f) == this)
1474       return;
1475     if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1476     {
1477         typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1478         __base* __t = (__base*)&__tempbuf;
1479         __f_->__clone(__t);
1480         __f_->destroy();
1481         __f_ = 0;
1482         __f.__f_->__clone((__base*)&__buf_);
1483         __f.__f_->destroy();
1484         __f.__f_ = 0;
1485         __f_ = (__base*)&__buf_;
1486         __t->__clone((__base*)&__f.__buf_);
1487         __t->destroy();
1488         __f.__f_ = (__base*)&__f.__buf_;
1489     }
1490     else if (__f_ == (__base*)&__buf_)
1491     {
1492         __f_->__clone((__base*)&__f.__buf_);
1493         __f_->destroy();
1494         __f_ = __f.__f_;
1495         __f.__f_ = (__base*)&__f.__buf_;
1496     }
1497     else if (__f.__f_ == (__base*)&__f.__buf_)
1498     {
1499         __f.__f_->__clone((__base*)&__buf_);
1500         __f.__f_->destroy();
1501         __f.__f_ = __f_;
1502         __f_ = (__base*)&__buf_;
1503     }
1504     else
1505         _VSTD::swap(__f_, __f.__f_);
1506 }
1507
1508 template<class _Rp, class _A0, class _A1, class _A2>
1509 _Rp
1510 function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const
1511 {
1512     if (__f_ == 0)
1513         __throw_bad_function_call();
1514     return (*__f_)(__a0, __a1, __a2);
1515 }
1516
1517 #ifndef _LIBCPP_NO_RTTI
1518
1519 template<class _Rp, class _A0, class _A1, class _A2>
1520 const std::type_info&
1521 function<_Rp(_A0, _A1, _A2)>::target_type() const
1522 {
1523     if (__f_ == 0)
1524         return typeid(void);
1525     return __f_->target_type();
1526 }
1527
1528 template<class _Rp, class _A0, class _A1, class _A2>
1529 template <typename _Tp>
1530 _Tp*
1531 function<_Rp(_A0, _A1, _A2)>::target()
1532 {
1533     if (__f_ == 0)
1534         return (_Tp*)0;
1535     return (_Tp*)__f_->target(typeid(_Tp));
1536 }
1537
1538 template<class _Rp, class _A0, class _A1, class _A2>
1539 template <typename _Tp>
1540 const _Tp*
1541 function<_Rp(_A0, _A1, _A2)>::target() const
1542 {
1543     if (__f_ == 0)
1544         return (const _Tp*)0;
1545     return (const _Tp*)__f_->target(typeid(_Tp));
1546 }
1547
1548 #endif  // _LIBCPP_NO_RTTI
1549
1550 template <class _Fp>
1551 inline _LIBCPP_INLINE_VISIBILITY
1552 bool
1553 operator==(const function<_Fp>& __f, nullptr_t) {return !__f;}
1554
1555 template <class _Fp>
1556 inline _LIBCPP_INLINE_VISIBILITY
1557 bool
1558 operator==(nullptr_t, const function<_Fp>& __f) {return !__f;}
1559
1560 template <class _Fp>
1561 inline _LIBCPP_INLINE_VISIBILITY
1562 bool
1563 operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;}
1564
1565 template <class _Fp>
1566 inline _LIBCPP_INLINE_VISIBILITY
1567 bool
1568 operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;}
1569
1570 template <class _Fp>
1571 inline _LIBCPP_INLINE_VISIBILITY
1572 void
1573 swap(function<_Fp>& __x, function<_Fp>& __y)
1574 {return __x.swap(__y);}
1575
1576 #endif  // _LIBCPP_FUNCTIONAL_03