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