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