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