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