xref: /aosp_15_r20/external/libcxx/include/__functional_03 (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
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