blob: f8b5d95660533e3ad573b60d773b399d69f16e9a [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
Howard Hinnant5b08a8a2010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:16 +00005//
Howard Hinnant412dbeb2010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3e519522010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_FUNCTIONAL_03
12#define _LIBCPP_FUNCTIONAL_03
13
14// manual variadic expansion for <functional>
15
Howard Hinnant073458b2011-10-17 20:05:10 +000016#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3e519522010-05-11 19:42:16 +000017#pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10 +000018#endif
Howard Hinnant3e519522010-05-11 19:42:16 +000019
Eric Fiseliere5407172015-07-22 04:14:38 +000020namespace __function {
Howard Hinnant3e519522010-05-11 19:42:16 +000021
22template<class _Fp> class __base;
23
Howard Hinnantc003db12011-11-29 18:15:50 +000024template<class _Rp>
25class __base<_Rp()>
Howard Hinnant3e519522010-05-11 19:42:16 +000026{
27 __base(const __base&);
28 __base& operator=(const __base&);
29public:
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;
Howard Hinnantc003db12011-11-29 18:15:50 +000036 virtual _Rp operator()() = 0;
Howard Hinnant54b409f2010-08-11 17:04:31 +000037#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000038 virtual const void* target(const type_info&) const = 0;
39 virtual const std::type_info& target_type() const = 0;
Howard Hinnantb3371f62010-08-22 00:02:43 +000040#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000041};
42
Howard Hinnantc003db12011-11-29 18:15:50 +000043template<class _Rp, class _A0>
44class __base<_Rp(_A0)>
Howard Hinnant3e519522010-05-11 19:42:16 +000045{
46 __base(const __base&);
47 __base& operator=(const __base&);
48public:
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;
Howard Hinnantc003db12011-11-29 18:15:50 +000055 virtual _Rp operator()(_A0) = 0;
Howard Hinnant54b409f2010-08-11 17:04:31 +000056#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000057 virtual const void* target(const type_info&) const = 0;
58 virtual const std::type_info& target_type() const = 0;
Howard Hinnantb3371f62010-08-22 00:02:43 +000059#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000060};
61
Howard Hinnantc003db12011-11-29 18:15:50 +000062template<class _Rp, class _A0, class _A1>
63class __base<_Rp(_A0, _A1)>
Howard Hinnant3e519522010-05-11 19:42:16 +000064{
65 __base(const __base&);
66 __base& operator=(const __base&);
67public:
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;
Howard Hinnantc003db12011-11-29 18:15:50 +000074 virtual _Rp operator()(_A0, _A1) = 0;
Howard Hinnant54b409f2010-08-11 17:04:31 +000075#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000076 virtual const void* target(const type_info&) const = 0;
77 virtual const std::type_info& target_type() const = 0;
Howard Hinnantb3371f62010-08-22 00:02:43 +000078#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000079};
80
Howard Hinnantc003db12011-11-29 18:15:50 +000081template<class _Rp, class _A0, class _A1, class _A2>
82class __base<_Rp(_A0, _A1, _A2)>
Howard Hinnant3e519522010-05-11 19:42:16 +000083{
84 __base(const __base&);
85 __base& operator=(const __base&);
86public:
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;
Howard Hinnantc003db12011-11-29 18:15:50 +000093 virtual _Rp operator()(_A0, _A1, _A2) = 0;
Howard Hinnant54b409f2010-08-11 17:04:31 +000094#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000095 virtual const void* target(const type_info&) const = 0;
96 virtual const std::type_info& target_type() const = 0;
Howard Hinnantb3371f62010-08-22 00:02:43 +000097#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +000098};
99
100template<class _FD, class _Alloc, class _FB> class __func;
101
Howard Hinnantc003db12011-11-29 18:15:50 +0000102template<class _Fp, class _Alloc, class _Rp>
103class __func<_Fp, _Alloc, _Rp()>
104 : public __base<_Rp()>
Howard Hinnant3e519522010-05-11 19:42:16 +0000105{
Howard Hinnantc003db12011-11-29 18:15:50 +0000106 __compressed_pair<_Fp, _Alloc> __f_;
Howard Hinnant3e519522010-05-11 19:42:16 +0000107public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000108 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;
Howard Hinnant3e519522010-05-11 19:42:16 +0000112 virtual void destroy();
113 virtual void destroy_deallocate();
Howard Hinnantc003db12011-11-29 18:15:50 +0000114 virtual _Rp operator()();
Howard Hinnant54b409f2010-08-11 17:04:31 +0000115#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000116 virtual const void* target(const type_info&) const;
117 virtual const std::type_info& target_type() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000118#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000119};
120
Howard Hinnantc003db12011-11-29 18:15:50 +0000121template<class _Fp, class _Alloc, class _Rp>
122__base<_Rp()>*
123__func<_Fp, _Alloc, _Rp()>::__clone() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000124{
Eric Fiselierb11df182015-06-14 23:30:09 +0000125 typedef allocator_traits<_Alloc> __alloc_traits;
126 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000127 _Ap __a(__f_.second());
128 typedef __allocator_destructor<_Ap> _Dp;
129 unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant3e519522010-05-11 19:42:16 +0000130 ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
131 return __hold.release();
132}
133
Howard Hinnantc003db12011-11-29 18:15:50 +0000134template<class _Fp, class _Alloc, class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000135void
Howard Hinnantc003db12011-11-29 18:15:50 +0000136__func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000137{
138 ::new (__p) __func(__f_.first(), __f_.second());
139}
140
Howard Hinnantc003db12011-11-29 18:15:50 +0000141template<class _Fp, class _Alloc, class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000142void
Howard Hinnantc003db12011-11-29 18:15:50 +0000143__func<_Fp, _Alloc, _Rp()>::destroy()
Howard Hinnant3e519522010-05-11 19:42:16 +0000144{
Howard Hinnantc003db12011-11-29 18:15:50 +0000145 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000146}
147
Howard Hinnantc003db12011-11-29 18:15:50 +0000148template<class _Fp, class _Alloc, class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000149void
Howard Hinnantc003db12011-11-29 18:15:50 +0000150__func<_Fp, _Alloc, _Rp()>::destroy_deallocate()
Howard Hinnant3e519522010-05-11 19:42:16 +0000151{
Eric Fiselierb11df182015-06-14 23:30:09 +0000152 typedef allocator_traits<_Alloc> __alloc_traits;
153 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000154 _Ap __a(__f_.second());
155 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000156 __a.deallocate(this, 1);
157}
158
Howard Hinnantc003db12011-11-29 18:15:50 +0000159template<class _Fp, class _Alloc, class _Rp>
160_Rp
161__func<_Fp, _Alloc, _Rp()>::operator()()
Howard Hinnant3e519522010-05-11 19:42:16 +0000162{
Eric Fiselier54519a62015-02-10 16:48:45 +0000163 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
164 return _Invoker::__call(__f_.first());
Howard Hinnant3e519522010-05-11 19:42:16 +0000165}
166
Howard Hinnant54b409f2010-08-11 17:04:31 +0000167#ifndef _LIBCPP_NO_RTTI
168
Howard Hinnantc003db12011-11-29 18:15:50 +0000169template<class _Fp, class _Alloc, class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000170const void*
Howard Hinnantc003db12011-11-29 18:15:50 +0000171__func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000172{
Howard Hinnantc003db12011-11-29 18:15:50 +0000173 if (__ti == typeid(_Fp))
Howard Hinnant3e519522010-05-11 19:42:16 +0000174 return &__f_.first();
175 return (const void*)0;
176}
177
Howard Hinnantc003db12011-11-29 18:15:50 +0000178template<class _Fp, class _Alloc, class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000179const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000180__func<_Fp, _Alloc, _Rp()>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000181{
Howard Hinnantc003db12011-11-29 18:15:50 +0000182 return typeid(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000183}
184
Howard Hinnantb3371f62010-08-22 00:02:43 +0000185#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000186
Howard Hinnantc003db12011-11-29 18:15:50 +0000187template<class _Fp, class _Alloc, class _Rp, class _A0>
188class __func<_Fp, _Alloc, _Rp(_A0)>
189 : public __base<_Rp(_A0)>
Howard Hinnant3e519522010-05-11 19:42:16 +0000190{
Howard Hinnantc003db12011-11-29 18:15:50 +0000191 __compressed_pair<_Fp, _Alloc> __f_;
Howard Hinnant3e519522010-05-11 19:42:16 +0000192public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000193 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
194 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
Howard Hinnantce48a112011-06-30 21:18:19 +0000195 : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
Howard Hinnantc003db12011-11-29 18:15:50 +0000196 virtual __base<_Rp(_A0)>* __clone() const;
197 virtual void __clone(__base<_Rp(_A0)>*) const;
Howard Hinnant3e519522010-05-11 19:42:16 +0000198 virtual void destroy();
199 virtual void destroy_deallocate();
Howard Hinnantc003db12011-11-29 18:15:50 +0000200 virtual _Rp operator()(_A0);
Howard Hinnant54b409f2010-08-11 17:04:31 +0000201#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000202 virtual const void* target(const type_info&) const;
203 virtual const std::type_info& target_type() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000204#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000205};
206
Howard Hinnantc003db12011-11-29 18:15:50 +0000207template<class _Fp, class _Alloc, class _Rp, class _A0>
208__base<_Rp(_A0)>*
209__func<_Fp, _Alloc, _Rp(_A0)>::__clone() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000210{
Eric Fiselierb11df182015-06-14 23:30:09 +0000211 typedef allocator_traits<_Alloc> __alloc_traits;
212 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000213 _Ap __a(__f_.second());
214 typedef __allocator_destructor<_Ap> _Dp;
215 unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant3e519522010-05-11 19:42:16 +0000216 ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
217 return __hold.release();
218}
219
Howard Hinnantc003db12011-11-29 18:15:50 +0000220template<class _Fp, class _Alloc, class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000221void
Howard Hinnantc003db12011-11-29 18:15:50 +0000222__func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000223{
224 ::new (__p) __func(__f_.first(), __f_.second());
225}
226
Howard Hinnantc003db12011-11-29 18:15:50 +0000227template<class _Fp, class _Alloc, class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000228void
Howard Hinnantc003db12011-11-29 18:15:50 +0000229__func<_Fp, _Alloc, _Rp(_A0)>::destroy()
Howard Hinnant3e519522010-05-11 19:42:16 +0000230{
Howard Hinnantc003db12011-11-29 18:15:50 +0000231 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000232}
233
Howard Hinnantc003db12011-11-29 18:15:50 +0000234template<class _Fp, class _Alloc, class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000235void
Howard Hinnantc003db12011-11-29 18:15:50 +0000236__func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate()
Howard Hinnant3e519522010-05-11 19:42:16 +0000237{
Eric Fiselierb11df182015-06-14 23:30:09 +0000238 typedef allocator_traits<_Alloc> __alloc_traits;
239 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000240 _Ap __a(__f_.second());
241 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000242 __a.deallocate(this, 1);
243}
244
Howard Hinnantc003db12011-11-29 18:15:50 +0000245template<class _Fp, class _Alloc, class _Rp, class _A0>
246_Rp
247__func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000248{
Eric Fiselier54519a62015-02-10 16:48:45 +0000249 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
250 return _Invoker::__call(__f_.first(), __a0);
Howard Hinnant3e519522010-05-11 19:42:16 +0000251}
252
Howard Hinnant54b409f2010-08-11 17:04:31 +0000253#ifndef _LIBCPP_NO_RTTI
254
Howard Hinnantc003db12011-11-29 18:15:50 +0000255template<class _Fp, class _Alloc, class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000256const void*
Howard Hinnantc003db12011-11-29 18:15:50 +0000257__func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000258{
Howard Hinnantc003db12011-11-29 18:15:50 +0000259 if (__ti == typeid(_Fp))
Howard Hinnant3e519522010-05-11 19:42:16 +0000260 return &__f_.first();
261 return (const void*)0;
262}
263
Howard Hinnantc003db12011-11-29 18:15:50 +0000264template<class _Fp, class _Alloc, class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000265const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000266__func<_Fp, _Alloc, _Rp(_A0)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000267{
Howard Hinnantc003db12011-11-29 18:15:50 +0000268 return typeid(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000269}
270
Howard Hinnantb3371f62010-08-22 00:02:43 +0000271#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000272
Howard Hinnantc003db12011-11-29 18:15:50 +0000273template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
274class __func<_Fp, _Alloc, _Rp(_A0, _A1)>
275 : public __base<_Rp(_A0, _A1)>
Howard Hinnant3e519522010-05-11 19:42:16 +0000276{
Howard Hinnantc003db12011-11-29 18:15:50 +0000277 __compressed_pair<_Fp, _Alloc> __f_;
Howard Hinnant3e519522010-05-11 19:42:16 +0000278public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000279 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
280 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
Howard Hinnantce48a112011-06-30 21:18:19 +0000281 : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
Howard Hinnantc003db12011-11-29 18:15:50 +0000282 virtual __base<_Rp(_A0, _A1)>* __clone() const;
283 virtual void __clone(__base<_Rp(_A0, _A1)>*) const;
Howard Hinnant3e519522010-05-11 19:42:16 +0000284 virtual void destroy();
285 virtual void destroy_deallocate();
Howard Hinnantc003db12011-11-29 18:15:50 +0000286 virtual _Rp operator()(_A0, _A1);
Howard Hinnant54b409f2010-08-11 17:04:31 +0000287#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000288 virtual const void* target(const type_info&) const;
289 virtual const std::type_info& target_type() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000290#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000291};
292
Howard Hinnantc003db12011-11-29 18:15:50 +0000293template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
294__base<_Rp(_A0, _A1)>*
295__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000296{
Eric Fiselierb11df182015-06-14 23:30:09 +0000297 typedef allocator_traits<_Alloc> __alloc_traits;
298 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000299 _Ap __a(__f_.second());
300 typedef __allocator_destructor<_Ap> _Dp;
301 unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant3e519522010-05-11 19:42:16 +0000302 ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
303 return __hold.release();
304}
305
Howard Hinnantc003db12011-11-29 18:15:50 +0000306template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000307void
Howard Hinnantc003db12011-11-29 18:15:50 +0000308__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000309{
310 ::new (__p) __func(__f_.first(), __f_.second());
311}
312
Howard Hinnantc003db12011-11-29 18:15:50 +0000313template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000314void
Howard Hinnantc003db12011-11-29 18:15:50 +0000315__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy()
Howard Hinnant3e519522010-05-11 19:42:16 +0000316{
Howard Hinnantc003db12011-11-29 18:15:50 +0000317 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000318}
319
Howard Hinnantc003db12011-11-29 18:15:50 +0000320template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000321void
Howard Hinnantc003db12011-11-29 18:15:50 +0000322__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate()
Howard Hinnant3e519522010-05-11 19:42:16 +0000323{
Eric Fiselierb11df182015-06-14 23:30:09 +0000324 typedef allocator_traits<_Alloc> __alloc_traits;
325 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000326 _Ap __a(__f_.second());
327 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000328 __a.deallocate(this, 1);
329}
330
Howard Hinnantc003db12011-11-29 18:15:50 +0000331template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
332_Rp
333__func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000334{
Eric Fiselier54519a62015-02-10 16:48:45 +0000335 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
336 return _Invoker::__call(__f_.first(), __a0, __a1);
Howard Hinnant3e519522010-05-11 19:42:16 +0000337}
338
Howard Hinnant54b409f2010-08-11 17:04:31 +0000339#ifndef _LIBCPP_NO_RTTI
340
Howard Hinnantc003db12011-11-29 18:15:50 +0000341template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000342const void*
Howard Hinnantc003db12011-11-29 18:15:50 +0000343__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000344{
Howard Hinnantc003db12011-11-29 18:15:50 +0000345 if (__ti == typeid(_Fp))
Howard Hinnant3e519522010-05-11 19:42:16 +0000346 return &__f_.first();
347 return (const void*)0;
348}
349
Howard Hinnantc003db12011-11-29 18:15:50 +0000350template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000351const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000352__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000353{
Howard Hinnantc003db12011-11-29 18:15:50 +0000354 return typeid(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000355}
356
Howard Hinnantb3371f62010-08-22 00:02:43 +0000357#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000358
Howard Hinnantc003db12011-11-29 18:15:50 +0000359template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
360class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>
361 : public __base<_Rp(_A0, _A1, _A2)>
Howard Hinnant3e519522010-05-11 19:42:16 +0000362{
Howard Hinnantc003db12011-11-29 18:15:50 +0000363 __compressed_pair<_Fp, _Alloc> __f_;
Howard Hinnant3e519522010-05-11 19:42:16 +0000364public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000365 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
366 _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
Howard Hinnantce48a112011-06-30 21:18:19 +0000367 : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
Howard Hinnantc003db12011-11-29 18:15:50 +0000368 virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const;
369 virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const;
Howard Hinnant3e519522010-05-11 19:42:16 +0000370 virtual void destroy();
371 virtual void destroy_deallocate();
Howard Hinnantc003db12011-11-29 18:15:50 +0000372 virtual _Rp operator()(_A0, _A1, _A2);
Howard Hinnant54b409f2010-08-11 17:04:31 +0000373#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000374 virtual const void* target(const type_info&) const;
375 virtual const std::type_info& target_type() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000376#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000377};
378
Howard Hinnantc003db12011-11-29 18:15:50 +0000379template<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
Howard Hinnant3e519522010-05-11 19:42:16 +0000382{
Eric Fiselierb11df182015-06-14 23:30:09 +0000383 typedef allocator_traits<_Alloc> __alloc_traits;
384 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000385 _Ap __a(__f_.second());
386 typedef __allocator_destructor<_Ap> _Dp;
387 unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant3e519522010-05-11 19:42:16 +0000388 ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
389 return __hold.release();
390}
391
Howard Hinnantc003db12011-11-29 18:15:50 +0000392template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000393void
Howard Hinnantc003db12011-11-29 18:15:50 +0000394__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000395{
396 ::new (__p) __func(__f_.first(), __f_.second());
397}
398
Howard Hinnantc003db12011-11-29 18:15:50 +0000399template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000400void
Howard Hinnantc003db12011-11-29 18:15:50 +0000401__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy()
Howard Hinnant3e519522010-05-11 19:42:16 +0000402{
Howard Hinnantc003db12011-11-29 18:15:50 +0000403 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000404}
405
Howard Hinnantc003db12011-11-29 18:15:50 +0000406template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000407void
Howard Hinnantc003db12011-11-29 18:15:50 +0000408__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate()
Howard Hinnant3e519522010-05-11 19:42:16 +0000409{
Eric Fiselierb11df182015-06-14 23:30:09 +0000410 typedef allocator_traits<_Alloc> __alloc_traits;
411 typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000412 _Ap __a(__f_.second());
413 __f_.~__compressed_pair<_Fp, _Alloc>();
Howard Hinnant3e519522010-05-11 19:42:16 +0000414 __a.deallocate(this, 1);
415}
416
Howard Hinnantc003db12011-11-29 18:15:50 +0000417template<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)
Howard Hinnant3e519522010-05-11 19:42:16 +0000420{
Eric Fiselier54519a62015-02-10 16:48:45 +0000421 typedef __invoke_void_return_wrapper<_Rp> _Invoker;
422 return _Invoker::__call(__f_.first(), __a0, __a1, __a2);
Howard Hinnant3e519522010-05-11 19:42:16 +0000423}
424
Howard Hinnant54b409f2010-08-11 17:04:31 +0000425#ifndef _LIBCPP_NO_RTTI
426
Howard Hinnantc003db12011-11-29 18:15:50 +0000427template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000428const void*
Howard Hinnantc003db12011-11-29 18:15:50 +0000429__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000430{
Howard Hinnantc003db12011-11-29 18:15:50 +0000431 if (__ti == typeid(_Fp))
Howard Hinnant3e519522010-05-11 19:42:16 +0000432 return &__f_.first();
433 return (const void*)0;
434}
435
Howard Hinnantc003db12011-11-29 18:15:50 +0000436template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000437const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000438__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000439{
Howard Hinnantc003db12011-11-29 18:15:50 +0000440 return typeid(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000441}
442
Howard Hinnantb3371f62010-08-22 00:02:43 +0000443#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000444
Howard Hinnant3e519522010-05-11 19:42:16 +0000445} // __function
446
Howard Hinnantc003db12011-11-29 18:15:50 +0000447template<class _Rp>
Howard Hinnantf0544c22013-08-12 18:38:34 +0000448class _LIBCPP_TYPE_VIS_ONLY function<_Rp()>
Howard Hinnant3e519522010-05-11 19:42:16 +0000449{
Howard Hinnantc003db12011-11-29 18:15:50 +0000450 typedef __function::__base<_Rp()> __base;
Howard Hinnant3e519522010-05-11 19:42:16 +0000451 aligned_storage<3*sizeof(void*)>::type __buf_;
452 __base* __f_;
453
Howard Hinnant3e519522010-05-11 19:42:16 +0000454public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000455 typedef _Rp result_type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000456
457 // 20.7.16.2.1, construct/copy/destroy:
Howard Hinnant43d99232010-09-21 17:32:39 +0000458 _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
459 _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
Howard Hinnant3e519522010-05-11 19:42:16 +0000460 function(const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000461 template<class _Fp>
462 function(_Fp,
463 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +0000464
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000465 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000467 function(allocator_arg_t, const _Alloc&) : __f_(0) {}
468 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000469 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000470 function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
471 template<class _Alloc>
472 function(allocator_arg_t, const _Alloc&, const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000473 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);
Howard Hinnant3e519522010-05-11 19:42:16 +0000476
477 function& operator=(const function&);
478 function& operator=(nullptr_t);
Howard Hinnantc003db12011-11-29 18:15:50 +0000479 template<class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000480 typename enable_if
481 <
Howard Hinnantc003db12011-11-29 18:15:50 +0000482 !is_integral<_Fp>::value,
Howard Hinnant3e519522010-05-11 19:42:16 +0000483 function&
484 >::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000485 operator=(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000486
487 ~function();
488
489 // 20.7.16.2.2, function modifiers:
490 void swap(function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000491 template<class _Fp, class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000493 void assign(_Fp __f, const _Alloc& __a)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000494 {function(allocator_arg, __a, __f).swap(*this);}
Howard Hinnant3e519522010-05-11 19:42:16 +0000495
496 // 20.7.16.2.3, function capacity:
Howard Hinnant43d99232010-09-21 17:32:39 +0000497 _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
Howard Hinnant3e519522010-05-11 19:42:16 +0000498
499private:
500 // deleted overloads close possible hole in the type system
501 template<class _R2>
Howard Hinnant43d99232010-09-21 17:32:39 +0000502 bool operator==(const function<_R2()>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +0000503 template<class _R2>
Howard Hinnant43d99232010-09-21 17:32:39 +0000504 bool operator!=(const function<_R2()>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +0000505public:
506 // 20.7.16.2.4, function invocation:
Howard Hinnantc003db12011-11-29 18:15:50 +0000507 _Rp operator()() const;
Howard Hinnant3e519522010-05-11 19:42:16 +0000508
Howard Hinnant54b409f2010-08-11 17:04:31 +0000509#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000510 // 20.7.16.2.5, function target access:
511 const std::type_info& target_type() const;
Howard Hinnantc003db12011-11-29 18:15:50 +0000512 template <typename _Tp> _Tp* target();
513 template <typename _Tp> const _Tp* target() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000514#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000515};
516
Howard Hinnantc003db12011-11-29 18:15:50 +0000517template<class _Rp>
518function<_Rp()>::function(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000519{
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
Howard Hinnantc003db12011-11-29 18:15:50 +0000531template<class _Rp>
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000532template<class _Alloc>
Howard Hinnantc003db12011-11-29 18:15:50 +0000533function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000534{
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
Howard Hinnantc003db12011-11-29 18:15:50 +0000546template<class _Rp>
547template <class _Fp>
548function<_Rp()>::function(_Fp __f,
549 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant3e519522010-05-11 19:42:16 +0000550 : __f_(0)
551{
Eric Fiselier0d28f782015-08-18 19:41:51 +0000552 if (__function::__not_null(__f))
Howard Hinnant3e519522010-05-11 19:42:16 +0000553 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000554 typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
Howard Hinnant3e519522010-05-11 19:42:16 +0000555 if (sizeof(_FF) <= sizeof(__buf_))
556 {
557 __f_ = (__base*)&__buf_;
558 ::new (__f_) _FF(__f);
559 }
560 else
561 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000562 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));
Howard Hinnant3e519522010-05-11 19:42:16 +0000567 __f_ = __hold.release();
568 }
569 }
570}
571
Howard Hinnantc003db12011-11-29 18:15:50 +0000572template<class _Rp>
573template <class _Fp, class _Alloc>
574function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
575 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000576 : __f_(0)
577{
578 typedef allocator_traits<_Alloc> __alloc_traits;
Eric Fiselier0d28f782015-08-18 19:41:51 +0000579 if (__function::__not_null(__f))
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000580 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000581 typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000582 if (sizeof(_FF) <= sizeof(__buf_))
583 {
584 __f_ = (__base*)&__buf_;
Eric Fiselierb11df182015-06-14 23:30:09 +0000585 ::new (__f_) _FF(__f, __a0);
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000586 }
587 else
588 {
Marshall Clow1f508012015-04-07 05:21:38 +0000589 typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000590 _Ap __a(__a0);
591 typedef __allocator_destructor<_Ap> _Dp;
592 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000593 ::new (__hold.get()) _FF(__f, _Alloc(__a));
594 __f_ = __hold.release();
595 }
596 }
597}
598
Howard Hinnantc003db12011-11-29 18:15:50 +0000599template<class _Rp>
600function<_Rp()>&
601function<_Rp()>::operator=(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000602{
603 function(__f).swap(*this);
604 return *this;
605}
606
Howard Hinnantc003db12011-11-29 18:15:50 +0000607template<class _Rp>
608function<_Rp()>&
609function<_Rp()>::operator=(nullptr_t)
Howard Hinnant3e519522010-05-11 19:42:16 +0000610{
611 if (__f_ == (__base*)&__buf_)
612 __f_->destroy();
613 else if (__f_)
614 __f_->destroy_deallocate();
615 __f_ = 0;
Eric Fiselier03d5dd22015-06-02 01:31:33 +0000616 return *this;
Howard Hinnant3e519522010-05-11 19:42:16 +0000617}
618
Howard Hinnantc003db12011-11-29 18:15:50 +0000619template<class _Rp>
620template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000621typename enable_if
622<
Howard Hinnantc003db12011-11-29 18:15:50 +0000623 !is_integral<_Fp>::value,
624 function<_Rp()>&
Howard Hinnant3e519522010-05-11 19:42:16 +0000625>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000626function<_Rp()>::operator=(_Fp __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000627{
Howard Hinnantce48a112011-06-30 21:18:19 +0000628 function(_VSTD::move(__f)).swap(*this);
Howard Hinnant3e519522010-05-11 19:42:16 +0000629 return *this;
630}
631
Howard Hinnantc003db12011-11-29 18:15:50 +0000632template<class _Rp>
633function<_Rp()>::~function()
Howard Hinnant3e519522010-05-11 19:42:16 +0000634{
635 if (__f_ == (__base*)&__buf_)
636 __f_->destroy();
637 else if (__f_)
638 __f_->destroy_deallocate();
639}
640
Howard Hinnantc003db12011-11-29 18:15:50 +0000641template<class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000642void
Howard Hinnantc003db12011-11-29 18:15:50 +0000643function<_Rp()>::swap(function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000644{
645 if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
646 {
647 typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
648 __base* __t = (__base*)&__tempbuf;
649 __f_->__clone(__t);
650 __f_->destroy();
651 __f_ = 0;
652 __f.__f_->__clone((__base*)&__buf_);
653 __f.__f_->destroy();
654 __f.__f_ = 0;
655 __f_ = (__base*)&__buf_;
656 __t->__clone((__base*)&__f.__buf_);
657 __t->destroy();
658 __f.__f_ = (__base*)&__f.__buf_;
659 }
660 else if (__f_ == (__base*)&__buf_)
661 {
662 __f_->__clone((__base*)&__f.__buf_);
663 __f_->destroy();
664 __f_ = __f.__f_;
665 __f.__f_ = (__base*)&__f.__buf_;
666 }
667 else if (__f.__f_ == (__base*)&__f.__buf_)
668 {
669 __f.__f_->__clone((__base*)&__buf_);
670 __f.__f_->destroy();
671 __f.__f_ = __f_;
672 __f_ = (__base*)&__buf_;
673 }
674 else
Howard Hinnantce48a112011-06-30 21:18:19 +0000675 _VSTD::swap(__f_, __f.__f_);
Howard Hinnant3e519522010-05-11 19:42:16 +0000676}
677
Howard Hinnantc003db12011-11-29 18:15:50 +0000678template<class _Rp>
679_Rp
680function<_Rp()>::operator()() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000681{
682 if (__f_ == 0)
Marshall Clowd437fa52016-08-25 15:09:01 +0000683 __throw_bad_function_call();
Howard Hinnant3e519522010-05-11 19:42:16 +0000684 return (*__f_)();
685}
686
Howard Hinnant54b409f2010-08-11 17:04:31 +0000687#ifndef _LIBCPP_NO_RTTI
688
Howard Hinnantc003db12011-11-29 18:15:50 +0000689template<class _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000690const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000691function<_Rp()>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000692{
693 if (__f_ == 0)
694 return typeid(void);
695 return __f_->target_type();
696}
697
Howard Hinnantc003db12011-11-29 18:15:50 +0000698template<class _Rp>
699template <typename _Tp>
700_Tp*
701function<_Rp()>::target()
Howard Hinnant3e519522010-05-11 19:42:16 +0000702{
703 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +0000704 return (_Tp*)0;
705 return (_Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +0000706}
707
Howard Hinnantc003db12011-11-29 18:15:50 +0000708template<class _Rp>
709template <typename _Tp>
710const _Tp*
711function<_Rp()>::target() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000712{
713 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +0000714 return (const _Tp*)0;
715 return (const _Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +0000716}
717
Howard Hinnantb3371f62010-08-22 00:02:43 +0000718#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000719
Howard Hinnantc003db12011-11-29 18:15:50 +0000720template<class _Rp, class _A0>
Howard Hinnantf0544c22013-08-12 18:38:34 +0000721class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0)>
Howard Hinnantc003db12011-11-29 18:15:50 +0000722 : public unary_function<_A0, _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000723{
Howard Hinnantc003db12011-11-29 18:15:50 +0000724 typedef __function::__base<_Rp(_A0)> __base;
Howard Hinnant3e519522010-05-11 19:42:16 +0000725 aligned_storage<3*sizeof(void*)>::type __buf_;
726 __base* __f_;
727
Howard Hinnant3e519522010-05-11 19:42:16 +0000728public:
Howard Hinnantc003db12011-11-29 18:15:50 +0000729 typedef _Rp result_type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000730
731 // 20.7.16.2.1, construct/copy/destroy:
Howard Hinnant43d99232010-09-21 17:32:39 +0000732 _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
733 _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
Howard Hinnant3e519522010-05-11 19:42:16 +0000734 function(const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000735 template<class _Fp>
736 function(_Fp,
737 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +0000738
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000739 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000741 function(allocator_arg_t, const _Alloc&) : __f_(0) {}
742 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000743 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000744 function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
745 template<class _Alloc>
746 function(allocator_arg_t, const _Alloc&, const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000747 template<class _Fp, class _Alloc>
748 function(allocator_arg_t, const _Alloc& __a, _Fp __f,
749 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +0000750
751 function& operator=(const function&);
752 function& operator=(nullptr_t);
Howard Hinnantc003db12011-11-29 18:15:50 +0000753 template<class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000754 typename enable_if
755 <
Howard Hinnantc003db12011-11-29 18:15:50 +0000756 !is_integral<_Fp>::value,
Howard Hinnant3e519522010-05-11 19:42:16 +0000757 function&
758 >::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000759 operator=(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +0000760
761 ~function();
762
763 // 20.7.16.2.2, function modifiers:
764 void swap(function&);
Howard Hinnantc003db12011-11-29 18:15:50 +0000765 template<class _Fp, class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +0000766 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000767 void assign(_Fp __f, const _Alloc& __a)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000768 {function(allocator_arg, __a, __f).swap(*this);}
Howard Hinnant3e519522010-05-11 19:42:16 +0000769
770 // 20.7.16.2.3, function capacity:
Howard Hinnant43d99232010-09-21 17:32:39 +0000771 _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
Howard Hinnant3e519522010-05-11 19:42:16 +0000772
773private:
774 // deleted overloads close possible hole in the type system
775 template<class _R2, class _B0>
Howard Hinnant43d99232010-09-21 17:32:39 +0000776 bool operator==(const function<_R2(_B0)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +0000777 template<class _R2, class _B0>
Howard Hinnant43d99232010-09-21 17:32:39 +0000778 bool operator!=(const function<_R2(_B0)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +0000779public:
780 // 20.7.16.2.4, function invocation:
Howard Hinnantc003db12011-11-29 18:15:50 +0000781 _Rp operator()(_A0) const;
Howard Hinnant3e519522010-05-11 19:42:16 +0000782
Howard Hinnant54b409f2010-08-11 17:04:31 +0000783#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000784 // 20.7.16.2.5, function target access:
785 const std::type_info& target_type() const;
Howard Hinnantc003db12011-11-29 18:15:50 +0000786 template <typename _Tp> _Tp* target();
787 template <typename _Tp> const _Tp* target() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +0000788#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +0000789};
790
Howard Hinnantc003db12011-11-29 18:15:50 +0000791template<class _Rp, class _A0>
792function<_Rp(_A0)>::function(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000793{
794 if (__f.__f_ == 0)
795 __f_ = 0;
796 else if (__f.__f_ == (const __base*)&__f.__buf_)
797 {
798 __f_ = (__base*)&__buf_;
799 __f.__f_->__clone(__f_);
800 }
801 else
802 __f_ = __f.__f_->__clone();
803}
804
Howard Hinnantc003db12011-11-29 18:15:50 +0000805template<class _Rp, class _A0>
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000806template<class _Alloc>
Howard Hinnantc003db12011-11-29 18:15:50 +0000807function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000808{
809 if (__f.__f_ == 0)
810 __f_ = 0;
811 else if (__f.__f_ == (const __base*)&__f.__buf_)
812 {
813 __f_ = (__base*)&__buf_;
814 __f.__f_->__clone(__f_);
815 }
816 else
817 __f_ = __f.__f_->__clone();
818}
819
Howard Hinnantc003db12011-11-29 18:15:50 +0000820template<class _Rp, class _A0>
821template <class _Fp>
822function<_Rp(_A0)>::function(_Fp __f,
823 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant3e519522010-05-11 19:42:16 +0000824 : __f_(0)
825{
Eric Fiselier0d28f782015-08-18 19:41:51 +0000826 if (__function::__not_null(__f))
Howard Hinnant3e519522010-05-11 19:42:16 +0000827 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000828 typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
Howard Hinnant3e519522010-05-11 19:42:16 +0000829 if (sizeof(_FF) <= sizeof(__buf_))
830 {
831 __f_ = (__base*)&__buf_;
832 ::new (__f_) _FF(__f);
833 }
834 else
835 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000836 typedef allocator<_FF> _Ap;
837 _Ap __a;
838 typedef __allocator_destructor<_Ap> _Dp;
839 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
840 ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
Howard Hinnant3e519522010-05-11 19:42:16 +0000841 __f_ = __hold.release();
842 }
843 }
844}
845
Howard Hinnantc003db12011-11-29 18:15:50 +0000846template<class _Rp, class _A0>
847template <class _Fp, class _Alloc>
848function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
849 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000850 : __f_(0)
851{
852 typedef allocator_traits<_Alloc> __alloc_traits;
Eric Fiselier0d28f782015-08-18 19:41:51 +0000853 if (__function::__not_null(__f))
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000854 {
Howard Hinnantc003db12011-11-29 18:15:50 +0000855 typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000856 if (sizeof(_FF) <= sizeof(__buf_))
857 {
858 __f_ = (__base*)&__buf_;
Eric Fiselierb11df182015-06-14 23:30:09 +0000859 ::new (__f_) _FF(__f, __a0);
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000860 }
861 else
862 {
Marshall Clow1f508012015-04-07 05:21:38 +0000863 typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +0000864 _Ap __a(__a0);
865 typedef __allocator_destructor<_Ap> _Dp;
866 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant9b0b6d42010-08-20 19:36:46 +0000867 ::new (__hold.get()) _FF(__f, _Alloc(__a));
868 __f_ = __hold.release();
869 }
870 }
871}
872
Howard Hinnantc003db12011-11-29 18:15:50 +0000873template<class _Rp, class _A0>
874function<_Rp(_A0)>&
875function<_Rp(_A0)>::operator=(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000876{
877 function(__f).swap(*this);
878 return *this;
879}
880
Howard Hinnantc003db12011-11-29 18:15:50 +0000881template<class _Rp, class _A0>
882function<_Rp(_A0)>&
883function<_Rp(_A0)>::operator=(nullptr_t)
Howard Hinnant3e519522010-05-11 19:42:16 +0000884{
885 if (__f_ == (__base*)&__buf_)
886 __f_->destroy();
887 else if (__f_)
888 __f_->destroy_deallocate();
889 __f_ = 0;
Eric Fiselier03d5dd22015-06-02 01:31:33 +0000890 return *this;
Howard Hinnant3e519522010-05-11 19:42:16 +0000891}
892
Howard Hinnantc003db12011-11-29 18:15:50 +0000893template<class _Rp, class _A0>
894template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000895typename enable_if
896<
Howard Hinnantc003db12011-11-29 18:15:50 +0000897 !is_integral<_Fp>::value,
898 function<_Rp(_A0)>&
Howard Hinnant3e519522010-05-11 19:42:16 +0000899>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000900function<_Rp(_A0)>::operator=(_Fp __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000901{
Howard Hinnantce48a112011-06-30 21:18:19 +0000902 function(_VSTD::move(__f)).swap(*this);
Howard Hinnant3e519522010-05-11 19:42:16 +0000903 return *this;
904}
905
Howard Hinnantc003db12011-11-29 18:15:50 +0000906template<class _Rp, class _A0>
907function<_Rp(_A0)>::~function()
Howard Hinnant3e519522010-05-11 19:42:16 +0000908{
909 if (__f_ == (__base*)&__buf_)
910 __f_->destroy();
911 else if (__f_)
912 __f_->destroy_deallocate();
913}
914
Howard Hinnantc003db12011-11-29 18:15:50 +0000915template<class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000916void
Howard Hinnantc003db12011-11-29 18:15:50 +0000917function<_Rp(_A0)>::swap(function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000918{
919 if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
920 {
921 typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
922 __base* __t = (__base*)&__tempbuf;
923 __f_->__clone(__t);
924 __f_->destroy();
925 __f_ = 0;
926 __f.__f_->__clone((__base*)&__buf_);
927 __f.__f_->destroy();
928 __f.__f_ = 0;
929 __f_ = (__base*)&__buf_;
930 __t->__clone((__base*)&__f.__buf_);
931 __t->destroy();
932 __f.__f_ = (__base*)&__f.__buf_;
933 }
934 else if (__f_ == (__base*)&__buf_)
935 {
936 __f_->__clone((__base*)&__f.__buf_);
937 __f_->destroy();
938 __f_ = __f.__f_;
939 __f.__f_ = (__base*)&__f.__buf_;
940 }
941 else if (__f.__f_ == (__base*)&__f.__buf_)
942 {
943 __f.__f_->__clone((__base*)&__buf_);
944 __f.__f_->destroy();
945 __f.__f_ = __f_;
946 __f_ = (__base*)&__buf_;
947 }
948 else
Howard Hinnantce48a112011-06-30 21:18:19 +0000949 _VSTD::swap(__f_, __f.__f_);
Howard Hinnant3e519522010-05-11 19:42:16 +0000950}
951
Howard Hinnantc003db12011-11-29 18:15:50 +0000952template<class _Rp, class _A0>
953_Rp
954function<_Rp(_A0)>::operator()(_A0 __a0) const
Howard Hinnant3e519522010-05-11 19:42:16 +0000955{
956 if (__f_ == 0)
Marshall Clowd437fa52016-08-25 15:09:01 +0000957 __throw_bad_function_call();
Howard Hinnant3e519522010-05-11 19:42:16 +0000958 return (*__f_)(__a0);
959}
960
Howard Hinnant54b409f2010-08-11 17:04:31 +0000961#ifndef _LIBCPP_NO_RTTI
962
Howard Hinnantc003db12011-11-29 18:15:50 +0000963template<class _Rp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000964const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +0000965function<_Rp(_A0)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000966{
967 if (__f_ == 0)
968 return typeid(void);
969 return __f_->target_type();
970}
971
Howard Hinnantc003db12011-11-29 18:15:50 +0000972template<class _Rp, class _A0>
973template <typename _Tp>
974_Tp*
975function<_Rp(_A0)>::target()
Howard Hinnant3e519522010-05-11 19:42:16 +0000976{
977 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +0000978 return (_Tp*)0;
979 return (_Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +0000980}
981
Howard Hinnantc003db12011-11-29 18:15:50 +0000982template<class _Rp, class _A0>
983template <typename _Tp>
984const _Tp*
985function<_Rp(_A0)>::target() const
Howard Hinnant3e519522010-05-11 19:42:16 +0000986{
987 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +0000988 return (const _Tp*)0;
989 return (const _Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +0000990}
991
Howard Hinnantb3371f62010-08-22 00:02:43 +0000992#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +0000993
Howard Hinnantc003db12011-11-29 18:15:50 +0000994template<class _Rp, class _A0, class _A1>
Howard Hinnantf0544c22013-08-12 18:38:34 +0000995class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1)>
Howard Hinnantc003db12011-11-29 18:15:50 +0000996 : public binary_function<_A0, _A1, _Rp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000997{
Howard Hinnantc003db12011-11-29 18:15:50 +0000998 typedef __function::__base<_Rp(_A0, _A1)> __base;
Howard Hinnant3e519522010-05-11 19:42:16 +0000999 aligned_storage<3*sizeof(void*)>::type __buf_;
1000 __base* __f_;
1001
Howard Hinnant3e519522010-05-11 19:42:16 +00001002public:
Howard Hinnantc003db12011-11-29 18:15:50 +00001003 typedef _Rp result_type;
Howard Hinnant3e519522010-05-11 19:42:16 +00001004
1005 // 20.7.16.2.1, construct/copy/destroy:
Howard Hinnant43d99232010-09-21 17:32:39 +00001006 _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
1007 _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
Howard Hinnant3e519522010-05-11 19:42:16 +00001008 function(const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001009 template<class _Fp>
1010 function(_Fp,
1011 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +00001012
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001013 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001014 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001015 function(allocator_arg_t, const _Alloc&) : __f_(0) {}
1016 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001017 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001018 function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
1019 template<class _Alloc>
1020 function(allocator_arg_t, const _Alloc&, const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001021 template<class _Fp, class _Alloc>
1022 function(allocator_arg_t, const _Alloc& __a, _Fp __f,
1023 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +00001024
1025 function& operator=(const function&);
1026 function& operator=(nullptr_t);
Howard Hinnantc003db12011-11-29 18:15:50 +00001027 template<class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001028 typename enable_if
1029 <
Howard Hinnantc003db12011-11-29 18:15:50 +00001030 !is_integral<_Fp>::value,
Howard Hinnant3e519522010-05-11 19:42:16 +00001031 function&
1032 >::type
Howard Hinnantc003db12011-11-29 18:15:50 +00001033 operator=(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +00001034
1035 ~function();
1036
1037 // 20.7.16.2.2, function modifiers:
1038 void swap(function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001039 template<class _Fp, class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001040 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +00001041 void assign(_Fp __f, const _Alloc& __a)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001042 {function(allocator_arg, __a, __f).swap(*this);}
Howard Hinnant3e519522010-05-11 19:42:16 +00001043
1044 // 20.7.16.2.3, function capacity:
1045 operator bool() const {return __f_;}
1046
1047private:
1048 // deleted overloads close possible hole in the type system
1049 template<class _R2, class _B0, class _B1>
Howard Hinnant43d99232010-09-21 17:32:39 +00001050 bool operator==(const function<_R2(_B0, _B1)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +00001051 template<class _R2, class _B0, class _B1>
Howard Hinnant43d99232010-09-21 17:32:39 +00001052 bool operator!=(const function<_R2(_B0, _B1)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +00001053public:
1054 // 20.7.16.2.4, function invocation:
Howard Hinnantc003db12011-11-29 18:15:50 +00001055 _Rp operator()(_A0, _A1) const;
Howard Hinnant3e519522010-05-11 19:42:16 +00001056
Howard Hinnant54b409f2010-08-11 17:04:31 +00001057#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +00001058 // 20.7.16.2.5, function target access:
1059 const std::type_info& target_type() const;
Howard Hinnantc003db12011-11-29 18:15:50 +00001060 template <typename _Tp> _Tp* target();
1061 template <typename _Tp> const _Tp* target() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +00001062#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +00001063};
1064
Howard Hinnantc003db12011-11-29 18:15:50 +00001065template<class _Rp, class _A0, class _A1>
1066function<_Rp(_A0, _A1)>::function(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001067{
1068 if (__f.__f_ == 0)
1069 __f_ = 0;
1070 else if (__f.__f_ == (const __base*)&__f.__buf_)
1071 {
1072 __f_ = (__base*)&__buf_;
1073 __f.__f_->__clone(__f_);
1074 }
1075 else
1076 __f_ = __f.__f_->__clone();
1077}
1078
Howard Hinnantc003db12011-11-29 18:15:50 +00001079template<class _Rp, class _A0, class _A1>
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001080template<class _Alloc>
Howard Hinnantc003db12011-11-29 18:15:50 +00001081function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001082{
1083 if (__f.__f_ == 0)
1084 __f_ = 0;
1085 else if (__f.__f_ == (const __base*)&__f.__buf_)
1086 {
1087 __f_ = (__base*)&__buf_;
1088 __f.__f_->__clone(__f_);
1089 }
1090 else
1091 __f_ = __f.__f_->__clone();
1092}
1093
Howard Hinnantc003db12011-11-29 18:15:50 +00001094template<class _Rp, class _A0, class _A1>
1095template <class _Fp>
1096function<_Rp(_A0, _A1)>::function(_Fp __f,
1097 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant3e519522010-05-11 19:42:16 +00001098 : __f_(0)
1099{
Eric Fiselier0d28f782015-08-18 19:41:51 +00001100 if (__function::__not_null(__f))
Howard Hinnant3e519522010-05-11 19:42:16 +00001101 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001102 typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
Howard Hinnant3e519522010-05-11 19:42:16 +00001103 if (sizeof(_FF) <= sizeof(__buf_))
1104 {
1105 __f_ = (__base*)&__buf_;
1106 ::new (__f_) _FF(__f);
1107 }
1108 else
1109 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001110 typedef allocator<_FF> _Ap;
1111 _Ap __a;
1112 typedef __allocator_destructor<_Ap> _Dp;
1113 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1114 ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
Howard Hinnant3e519522010-05-11 19:42:16 +00001115 __f_ = __hold.release();
1116 }
1117 }
1118}
1119
Howard Hinnantc003db12011-11-29 18:15:50 +00001120template<class _Rp, class _A0, class _A1>
1121template <class _Fp, class _Alloc>
1122function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
1123 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001124 : __f_(0)
1125{
1126 typedef allocator_traits<_Alloc> __alloc_traits;
Eric Fiselier0d28f782015-08-18 19:41:51 +00001127 if (__function::__not_null(__f))
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001128 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001129 typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001130 if (sizeof(_FF) <= sizeof(__buf_))
1131 {
1132 __f_ = (__base*)&__buf_;
Eric Fiselierb11df182015-06-14 23:30:09 +00001133 ::new (__f_) _FF(__f, __a0);
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001134 }
1135 else
1136 {
Marshall Clow1f508012015-04-07 05:21:38 +00001137 typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +00001138 _Ap __a(__a0);
1139 typedef __allocator_destructor<_Ap> _Dp;
1140 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001141 ::new (__hold.get()) _FF(__f, _Alloc(__a));
1142 __f_ = __hold.release();
1143 }
1144 }
1145}
1146
Howard Hinnantc003db12011-11-29 18:15:50 +00001147template<class _Rp, class _A0, class _A1>
1148function<_Rp(_A0, _A1)>&
1149function<_Rp(_A0, _A1)>::operator=(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001150{
1151 function(__f).swap(*this);
1152 return *this;
1153}
1154
Howard Hinnantc003db12011-11-29 18:15:50 +00001155template<class _Rp, class _A0, class _A1>
1156function<_Rp(_A0, _A1)>&
1157function<_Rp(_A0, _A1)>::operator=(nullptr_t)
Howard Hinnant3e519522010-05-11 19:42:16 +00001158{
1159 if (__f_ == (__base*)&__buf_)
1160 __f_->destroy();
1161 else if (__f_)
1162 __f_->destroy_deallocate();
1163 __f_ = 0;
Eric Fiselier03d5dd22015-06-02 01:31:33 +00001164 return *this;
Howard Hinnant3e519522010-05-11 19:42:16 +00001165}
1166
Howard Hinnantc003db12011-11-29 18:15:50 +00001167template<class _Rp, class _A0, class _A1>
1168template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001169typename enable_if
1170<
Howard Hinnantc003db12011-11-29 18:15:50 +00001171 !is_integral<_Fp>::value,
1172 function<_Rp(_A0, _A1)>&
Howard Hinnant3e519522010-05-11 19:42:16 +00001173>::type
Howard Hinnantc003db12011-11-29 18:15:50 +00001174function<_Rp(_A0, _A1)>::operator=(_Fp __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001175{
Howard Hinnantce48a112011-06-30 21:18:19 +00001176 function(_VSTD::move(__f)).swap(*this);
Howard Hinnant3e519522010-05-11 19:42:16 +00001177 return *this;
1178}
1179
Howard Hinnantc003db12011-11-29 18:15:50 +00001180template<class _Rp, class _A0, class _A1>
1181function<_Rp(_A0, _A1)>::~function()
Howard Hinnant3e519522010-05-11 19:42:16 +00001182{
1183 if (__f_ == (__base*)&__buf_)
1184 __f_->destroy();
1185 else if (__f_)
1186 __f_->destroy_deallocate();
1187}
1188
Howard Hinnantc003db12011-11-29 18:15:50 +00001189template<class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +00001190void
Howard Hinnantc003db12011-11-29 18:15:50 +00001191function<_Rp(_A0, _A1)>::swap(function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001192{
1193 if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1194 {
1195 typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1196 __base* __t = (__base*)&__tempbuf;
1197 __f_->__clone(__t);
1198 __f_->destroy();
1199 __f_ = 0;
1200 __f.__f_->__clone((__base*)&__buf_);
1201 __f.__f_->destroy();
1202 __f.__f_ = 0;
1203 __f_ = (__base*)&__buf_;
1204 __t->__clone((__base*)&__f.__buf_);
1205 __t->destroy();
1206 __f.__f_ = (__base*)&__f.__buf_;
1207 }
1208 else if (__f_ == (__base*)&__buf_)
1209 {
1210 __f_->__clone((__base*)&__f.__buf_);
1211 __f_->destroy();
1212 __f_ = __f.__f_;
1213 __f.__f_ = (__base*)&__f.__buf_;
1214 }
1215 else if (__f.__f_ == (__base*)&__f.__buf_)
1216 {
1217 __f.__f_->__clone((__base*)&__buf_);
1218 __f.__f_->destroy();
1219 __f.__f_ = __f_;
1220 __f_ = (__base*)&__buf_;
1221 }
1222 else
Howard Hinnantce48a112011-06-30 21:18:19 +00001223 _VSTD::swap(__f_, __f.__f_);
Howard Hinnant3e519522010-05-11 19:42:16 +00001224}
1225
Howard Hinnantc003db12011-11-29 18:15:50 +00001226template<class _Rp, class _A0, class _A1>
1227_Rp
1228function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const
Howard Hinnant3e519522010-05-11 19:42:16 +00001229{
1230 if (__f_ == 0)
Marshall Clowd437fa52016-08-25 15:09:01 +00001231 __throw_bad_function_call();
Howard Hinnant3e519522010-05-11 19:42:16 +00001232 return (*__f_)(__a0, __a1);
1233}
1234
Howard Hinnant54b409f2010-08-11 17:04:31 +00001235#ifndef _LIBCPP_NO_RTTI
1236
Howard Hinnantc003db12011-11-29 18:15:50 +00001237template<class _Rp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +00001238const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +00001239function<_Rp(_A0, _A1)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +00001240{
1241 if (__f_ == 0)
1242 return typeid(void);
1243 return __f_->target_type();
1244}
1245
Howard Hinnantc003db12011-11-29 18:15:50 +00001246template<class _Rp, class _A0, class _A1>
1247template <typename _Tp>
1248_Tp*
1249function<_Rp(_A0, _A1)>::target()
Howard Hinnant3e519522010-05-11 19:42:16 +00001250{
1251 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +00001252 return (_Tp*)0;
1253 return (_Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +00001254}
1255
Howard Hinnantc003db12011-11-29 18:15:50 +00001256template<class _Rp, class _A0, class _A1>
1257template <typename _Tp>
1258const _Tp*
1259function<_Rp(_A0, _A1)>::target() const
Howard Hinnant3e519522010-05-11 19:42:16 +00001260{
1261 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +00001262 return (const _Tp*)0;
1263 return (const _Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +00001264}
1265
Howard Hinnantb3371f62010-08-22 00:02:43 +00001266#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +00001267
Howard Hinnantc003db12011-11-29 18:15:50 +00001268template<class _Rp, class _A0, class _A1, class _A2>
Howard Hinnantf0544c22013-08-12 18:38:34 +00001269class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1, _A2)>
Howard Hinnant3e519522010-05-11 19:42:16 +00001270{
Howard Hinnantc003db12011-11-29 18:15:50 +00001271 typedef __function::__base<_Rp(_A0, _A1, _A2)> __base;
Howard Hinnant3e519522010-05-11 19:42:16 +00001272 aligned_storage<3*sizeof(void*)>::type __buf_;
1273 __base* __f_;
1274
Howard Hinnant3e519522010-05-11 19:42:16 +00001275public:
Howard Hinnantc003db12011-11-29 18:15:50 +00001276 typedef _Rp result_type;
Howard Hinnant3e519522010-05-11 19:42:16 +00001277
1278 // 20.7.16.2.1, construct/copy/destroy:
Howard Hinnant43d99232010-09-21 17:32:39 +00001279 _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
1280 _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
Howard Hinnant3e519522010-05-11 19:42:16 +00001281 function(const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001282 template<class _Fp>
1283 function(_Fp,
1284 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +00001285
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001286 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001288 function(allocator_arg_t, const _Alloc&) : __f_(0) {}
1289 template<class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001290 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001291 function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
1292 template<class _Alloc>
1293 function(allocator_arg_t, const _Alloc&, const function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001294 template<class _Fp, class _Alloc>
1295 function(allocator_arg_t, const _Alloc& __a, _Fp __f,
1296 typename enable_if<!is_integral<_Fp>::value>::type* = 0);
Howard Hinnant3e519522010-05-11 19:42:16 +00001297
1298 function& operator=(const function&);
1299 function& operator=(nullptr_t);
Howard Hinnantc003db12011-11-29 18:15:50 +00001300 template<class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001301 typename enable_if
1302 <
Howard Hinnantc003db12011-11-29 18:15:50 +00001303 !is_integral<_Fp>::value,
Howard Hinnant3e519522010-05-11 19:42:16 +00001304 function&
1305 >::type
Howard Hinnantc003db12011-11-29 18:15:50 +00001306 operator=(_Fp);
Howard Hinnant3e519522010-05-11 19:42:16 +00001307
1308 ~function();
1309
1310 // 20.7.16.2.2, function modifiers:
1311 void swap(function&);
Howard Hinnantc003db12011-11-29 18:15:50 +00001312 template<class _Fp, class _Alloc>
Howard Hinnant43d99232010-09-21 17:32:39 +00001313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +00001314 void assign(_Fp __f, const _Alloc& __a)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001315 {function(allocator_arg, __a, __f).swap(*this);}
Howard Hinnant3e519522010-05-11 19:42:16 +00001316
1317 // 20.7.16.2.3, function capacity:
Howard Hinnant43d99232010-09-21 17:32:39 +00001318 _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
Howard Hinnant3e519522010-05-11 19:42:16 +00001319
1320private:
1321 // deleted overloads close possible hole in the type system
1322 template<class _R2, class _B0, class _B1, class _B2>
Howard Hinnant43d99232010-09-21 17:32:39 +00001323 bool operator==(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +00001324 template<class _R2, class _B0, class _B1, class _B2>
Howard Hinnant43d99232010-09-21 17:32:39 +00001325 bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
Howard Hinnant3e519522010-05-11 19:42:16 +00001326public:
1327 // 20.7.16.2.4, function invocation:
Howard Hinnantc003db12011-11-29 18:15:50 +00001328 _Rp operator()(_A0, _A1, _A2) const;
Howard Hinnant3e519522010-05-11 19:42:16 +00001329
Howard Hinnant54b409f2010-08-11 17:04:31 +00001330#ifndef _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +00001331 // 20.7.16.2.5, function target access:
1332 const std::type_info& target_type() const;
Howard Hinnantc003db12011-11-29 18:15:50 +00001333 template <typename _Tp> _Tp* target();
1334 template <typename _Tp> const _Tp* target() const;
Howard Hinnantb3371f62010-08-22 00:02:43 +00001335#endif // _LIBCPP_NO_RTTI
Howard Hinnant3e519522010-05-11 19:42:16 +00001336};
1337
Howard Hinnantc003db12011-11-29 18:15:50 +00001338template<class _Rp, class _A0, class _A1, class _A2>
1339function<_Rp(_A0, _A1, _A2)>::function(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001340{
1341 if (__f.__f_ == 0)
1342 __f_ = 0;
1343 else if (__f.__f_ == (const __base*)&__f.__buf_)
1344 {
1345 __f_ = (__base*)&__buf_;
1346 __f.__f_->__clone(__f_);
1347 }
1348 else
1349 __f_ = __f.__f_->__clone();
1350}
1351
Howard Hinnantc003db12011-11-29 18:15:50 +00001352template<class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001353template<class _Alloc>
Howard Hinnantc003db12011-11-29 18:15:50 +00001354function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&,
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001355 const function& __f)
1356{
1357 if (__f.__f_ == 0)
1358 __f_ = 0;
1359 else if (__f.__f_ == (const __base*)&__f.__buf_)
1360 {
1361 __f_ = (__base*)&__buf_;
1362 __f.__f_->__clone(__f_);
1363 }
1364 else
1365 __f_ = __f.__f_->__clone();
1366}
1367
Howard Hinnantc003db12011-11-29 18:15:50 +00001368template<class _Rp, class _A0, class _A1, class _A2>
1369template <class _Fp>
1370function<_Rp(_A0, _A1, _A2)>::function(_Fp __f,
1371 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant3e519522010-05-11 19:42:16 +00001372 : __f_(0)
1373{
Eric Fiselier0d28f782015-08-18 19:41:51 +00001374 if (__function::__not_null(__f))
Howard Hinnant3e519522010-05-11 19:42:16 +00001375 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001376 typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
Howard Hinnant3e519522010-05-11 19:42:16 +00001377 if (sizeof(_FF) <= sizeof(__buf_))
1378 {
1379 __f_ = (__base*)&__buf_;
1380 ::new (__f_) _FF(__f);
1381 }
1382 else
1383 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001384 typedef allocator<_FF> _Ap;
1385 _Ap __a;
1386 typedef __allocator_destructor<_Ap> _Dp;
1387 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1388 ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
Howard Hinnant3e519522010-05-11 19:42:16 +00001389 __f_ = __hold.release();
1390 }
1391 }
1392}
1393
Howard Hinnantc003db12011-11-29 18:15:50 +00001394template<class _Rp, class _A0, class _A1, class _A2>
1395template <class _Fp, class _Alloc>
1396function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
1397 typename enable_if<!is_integral<_Fp>::value>::type*)
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001398 : __f_(0)
1399{
1400 typedef allocator_traits<_Alloc> __alloc_traits;
Eric Fiselier0d28f782015-08-18 19:41:51 +00001401 if (__function::__not_null(__f))
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001402 {
Howard Hinnantc003db12011-11-29 18:15:50 +00001403 typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001404 if (sizeof(_FF) <= sizeof(__buf_))
1405 {
1406 __f_ = (__base*)&__buf_;
Eric Fiselierb11df182015-06-14 23:30:09 +00001407 ::new (__f_) _FF(__f, __a0);
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001408 }
1409 else
1410 {
Marshall Clow1f508012015-04-07 05:21:38 +00001411 typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
Howard Hinnantc003db12011-11-29 18:15:50 +00001412 _Ap __a(__a0);
1413 typedef __allocator_destructor<_Ap> _Dp;
1414 unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
Howard Hinnant9b0b6d42010-08-20 19:36:46 +00001415 ::new (__hold.get()) _FF(__f, _Alloc(__a));
1416 __f_ = __hold.release();
1417 }
1418 }
1419}
1420
Howard Hinnantc003db12011-11-29 18:15:50 +00001421template<class _Rp, class _A0, class _A1, class _A2>
1422function<_Rp(_A0, _A1, _A2)>&
1423function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001424{
1425 function(__f).swap(*this);
1426 return *this;
1427}
1428
Howard Hinnantc003db12011-11-29 18:15:50 +00001429template<class _Rp, class _A0, class _A1, class _A2>
1430function<_Rp(_A0, _A1, _A2)>&
1431function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t)
Howard Hinnant3e519522010-05-11 19:42:16 +00001432{
1433 if (__f_ == (__base*)&__buf_)
1434 __f_->destroy();
1435 else if (__f_)
1436 __f_->destroy_deallocate();
1437 __f_ = 0;
Eric Fiselier03d5dd22015-06-02 01:31:33 +00001438 return *this;
Howard Hinnant3e519522010-05-11 19:42:16 +00001439}
1440
Howard Hinnantc003db12011-11-29 18:15:50 +00001441template<class _Rp, class _A0, class _A1, class _A2>
1442template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001443typename enable_if
1444<
Howard Hinnantc003db12011-11-29 18:15:50 +00001445 !is_integral<_Fp>::value,
1446 function<_Rp(_A0, _A1, _A2)>&
Howard Hinnant3e519522010-05-11 19:42:16 +00001447>::type
Howard Hinnantc003db12011-11-29 18:15:50 +00001448function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001449{
Howard Hinnantce48a112011-06-30 21:18:19 +00001450 function(_VSTD::move(__f)).swap(*this);
Howard Hinnant3e519522010-05-11 19:42:16 +00001451 return *this;
1452}
1453
Howard Hinnantc003db12011-11-29 18:15:50 +00001454template<class _Rp, class _A0, class _A1, class _A2>
1455function<_Rp(_A0, _A1, _A2)>::~function()
Howard Hinnant3e519522010-05-11 19:42:16 +00001456{
1457 if (__f_ == (__base*)&__buf_)
1458 __f_->destroy();
1459 else if (__f_)
1460 __f_->destroy_deallocate();
1461}
1462
Howard Hinnantc003db12011-11-29 18:15:50 +00001463template<class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +00001464void
Howard Hinnantc003db12011-11-29 18:15:50 +00001465function<_Rp(_A0, _A1, _A2)>::swap(function& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +00001466{
1467 if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1468 {
1469 typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1470 __base* __t = (__base*)&__tempbuf;
1471 __f_->__clone(__t);
1472 __f_->destroy();
1473 __f_ = 0;
1474 __f.__f_->__clone((__base*)&__buf_);
1475 __f.__f_->destroy();
1476 __f.__f_ = 0;
1477 __f_ = (__base*)&__buf_;
1478 __t->__clone((__base*)&__f.__buf_);
1479 __t->destroy();
1480 __f.__f_ = (__base*)&__f.__buf_;
1481 }
1482 else if (__f_ == (__base*)&__buf_)
1483 {
1484 __f_->__clone((__base*)&__f.__buf_);
1485 __f_->destroy();
1486 __f_ = __f.__f_;
1487 __f.__f_ = (__base*)&__f.__buf_;
1488 }
1489 else if (__f.__f_ == (__base*)&__f.__buf_)
1490 {
1491 __f.__f_->__clone((__base*)&__buf_);
1492 __f.__f_->destroy();
1493 __f.__f_ = __f_;
1494 __f_ = (__base*)&__buf_;
1495 }
1496 else
Howard Hinnantce48a112011-06-30 21:18:19 +00001497 _VSTD::swap(__f_, __f.__f_);
Howard Hinnant3e519522010-05-11 19:42:16 +00001498}
1499
Howard Hinnantc003db12011-11-29 18:15:50 +00001500template<class _Rp, class _A0, class _A1, class _A2>
1501_Rp
1502function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const
Howard Hinnant3e519522010-05-11 19:42:16 +00001503{
1504 if (__f_ == 0)
Marshall Clowd437fa52016-08-25 15:09:01 +00001505 __throw_bad_function_call();
Howard Hinnant3e519522010-05-11 19:42:16 +00001506 return (*__f_)(__a0, __a1, __a2);
1507}
1508
Howard Hinnant54b409f2010-08-11 17:04:31 +00001509#ifndef _LIBCPP_NO_RTTI
1510
Howard Hinnantc003db12011-11-29 18:15:50 +00001511template<class _Rp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +00001512const std::type_info&
Howard Hinnantc003db12011-11-29 18:15:50 +00001513function<_Rp(_A0, _A1, _A2)>::target_type() const
Howard Hinnant3e519522010-05-11 19:42:16 +00001514{
1515 if (__f_ == 0)
1516 return typeid(void);
1517 return __f_->target_type();
1518}
1519
Howard Hinnantc003db12011-11-29 18:15:50 +00001520template<class _Rp, class _A0, class _A1, class _A2>
1521template <typename _Tp>
1522_Tp*
1523function<_Rp(_A0, _A1, _A2)>::target()
Howard Hinnant3e519522010-05-11 19:42:16 +00001524{
1525 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +00001526 return (_Tp*)0;
1527 return (_Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +00001528}
1529
Howard Hinnantc003db12011-11-29 18:15:50 +00001530template<class _Rp, class _A0, class _A1, class _A2>
1531template <typename _Tp>
1532const _Tp*
1533function<_Rp(_A0, _A1, _A2)>::target() const
Howard Hinnant3e519522010-05-11 19:42:16 +00001534{
1535 if (__f_ == 0)
Howard Hinnantc003db12011-11-29 18:15:50 +00001536 return (const _Tp*)0;
1537 return (const _Tp*)__f_->target(typeid(_Tp));
Howard Hinnant3e519522010-05-11 19:42:16 +00001538}
1539
Howard Hinnantb3371f62010-08-22 00:02:43 +00001540#endif // _LIBCPP_NO_RTTI
Howard Hinnant54b409f2010-08-11 17:04:31 +00001541
Howard Hinnantc003db12011-11-29 18:15:50 +00001542template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001543inline _LIBCPP_INLINE_VISIBILITY
1544bool
Howard Hinnantc003db12011-11-29 18:15:50 +00001545operator==(const function<_Fp>& __f, nullptr_t) {return !__f;}
Howard Hinnant3e519522010-05-11 19:42:16 +00001546
Howard Hinnantc003db12011-11-29 18:15:50 +00001547template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001548inline _LIBCPP_INLINE_VISIBILITY
1549bool
Howard Hinnantc003db12011-11-29 18:15:50 +00001550operator==(nullptr_t, const function<_Fp>& __f) {return !__f;}
Howard Hinnant3e519522010-05-11 19:42:16 +00001551
Howard Hinnantc003db12011-11-29 18:15:50 +00001552template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001553inline _LIBCPP_INLINE_VISIBILITY
1554bool
Howard Hinnantc003db12011-11-29 18:15:50 +00001555operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;}
Howard Hinnant3e519522010-05-11 19:42:16 +00001556
Howard Hinnantc003db12011-11-29 18:15:50 +00001557template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001558inline _LIBCPP_INLINE_VISIBILITY
1559bool
Howard Hinnantc003db12011-11-29 18:15:50 +00001560operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;}
Howard Hinnant3e519522010-05-11 19:42:16 +00001561
Howard Hinnantc003db12011-11-29 18:15:50 +00001562template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +00001563inline _LIBCPP_INLINE_VISIBILITY
1564void
Howard Hinnantc003db12011-11-29 18:15:50 +00001565swap(function<_Fp>& __x, function<_Fp>& __y)
Howard Hinnant3e519522010-05-11 19:42:16 +00001566{return __x.swap(__y);}
1567
Howard Hinnantb3371f62010-08-22 00:02:43 +00001568#endif // _LIBCPP_FUNCTIONAL_03