xref: /aosp_15_r20/external/libcxx/include/__functional_base (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_BASE
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_FUNCTIONAL_BASE
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker#include <__config>
15*58b9f456SAndroid Build Coastguard Worker#include <type_traits>
16*58b9f456SAndroid Build Coastguard Worker#include <typeinfo>
17*58b9f456SAndroid Build Coastguard Worker#include <exception>
18*58b9f456SAndroid Build Coastguard Worker#include <new>
19*58b9f456SAndroid Build Coastguard Worker#include <utility>
20*58b9f456SAndroid Build Coastguard Worker
21*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
22*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header
23*58b9f456SAndroid Build Coastguard Worker#endif
24*58b9f456SAndroid Build Coastguard Worker
25*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD
26*58b9f456SAndroid Build Coastguard Worker
27*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg1, class _Arg2, class _Result>
28*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS binary_function
29*58b9f456SAndroid Build Coastguard Worker{
30*58b9f456SAndroid Build Coastguard Worker    typedef _Arg1   first_argument_type;
31*58b9f456SAndroid Build Coastguard Worker    typedef _Arg2   second_argument_type;
32*58b9f456SAndroid Build Coastguard Worker    typedef _Result result_type;
33*58b9f456SAndroid Build Coastguard Worker};
34*58b9f456SAndroid Build Coastguard Worker
35*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
36*58b9f456SAndroid Build Coastguard Workerstruct __has_result_type
37*58b9f456SAndroid Build Coastguard Worker{
38*58b9f456SAndroid Build Coastguard Workerprivate:
39*58b9f456SAndroid Build Coastguard Worker    struct __two {char __lx; char __lxx;};
40*58b9f456SAndroid Build Coastguard Worker    template <class _Up> static __two __test(...);
41*58b9f456SAndroid Build Coastguard Worker    template <class _Up> static char __test(typename _Up::result_type* = 0);
42*58b9f456SAndroid Build Coastguard Workerpublic:
43*58b9f456SAndroid Build Coastguard Worker    static const bool value = sizeof(__test<_Tp>(0)) == 1;
44*58b9f456SAndroid Build Coastguard Worker};
45*58b9f456SAndroid Build Coastguard Worker
46*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
47*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp = void>
48*58b9f456SAndroid Build Coastguard Worker#else
49*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
50*58b9f456SAndroid Build Coastguard Worker#endif
51*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less : binary_function<_Tp, _Tp, bool>
52*58b9f456SAndroid Build Coastguard Worker{
53*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
54*58b9f456SAndroid Build Coastguard Worker    bool operator()(const _Tp& __x, const _Tp& __y) const
55*58b9f456SAndroid Build Coastguard Worker        {return __x < __y;}
56*58b9f456SAndroid Build Coastguard Worker};
57*58b9f456SAndroid Build Coastguard Worker
58*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
59*58b9f456SAndroid Build Coastguard Workertemplate <>
60*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS less<void>
61*58b9f456SAndroid Build Coastguard Worker{
62*58b9f456SAndroid Build Coastguard Worker    template <class _T1, class _T2>
63*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
64*58b9f456SAndroid Build Coastguard Worker    auto operator()(_T1&& __t, _T2&& __u) const
65*58b9f456SAndroid Build Coastguard Worker    _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)))
66*58b9f456SAndroid Build Coastguard Worker    -> decltype        (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))
67*58b9f456SAndroid Build Coastguard Worker        { return        _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); }
68*58b9f456SAndroid Build Coastguard Worker    typedef void is_transparent;
69*58b9f456SAndroid Build Coastguard Worker};
70*58b9f456SAndroid Build Coastguard Worker#endif
71*58b9f456SAndroid Build Coastguard Worker
72*58b9f456SAndroid Build Coastguard Worker// __weak_result_type
73*58b9f456SAndroid Build Coastguard Worker
74*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
75*58b9f456SAndroid Build Coastguard Workerstruct __derives_from_unary_function
76*58b9f456SAndroid Build Coastguard Worker{
77*58b9f456SAndroid Build Coastguard Workerprivate:
78*58b9f456SAndroid Build Coastguard Worker    struct __two {char __lx; char __lxx;};
79*58b9f456SAndroid Build Coastguard Worker    static __two __test(...);
80*58b9f456SAndroid Build Coastguard Worker    template <class _Ap, class _Rp>
81*58b9f456SAndroid Build Coastguard Worker        static unary_function<_Ap, _Rp>
82*58b9f456SAndroid Build Coastguard Worker        __test(const volatile unary_function<_Ap, _Rp>*);
83*58b9f456SAndroid Build Coastguard Workerpublic:
84*58b9f456SAndroid Build Coastguard Worker    static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
85*58b9f456SAndroid Build Coastguard Worker    typedef decltype(__test((_Tp*)0)) type;
86*58b9f456SAndroid Build Coastguard Worker};
87*58b9f456SAndroid Build Coastguard Worker
88*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
89*58b9f456SAndroid Build Coastguard Workerstruct __derives_from_binary_function
90*58b9f456SAndroid Build Coastguard Worker{
91*58b9f456SAndroid Build Coastguard Workerprivate:
92*58b9f456SAndroid Build Coastguard Worker    struct __two {char __lx; char __lxx;};
93*58b9f456SAndroid Build Coastguard Worker    static __two __test(...);
94*58b9f456SAndroid Build Coastguard Worker    template <class _A1, class _A2, class _Rp>
95*58b9f456SAndroid Build Coastguard Worker        static binary_function<_A1, _A2, _Rp>
96*58b9f456SAndroid Build Coastguard Worker        __test(const volatile binary_function<_A1, _A2, _Rp>*);
97*58b9f456SAndroid Build Coastguard Workerpublic:
98*58b9f456SAndroid Build Coastguard Worker    static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
99*58b9f456SAndroid Build Coastguard Worker    typedef decltype(__test((_Tp*)0)) type;
100*58b9f456SAndroid Build Coastguard Worker};
101*58b9f456SAndroid Build Coastguard Worker
102*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
103*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function  // bool is true
104*58b9f456SAndroid Build Coastguard Worker    : public __derives_from_unary_function<_Tp>::type
105*58b9f456SAndroid Build Coastguard Worker{
106*58b9f456SAndroid Build Coastguard Worker};
107*58b9f456SAndroid Build Coastguard Worker
108*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
109*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_unary_function<_Tp, false>
110*58b9f456SAndroid Build Coastguard Worker{
111*58b9f456SAndroid Build Coastguard Worker};
112*58b9f456SAndroid Build Coastguard Worker
113*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
114*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function  // bool is true
115*58b9f456SAndroid Build Coastguard Worker    : public __derives_from_binary_function<_Tp>::type
116*58b9f456SAndroid Build Coastguard Worker{
117*58b9f456SAndroid Build Coastguard Worker};
118*58b9f456SAndroid Build Coastguard Worker
119*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
120*58b9f456SAndroid Build Coastguard Workerstruct __maybe_derive_from_binary_function<_Tp, false>
121*58b9f456SAndroid Build Coastguard Worker{
122*58b9f456SAndroid Build Coastguard Worker};
123*58b9f456SAndroid Build Coastguard Worker
124*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = __has_result_type<_Tp>::value>
125*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type_imp // bool is true
126*58b9f456SAndroid Build Coastguard Worker    : public __maybe_derive_from_unary_function<_Tp>,
127*58b9f456SAndroid Build Coastguard Worker      public __maybe_derive_from_binary_function<_Tp>
128*58b9f456SAndroid Build Coastguard Worker{
129*58b9f456SAndroid Build Coastguard Worker    typedef typename _Tp::result_type result_type;
130*58b9f456SAndroid Build Coastguard Worker};
131*58b9f456SAndroid Build Coastguard Worker
132*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
133*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type_imp<_Tp, false>
134*58b9f456SAndroid Build Coastguard Worker    : public __maybe_derive_from_unary_function<_Tp>,
135*58b9f456SAndroid Build Coastguard Worker      public __maybe_derive_from_binary_function<_Tp>
136*58b9f456SAndroid Build Coastguard Worker{
137*58b9f456SAndroid Build Coastguard Worker};
138*58b9f456SAndroid Build Coastguard Worker
139*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
140*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type
141*58b9f456SAndroid Build Coastguard Worker    : public __weak_result_type_imp<_Tp>
142*58b9f456SAndroid Build Coastguard Worker{
143*58b9f456SAndroid Build Coastguard Worker};
144*58b9f456SAndroid Build Coastguard Worker
145*58b9f456SAndroid Build Coastguard Worker// 0 argument case
146*58b9f456SAndroid Build Coastguard Worker
147*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp>
148*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp ()>
149*58b9f456SAndroid Build Coastguard Worker{
150*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
151*58b9f456SAndroid Build Coastguard Worker};
152*58b9f456SAndroid Build Coastguard Worker
153*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp>
154*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (&)()>
155*58b9f456SAndroid Build Coastguard Worker{
156*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
157*58b9f456SAndroid Build Coastguard Worker};
158*58b9f456SAndroid Build Coastguard Worker
159*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp>
160*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (*)()>
161*58b9f456SAndroid Build Coastguard Worker{
162*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
163*58b9f456SAndroid Build Coastguard Worker};
164*58b9f456SAndroid Build Coastguard Worker
165*58b9f456SAndroid Build Coastguard Worker// 1 argument case
166*58b9f456SAndroid Build Coastguard Worker
167*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1>
168*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_A1)>
169*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_A1, _Rp>
170*58b9f456SAndroid Build Coastguard Worker{
171*58b9f456SAndroid Build Coastguard Worker};
172*58b9f456SAndroid Build Coastguard Worker
173*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1>
174*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (&)(_A1)>
175*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_A1, _Rp>
176*58b9f456SAndroid Build Coastguard Worker{
177*58b9f456SAndroid Build Coastguard Worker};
178*58b9f456SAndroid Build Coastguard Worker
179*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1>
180*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (*)(_A1)>
181*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_A1, _Rp>
182*58b9f456SAndroid Build Coastguard Worker{
183*58b9f456SAndroid Build Coastguard Worker};
184*58b9f456SAndroid Build Coastguard Worker
185*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp>
186*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)()>
187*58b9f456SAndroid Build Coastguard Worker    : public unary_function<_Cp*, _Rp>
188*58b9f456SAndroid Build Coastguard Worker{
189*58b9f456SAndroid Build Coastguard Worker};
190*58b9f456SAndroid Build Coastguard Worker
191*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp>
192*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)() const>
193*58b9f456SAndroid Build Coastguard Worker    : public unary_function<const _Cp*, _Rp>
194*58b9f456SAndroid Build Coastguard Worker{
195*58b9f456SAndroid Build Coastguard Worker};
196*58b9f456SAndroid Build Coastguard Worker
197*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp>
198*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)() volatile>
199*58b9f456SAndroid Build Coastguard Worker    : public unary_function<volatile _Cp*, _Rp>
200*58b9f456SAndroid Build Coastguard Worker{
201*58b9f456SAndroid Build Coastguard Worker};
202*58b9f456SAndroid Build Coastguard Worker
203*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp>
204*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)() const volatile>
205*58b9f456SAndroid Build Coastguard Worker    : public unary_function<const volatile _Cp*, _Rp>
206*58b9f456SAndroid Build Coastguard Worker{
207*58b9f456SAndroid Build Coastguard Worker};
208*58b9f456SAndroid Build Coastguard Worker
209*58b9f456SAndroid Build Coastguard Worker// 2 argument case
210*58b9f456SAndroid Build Coastguard Worker
211*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2>
212*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_A1, _A2)>
213*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_A1, _A2, _Rp>
214*58b9f456SAndroid Build Coastguard Worker{
215*58b9f456SAndroid Build Coastguard Worker};
216*58b9f456SAndroid Build Coastguard Worker
217*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2>
218*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (*)(_A1, _A2)>
219*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_A1, _A2, _Rp>
220*58b9f456SAndroid Build Coastguard Worker{
221*58b9f456SAndroid Build Coastguard Worker};
222*58b9f456SAndroid Build Coastguard Worker
223*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2>
224*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (&)(_A1, _A2)>
225*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_A1, _A2, _Rp>
226*58b9f456SAndroid Build Coastguard Worker{
227*58b9f456SAndroid Build Coastguard Worker};
228*58b9f456SAndroid Build Coastguard Worker
229*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1>
230*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1)>
231*58b9f456SAndroid Build Coastguard Worker    : public binary_function<_Cp*, _A1, _Rp>
232*58b9f456SAndroid Build Coastguard Worker{
233*58b9f456SAndroid Build Coastguard Worker};
234*58b9f456SAndroid Build Coastguard Worker
235*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1>
236*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1) const>
237*58b9f456SAndroid Build Coastguard Worker    : public binary_function<const _Cp*, _A1, _Rp>
238*58b9f456SAndroid Build Coastguard Worker{
239*58b9f456SAndroid Build Coastguard Worker};
240*58b9f456SAndroid Build Coastguard Worker
241*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1>
242*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
243*58b9f456SAndroid Build Coastguard Worker    : public binary_function<volatile _Cp*, _A1, _Rp>
244*58b9f456SAndroid Build Coastguard Worker{
245*58b9f456SAndroid Build Coastguard Worker};
246*58b9f456SAndroid Build Coastguard Worker
247*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1>
248*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
249*58b9f456SAndroid Build Coastguard Worker    : public binary_function<const volatile _Cp*, _A1, _Rp>
250*58b9f456SAndroid Build Coastguard Worker{
251*58b9f456SAndroid Build Coastguard Worker};
252*58b9f456SAndroid Build Coastguard Worker
253*58b9f456SAndroid Build Coastguard Worker
254*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
255*58b9f456SAndroid Build Coastguard Worker// 3 or more arguments
256*58b9f456SAndroid Build Coastguard Worker
257*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
258*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)>
259*58b9f456SAndroid Build Coastguard Worker{
260*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
261*58b9f456SAndroid Build Coastguard Worker};
262*58b9f456SAndroid Build Coastguard Worker
263*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
264*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)>
265*58b9f456SAndroid Build Coastguard Worker{
266*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
267*58b9f456SAndroid Build Coastguard Worker};
268*58b9f456SAndroid Build Coastguard Worker
269*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
270*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)>
271*58b9f456SAndroid Build Coastguard Worker{
272*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
273*58b9f456SAndroid Build Coastguard Worker};
274*58b9f456SAndroid Build Coastguard Worker
275*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
276*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)>
277*58b9f456SAndroid Build Coastguard Worker{
278*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
279*58b9f456SAndroid Build Coastguard Worker};
280*58b9f456SAndroid Build Coastguard Worker
281*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
282*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const>
283*58b9f456SAndroid Build Coastguard Worker{
284*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
285*58b9f456SAndroid Build Coastguard Worker};
286*58b9f456SAndroid Build Coastguard Worker
287*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
288*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile>
289*58b9f456SAndroid Build Coastguard Worker{
290*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
291*58b9f456SAndroid Build Coastguard Worker};
292*58b9f456SAndroid Build Coastguard Worker
293*58b9f456SAndroid Build Coastguard Workertemplate <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
294*58b9f456SAndroid Build Coastguard Workerstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
295*58b9f456SAndroid Build Coastguard Worker{
296*58b9f456SAndroid Build Coastguard Worker    typedef _Rp result_type;
297*58b9f456SAndroid Build Coastguard Worker};
298*58b9f456SAndroid Build Coastguard Worker
299*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class ..._Args>
300*58b9f456SAndroid Build Coastguard Workerstruct __invoke_return
301*58b9f456SAndroid Build Coastguard Worker{
302*58b9f456SAndroid Build Coastguard Worker    typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
303*58b9f456SAndroid Build Coastguard Worker};
304*58b9f456SAndroid Build Coastguard Worker
305*58b9f456SAndroid Build Coastguard Worker#else // defined(_LIBCPP_CXX03_LANG)
306*58b9f456SAndroid Build Coastguard Worker
307*58b9f456SAndroid Build Coastguard Worker#include <__functional_base_03>
308*58b9f456SAndroid Build Coastguard Worker
309*58b9f456SAndroid Build Coastguard Worker#endif  // !defined(_LIBCPP_CXX03_LANG)
310*58b9f456SAndroid Build Coastguard Worker
311*58b9f456SAndroid Build Coastguard Worker
312*58b9f456SAndroid Build Coastguard Workertemplate <class _Ret>
313*58b9f456SAndroid Build Coastguard Workerstruct __invoke_void_return_wrapper
314*58b9f456SAndroid Build Coastguard Worker{
315*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
316*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
317*58b9f456SAndroid Build Coastguard Worker    static _Ret __call(_Args&&... __args) {
318*58b9f456SAndroid Build Coastguard Worker        return __invoke(_VSTD::forward<_Args>(__args)...);
319*58b9f456SAndroid Build Coastguard Worker    }
320*58b9f456SAndroid Build Coastguard Worker#else
321*58b9f456SAndroid Build Coastguard Worker    template <class _Fn>
322*58b9f456SAndroid Build Coastguard Worker    static _Ret __call(_Fn __f) {
323*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f);
324*58b9f456SAndroid Build Coastguard Worker    }
325*58b9f456SAndroid Build Coastguard Worker
326*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0>
327*58b9f456SAndroid Build Coastguard Worker    static _Ret __call(_Fn __f, _A0& __a0) {
328*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f, __a0);
329*58b9f456SAndroid Build Coastguard Worker    }
330*58b9f456SAndroid Build Coastguard Worker
331*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0, class _A1>
332*58b9f456SAndroid Build Coastguard Worker    static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) {
333*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f, __a0, __a1);
334*58b9f456SAndroid Build Coastguard Worker    }
335*58b9f456SAndroid Build Coastguard Worker
336*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0, class _A1, class _A2>
337*58b9f456SAndroid Build Coastguard Worker    static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){
338*58b9f456SAndroid Build Coastguard Worker        return __invoke(__f, __a0, __a1, __a2);
339*58b9f456SAndroid Build Coastguard Worker    }
340*58b9f456SAndroid Build Coastguard Worker#endif
341*58b9f456SAndroid Build Coastguard Worker};
342*58b9f456SAndroid Build Coastguard Worker
343*58b9f456SAndroid Build Coastguard Workertemplate <>
344*58b9f456SAndroid Build Coastguard Workerstruct __invoke_void_return_wrapper<void>
345*58b9f456SAndroid Build Coastguard Worker{
346*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
347*58b9f456SAndroid Build Coastguard Worker    template <class ..._Args>
348*58b9f456SAndroid Build Coastguard Worker    static void __call(_Args&&... __args) {
349*58b9f456SAndroid Build Coastguard Worker        __invoke(_VSTD::forward<_Args>(__args)...);
350*58b9f456SAndroid Build Coastguard Worker    }
351*58b9f456SAndroid Build Coastguard Worker#else
352*58b9f456SAndroid Build Coastguard Worker    template <class _Fn>
353*58b9f456SAndroid Build Coastguard Worker    static void __call(_Fn __f) {
354*58b9f456SAndroid Build Coastguard Worker        __invoke(__f);
355*58b9f456SAndroid Build Coastguard Worker    }
356*58b9f456SAndroid Build Coastguard Worker
357*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0>
358*58b9f456SAndroid Build Coastguard Worker    static void __call(_Fn __f, _A0& __a0) {
359*58b9f456SAndroid Build Coastguard Worker        __invoke(__f, __a0);
360*58b9f456SAndroid Build Coastguard Worker    }
361*58b9f456SAndroid Build Coastguard Worker
362*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0, class _A1>
363*58b9f456SAndroid Build Coastguard Worker    static void __call(_Fn __f, _A0& __a0, _A1& __a1) {
364*58b9f456SAndroid Build Coastguard Worker        __invoke(__f, __a0, __a1);
365*58b9f456SAndroid Build Coastguard Worker    }
366*58b9f456SAndroid Build Coastguard Worker
367*58b9f456SAndroid Build Coastguard Worker    template <class _Fn, class _A0, class _A1, class _A2>
368*58b9f456SAndroid Build Coastguard Worker    static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) {
369*58b9f456SAndroid Build Coastguard Worker        __invoke(__f, __a0, __a1, __a2);
370*58b9f456SAndroid Build Coastguard Worker    }
371*58b9f456SAndroid Build Coastguard Worker#endif
372*58b9f456SAndroid Build Coastguard Worker};
373*58b9f456SAndroid Build Coastguard Worker
374*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
375*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS reference_wrapper
376*58b9f456SAndroid Build Coastguard Worker    : public __weak_result_type<_Tp>
377*58b9f456SAndroid Build Coastguard Worker{
378*58b9f456SAndroid Build Coastguard Workerpublic:
379*58b9f456SAndroid Build Coastguard Worker    // types
380*58b9f456SAndroid Build Coastguard Worker    typedef _Tp type;
381*58b9f456SAndroid Build Coastguard Workerprivate:
382*58b9f456SAndroid Build Coastguard Worker    type* __f_;
383*58b9f456SAndroid Build Coastguard Worker
384*58b9f456SAndroid Build Coastguard Workerpublic:
385*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy
386*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
387*58b9f456SAndroid Build Coastguard Worker        : __f_(_VSTD::addressof(__f)) {}
388*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
389*58b9f456SAndroid Build Coastguard Worker    private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
390*58b9f456SAndroid Build Coastguard Worker#endif
391*58b9f456SAndroid Build Coastguard Worker
392*58b9f456SAndroid Build Coastguard Worker    // access
393*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY operator type&    () const _NOEXCEPT {return *__f_;}
394*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY          type& get() const _NOEXCEPT {return *__f_;}
395*58b9f456SAndroid Build Coastguard Worker
396*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
397*58b9f456SAndroid Build Coastguard Worker    // invoke
398*58b9f456SAndroid Build Coastguard Worker    template <class... _ArgTypes>
399*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
400*58b9f456SAndroid Build Coastguard Worker    typename __invoke_of<type&, _ArgTypes...>::type
401*58b9f456SAndroid Build Coastguard Worker    operator() (_ArgTypes&&... __args) const {
402*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
403*58b9f456SAndroid Build Coastguard Worker    }
404*58b9f456SAndroid Build Coastguard Worker#else
405*58b9f456SAndroid Build Coastguard Worker
406*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
407*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return<type>::type
408*58b9f456SAndroid Build Coastguard Worker    operator() () const {
409*58b9f456SAndroid Build Coastguard Worker        return __invoke(get());
410*58b9f456SAndroid Build Coastguard Worker    }
411*58b9f456SAndroid Build Coastguard Worker
412*58b9f456SAndroid Build Coastguard Worker    template <class _A0>
413*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
414*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return0<type, _A0>::type
415*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0) const {
416*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0);
417*58b9f456SAndroid Build Coastguard Worker    }
418*58b9f456SAndroid Build Coastguard Worker
419*58b9f456SAndroid Build Coastguard Worker    template <class _A0>
420*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
421*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return0<type, _A0 const>::type
422*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0) const {
423*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0);
424*58b9f456SAndroid Build Coastguard Worker    }
425*58b9f456SAndroid Build Coastguard Worker
426*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
427*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
428*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0, _A1>::type
429*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1) const {
430*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1);
431*58b9f456SAndroid Build Coastguard Worker    }
432*58b9f456SAndroid Build Coastguard Worker
433*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
434*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
435*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0 const, _A1>::type
436*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1) const {
437*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1);
438*58b9f456SAndroid Build Coastguard Worker    }
439*58b9f456SAndroid Build Coastguard Worker
440*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
441*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
442*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0, _A1 const>::type
443*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1) const {
444*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1);
445*58b9f456SAndroid Build Coastguard Worker    }
446*58b9f456SAndroid Build Coastguard Worker
447*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1>
448*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
449*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return1<type, _A0 const, _A1 const>::type
450*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1) const {
451*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1);
452*58b9f456SAndroid Build Coastguard Worker    }
453*58b9f456SAndroid Build Coastguard Worker
454*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
455*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
456*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1, _A2>::type
457*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
458*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
459*58b9f456SAndroid Build Coastguard Worker    }
460*58b9f456SAndroid Build Coastguard Worker
461*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
462*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
463*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1, _A2>::type
464*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
465*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
466*58b9f456SAndroid Build Coastguard Worker    }
467*58b9f456SAndroid Build Coastguard Worker
468*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
469*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
470*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1 const, _A2>::type
471*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
472*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
473*58b9f456SAndroid Build Coastguard Worker    }
474*58b9f456SAndroid Build Coastguard Worker
475*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
476*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
477*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1, _A2 const>::type
478*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
479*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
480*58b9f456SAndroid Build Coastguard Worker    }
481*58b9f456SAndroid Build Coastguard Worker
482*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
483*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
484*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
485*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
486*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
487*58b9f456SAndroid Build Coastguard Worker    }
488*58b9f456SAndroid Build Coastguard Worker
489*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
490*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
491*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
492*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
493*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
494*58b9f456SAndroid Build Coastguard Worker    }
495*58b9f456SAndroid Build Coastguard Worker
496*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
497*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
498*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
499*58b9f456SAndroid Build Coastguard Worker    operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
500*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
501*58b9f456SAndroid Build Coastguard Worker    }
502*58b9f456SAndroid Build Coastguard Worker
503*58b9f456SAndroid Build Coastguard Worker    template <class _A0, class _A1, class _A2>
504*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
505*58b9f456SAndroid Build Coastguard Worker    typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
506*58b9f456SAndroid Build Coastguard Worker    operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
507*58b9f456SAndroid Build Coastguard Worker        return __invoke(get(), __a0, __a1, __a2);
508*58b9f456SAndroid Build Coastguard Worker    }
509*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG
510*58b9f456SAndroid Build Coastguard Worker};
511*58b9f456SAndroid Build Coastguard Worker
512*58b9f456SAndroid Build Coastguard Worker
513*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
514*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
515*58b9f456SAndroid Build Coastguard Workerreference_wrapper<_Tp>
516*58b9f456SAndroid Build Coastguard Workerref(_Tp& __t) _NOEXCEPT
517*58b9f456SAndroid Build Coastguard Worker{
518*58b9f456SAndroid Build Coastguard Worker    return reference_wrapper<_Tp>(__t);
519*58b9f456SAndroid Build Coastguard Worker}
520*58b9f456SAndroid Build Coastguard Worker
521*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
522*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
523*58b9f456SAndroid Build Coastguard Workerreference_wrapper<_Tp>
524*58b9f456SAndroid Build Coastguard Workerref(reference_wrapper<_Tp> __t) _NOEXCEPT
525*58b9f456SAndroid Build Coastguard Worker{
526*58b9f456SAndroid Build Coastguard Worker    return ref(__t.get());
527*58b9f456SAndroid Build Coastguard Worker}
528*58b9f456SAndroid Build Coastguard Worker
529*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
530*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
531*58b9f456SAndroid Build Coastguard Workerreference_wrapper<const _Tp>
532*58b9f456SAndroid Build Coastguard Workercref(const _Tp& __t) _NOEXCEPT
533*58b9f456SAndroid Build Coastguard Worker{
534*58b9f456SAndroid Build Coastguard Worker    return reference_wrapper<const _Tp>(__t);
535*58b9f456SAndroid Build Coastguard Worker}
536*58b9f456SAndroid Build Coastguard Worker
537*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
538*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
539*58b9f456SAndroid Build Coastguard Workerreference_wrapper<const _Tp>
540*58b9f456SAndroid Build Coastguard Workercref(reference_wrapper<_Tp> __t) _NOEXCEPT
541*58b9f456SAndroid Build Coastguard Worker{
542*58b9f456SAndroid Build Coastguard Worker    return cref(__t.get());
543*58b9f456SAndroid Build Coastguard Worker}
544*58b9f456SAndroid Build Coastguard Worker
545*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
546*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> void ref(const _Tp&&) = delete;
547*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> void cref(const _Tp&&) = delete;
548*58b9f456SAndroid Build Coastguard Worker#endif
549*58b9f456SAndroid Build Coastguard Worker
550*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
551*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class, class = void>
552*58b9f456SAndroid Build Coastguard Workerstruct __is_transparent : false_type {};
553*58b9f456SAndroid Build Coastguard Worker
554*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
555*58b9f456SAndroid Build Coastguard Workerstruct __is_transparent<_Tp, _Up,
556*58b9f456SAndroid Build Coastguard Worker                        typename __void_t<typename _Tp::is_transparent>::type>
557*58b9f456SAndroid Build Coastguard Worker   : true_type {};
558*58b9f456SAndroid Build Coastguard Worker#endif
559*58b9f456SAndroid Build Coastguard Worker
560*58b9f456SAndroid Build Coastguard Worker// allocator_arg_t
561*58b9f456SAndroid Build Coastguard Worker
562*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS allocator_arg_t { };
563*58b9f456SAndroid Build Coastguard Worker
564*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
565*58b9f456SAndroid Build Coastguard Workerextern _LIBCPP_EXPORTED_FROM_ABI const allocator_arg_t allocator_arg;
566*58b9f456SAndroid Build Coastguard Worker#else
567*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr allocator_arg_t allocator_arg = allocator_arg_t();
568*58b9f456SAndroid Build Coastguard Worker#endif
569*58b9f456SAndroid Build Coastguard Worker
570*58b9f456SAndroid Build Coastguard Worker// uses_allocator
571*58b9f456SAndroid Build Coastguard Worker
572*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
573*58b9f456SAndroid Build Coastguard Workerstruct __has_allocator_type
574*58b9f456SAndroid Build Coastguard Worker{
575*58b9f456SAndroid Build Coastguard Workerprivate:
576*58b9f456SAndroid Build Coastguard Worker    struct __two {char __lx; char __lxx;};
577*58b9f456SAndroid Build Coastguard Worker    template <class _Up> static __two __test(...);
578*58b9f456SAndroid Build Coastguard Worker    template <class _Up> static char __test(typename _Up::allocator_type* = 0);
579*58b9f456SAndroid Build Coastguard Workerpublic:
580*58b9f456SAndroid Build Coastguard Worker    static const bool value = sizeof(__test<_Tp>(0)) == 1;
581*58b9f456SAndroid Build Coastguard Worker};
582*58b9f456SAndroid Build Coastguard Worker
583*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
584*58b9f456SAndroid Build Coastguard Workerstruct __uses_allocator
585*58b9f456SAndroid Build Coastguard Worker    : public integral_constant<bool,
586*58b9f456SAndroid Build Coastguard Worker        is_convertible<_Alloc, typename _Tp::allocator_type>::value>
587*58b9f456SAndroid Build Coastguard Worker{
588*58b9f456SAndroid Build Coastguard Worker};
589*58b9f456SAndroid Build Coastguard Worker
590*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc>
591*58b9f456SAndroid Build Coastguard Workerstruct __uses_allocator<_Tp, _Alloc, false>
592*58b9f456SAndroid Build Coastguard Worker    : public false_type
593*58b9f456SAndroid Build Coastguard Worker{
594*58b9f456SAndroid Build Coastguard Worker};
595*58b9f456SAndroid Build Coastguard Worker
596*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc>
597*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS uses_allocator
598*58b9f456SAndroid Build Coastguard Worker    : public __uses_allocator<_Tp, _Alloc>
599*58b9f456SAndroid Build Coastguard Worker{
600*58b9f456SAndroid Build Coastguard Worker};
601*58b9f456SAndroid Build Coastguard Worker
602*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
603*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc>
604*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr size_t uses_allocator_v = uses_allocator<_Tp, _Alloc>::value;
605*58b9f456SAndroid Build Coastguard Worker#endif
606*58b9f456SAndroid Build Coastguard Worker
607*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
608*58b9f456SAndroid Build Coastguard Worker
609*58b9f456SAndroid Build Coastguard Worker// allocator construction
610*58b9f456SAndroid Build Coastguard Worker
611*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, class ..._Args>
612*58b9f456SAndroid Build Coastguard Workerstruct __uses_alloc_ctor_imp
613*58b9f456SAndroid Build Coastguard Worker{
614*58b9f456SAndroid Build Coastguard Worker    typedef typename __uncvref<_Alloc>::type _RawAlloc;
615*58b9f456SAndroid Build Coastguard Worker    static const bool __ua = uses_allocator<_Tp, _RawAlloc>::value;
616*58b9f456SAndroid Build Coastguard Worker    static const bool __ic =
617*58b9f456SAndroid Build Coastguard Worker        is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
618*58b9f456SAndroid Build Coastguard Worker    static const int value = __ua ? 2 - __ic : 0;
619*58b9f456SAndroid Build Coastguard Worker};
620*58b9f456SAndroid Build Coastguard Worker
621*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, class ..._Args>
622*58b9f456SAndroid Build Coastguard Workerstruct __uses_alloc_ctor
623*58b9f456SAndroid Build Coastguard Worker    : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
624*58b9f456SAndroid Build Coastguard Worker    {};
625*58b9f456SAndroid Build Coastguard Worker
626*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Allocator, class... _Args>
627*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
628*58b9f456SAndroid Build Coastguard Workervoid __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
629*58b9f456SAndroid Build Coastguard Worker{
630*58b9f456SAndroid Build Coastguard Worker    new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
631*58b9f456SAndroid Build Coastguard Worker}
632*58b9f456SAndroid Build Coastguard Worker
633*58b9f456SAndroid Build Coastguard Worker// FIXME: This should have a version which takes a non-const alloc.
634*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Allocator, class... _Args>
635*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
636*58b9f456SAndroid Build Coastguard Workervoid __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
637*58b9f456SAndroid Build Coastguard Worker{
638*58b9f456SAndroid Build Coastguard Worker    new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
639*58b9f456SAndroid Build Coastguard Worker}
640*58b9f456SAndroid Build Coastguard Worker
641*58b9f456SAndroid Build Coastguard Worker// FIXME: This should have a version which takes a non-const alloc.
642*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Allocator, class... _Args>
643*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
644*58b9f456SAndroid Build Coastguard Workervoid __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
645*58b9f456SAndroid Build Coastguard Worker{
646*58b9f456SAndroid Build Coastguard Worker    new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
647*58b9f456SAndroid Build Coastguard Worker}
648*58b9f456SAndroid Build Coastguard Worker
649*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
650*58b9f456SAndroid Build Coastguard Worker
651*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD
652*58b9f456SAndroid Build Coastguard Worker
653*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_FUNCTIONAL_BASE
654