__functional_base_03 revision 227825
1227825Stheraven// -*- C++ -*- 2227825Stheraven//===----------------------------------------------------------------------===// 3227825Stheraven// 4227825Stheraven// The LLVM Compiler Infrastructure 5227825Stheraven// 6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 7227825Stheraven// Source Licenses. See LICENSE.TXT for details. 8227825Stheraven// 9227825Stheraven//===----------------------------------------------------------------------===// 10227825Stheraven 11227825Stheraven#ifndef _LIBCPP_FUNCTIONAL_BASE_03 12227825Stheraven#define _LIBCPP_FUNCTIONAL_BASE_03 13227825Stheraven 14227825Stheraven// manual variadic expansion for <functional> 15227825Stheraven 16227825Stheraven// __weak_result_type 17227825Stheraven 18227825Stheraventemplate <class _Tp> 19227825Stheravenstruct __derives_from_unary_function 20227825Stheraven{ 21227825Stheravenprivate: 22227825Stheraven struct __two {char _; char __;}; 23227825Stheraven static __two __test(...); 24227825Stheraven template <class _A, class _R> 25227825Stheraven static unary_function<_A, _R> 26227825Stheraven __test(const volatile unary_function<_A, _R>*); 27227825Stheravenpublic: 28227825Stheraven static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 29227825Stheraven typedef decltype(__test((_Tp*)0)) type; 30227825Stheraven}; 31227825Stheraven 32227825Stheraventemplate <class _Tp> 33227825Stheravenstruct __derives_from_binary_function 34227825Stheraven{ 35227825Stheravenprivate: 36227825Stheraven struct __two {char _; char __;}; 37227825Stheraven static __two __test(...); 38227825Stheraven template <class _A1, class _A2, class _R> 39227825Stheraven static binary_function<_A1, _A2, _R> 40227825Stheraven __test(const volatile binary_function<_A1, _A2, _R>*); 41227825Stheravenpublic: 42227825Stheraven static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 43227825Stheraven typedef decltype(__test((_Tp*)0)) type; 44227825Stheraven}; 45227825Stheraven 46227825Stheraventemplate <class _Tp, bool = __derives_from_unary_function<_Tp>::value> 47227825Stheravenstruct __maybe_derive_from_unary_function // bool is true 48227825Stheraven : public __derives_from_unary_function<_Tp>::type 49227825Stheraven{ 50227825Stheraven}; 51227825Stheraven 52227825Stheraventemplate <class _Tp> 53227825Stheravenstruct __maybe_derive_from_unary_function<_Tp, false> 54227825Stheraven{ 55227825Stheraven}; 56227825Stheraven 57227825Stheraventemplate <class _Tp, bool = __derives_from_binary_function<_Tp>::value> 58227825Stheravenstruct __maybe_derive_from_binary_function // bool is true 59227825Stheraven : public __derives_from_binary_function<_Tp>::type 60227825Stheraven{ 61227825Stheraven}; 62227825Stheraven 63227825Stheraventemplate <class _Tp> 64227825Stheravenstruct __maybe_derive_from_binary_function<_Tp, false> 65227825Stheraven{ 66227825Stheraven}; 67227825Stheraven 68227825Stheraventemplate <class _Tp, bool = __has_result_type<_Tp>::value> 69227825Stheravenstruct __weak_result_type_imp // bool is true 70227825Stheraven : public __maybe_derive_from_unary_function<_Tp>, 71227825Stheraven public __maybe_derive_from_binary_function<_Tp> 72227825Stheraven{ 73227825Stheraven typedef typename _Tp::result_type result_type; 74227825Stheraven}; 75227825Stheraven 76227825Stheraventemplate <class _Tp> 77227825Stheravenstruct __weak_result_type_imp<_Tp, false> 78227825Stheraven : public __maybe_derive_from_unary_function<_Tp>, 79227825Stheraven public __maybe_derive_from_binary_function<_Tp> 80227825Stheraven{ 81227825Stheraven}; 82227825Stheraven 83227825Stheraventemplate <class _Tp> 84227825Stheravenstruct __weak_result_type 85227825Stheraven : public __weak_result_type_imp<typename remove_reference<_Tp>::type> 86227825Stheraven{ 87227825Stheraven}; 88227825Stheraven 89227825Stheraven// 0 argument case 90227825Stheraven 91227825Stheraventemplate <class _R> 92227825Stheravenstruct __weak_result_type<_R ()> 93227825Stheraven{ 94227825Stheraven typedef _R result_type; 95227825Stheraven}; 96227825Stheraven 97227825Stheraventemplate <class _R> 98227825Stheravenstruct __weak_result_type<_R (&)()> 99227825Stheraven{ 100227825Stheraven typedef _R result_type; 101227825Stheraven}; 102227825Stheraven 103227825Stheraventemplate <class _R> 104227825Stheravenstruct __weak_result_type<_R (*)()> 105227825Stheraven{ 106227825Stheraven typedef _R result_type; 107227825Stheraven}; 108227825Stheraven 109227825Stheraven// 1 argument case 110227825Stheraven 111227825Stheraventemplate <class _R, class _A1> 112227825Stheravenstruct __weak_result_type<_R (_A1)> 113227825Stheraven : public unary_function<_A1, _R> 114227825Stheraven{ 115227825Stheraven}; 116227825Stheraven 117227825Stheraventemplate <class _R, class _A1> 118227825Stheravenstruct __weak_result_type<_R (&)(_A1)> 119227825Stheraven : public unary_function<_A1, _R> 120227825Stheraven{ 121227825Stheraven}; 122227825Stheraven 123227825Stheraventemplate <class _R, class _A1> 124227825Stheravenstruct __weak_result_type<_R (*)(_A1)> 125227825Stheraven : public unary_function<_A1, _R> 126227825Stheraven{ 127227825Stheraven}; 128227825Stheraven 129227825Stheraventemplate <class _R, class _C> 130227825Stheravenstruct __weak_result_type<_R (_C::*)()> 131227825Stheraven : public unary_function<_C*, _R> 132227825Stheraven{ 133227825Stheraven}; 134227825Stheraven 135227825Stheraventemplate <class _R, class _C> 136227825Stheravenstruct __weak_result_type<_R (_C::*)() const> 137227825Stheraven : public unary_function<const _C*, _R> 138227825Stheraven{ 139227825Stheraven}; 140227825Stheraven 141227825Stheraventemplate <class _R, class _C> 142227825Stheravenstruct __weak_result_type<_R (_C::*)() volatile> 143227825Stheraven : public unary_function<volatile _C*, _R> 144227825Stheraven{ 145227825Stheraven}; 146227825Stheraven 147227825Stheraventemplate <class _R, class _C> 148227825Stheravenstruct __weak_result_type<_R (_C::*)() const volatile> 149227825Stheraven : public unary_function<const volatile _C*, _R> 150227825Stheraven{ 151227825Stheraven}; 152227825Stheraven 153227825Stheraven// 2 argument case 154227825Stheraven 155227825Stheraventemplate <class _R, class _A1, class _A2> 156227825Stheravenstruct __weak_result_type<_R (_A1, _A2)> 157227825Stheraven : public binary_function<_A1, _A2, _R> 158227825Stheraven{ 159227825Stheraven}; 160227825Stheraven 161227825Stheraventemplate <class _R, class _A1, class _A2> 162227825Stheravenstruct __weak_result_type<_R (*)(_A1, _A2)> 163227825Stheraven : public binary_function<_A1, _A2, _R> 164227825Stheraven{ 165227825Stheraven}; 166227825Stheraven 167227825Stheraventemplate <class _R, class _A1, class _A2> 168227825Stheravenstruct __weak_result_type<_R (&)(_A1, _A2)> 169227825Stheraven : public binary_function<_A1, _A2, _R> 170227825Stheraven{ 171227825Stheraven}; 172227825Stheraven 173227825Stheraventemplate <class _R, class _C, class _A1> 174227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1)> 175227825Stheraven : public binary_function<_C*, _A1, _R> 176227825Stheraven{ 177227825Stheraven}; 178227825Stheraven 179227825Stheraventemplate <class _R, class _C, class _A1> 180227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1) const> 181227825Stheraven : public binary_function<const _C*, _A1, _R> 182227825Stheraven{ 183227825Stheraven}; 184227825Stheraven 185227825Stheraventemplate <class _R, class _C, class _A1> 186227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1) volatile> 187227825Stheraven : public binary_function<volatile _C*, _A1, _R> 188227825Stheraven{ 189227825Stheraven}; 190227825Stheraven 191227825Stheraventemplate <class _R, class _C, class _A1> 192227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1) const volatile> 193227825Stheraven : public binary_function<const volatile _C*, _A1, _R> 194227825Stheraven{ 195227825Stheraven}; 196227825Stheraven 197227825Stheraven// 3 or more arguments 198227825Stheraven 199227825Stheraventemplate <class _R, class _A1, class _A2, class _A3> 200227825Stheravenstruct __weak_result_type<_R (_A1, _A2, _A3)> 201227825Stheraven{ 202227825Stheraven typedef _R result_type; 203227825Stheraven}; 204227825Stheraven 205227825Stheraventemplate <class _R, class _A1, class _A2, class _A3> 206227825Stheravenstruct __weak_result_type<_R (&)(_A1, _A2, _A3)> 207227825Stheraven{ 208227825Stheraven typedef _R result_type; 209227825Stheraven}; 210227825Stheraven 211227825Stheraventemplate <class _R, class _A1, class _A2, class _A3> 212227825Stheravenstruct __weak_result_type<_R (*)(_A1, _A2, _A3)> 213227825Stheraven{ 214227825Stheraven typedef _R result_type; 215227825Stheraven}; 216227825Stheraven 217227825Stheraventemplate <class _R, class _C, class _A1, class _A2> 218227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1, _A2)> 219227825Stheraven{ 220227825Stheraven typedef _R result_type; 221227825Stheraven}; 222227825Stheraven 223227825Stheraventemplate <class _R, class _C, class _A1, class _A2> 224227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1, _A2) const> 225227825Stheraven{ 226227825Stheraven typedef _R result_type; 227227825Stheraven}; 228227825Stheraven 229227825Stheraventemplate <class _R, class _C, class _A1, class _A2> 230227825Stheravenstruct __weak_result_type<_R (_C::*)(_A1, _A2) volatile> 231227825Stheraven{ 232227825Stheraven typedef _R result_type; 233227825Stheraven}; 234227825Stheraven 235227825Stheraven// __invoke 236227825Stheraven 237227825Stheraven// __ref_return0 238227825Stheraven// 239227825Stheraven// template <class _Tp, bool _HasResultType> 240227825Stheraven// struct ________ref_return0 // _HasResultType is true 241227825Stheraven// { 242227825Stheraven// typedef typename _Tp::result_type type; 243227825Stheraven// }; 244227825Stheraven// 245227825Stheraven// template <class _Tp> 246227825Stheraven// struct ________ref_return0<_Tp, false> 247227825Stheraven// { 248227825Stheraven// typedef void type; 249227825Stheraven// }; 250227825Stheraven// 251227825Stheraven// template <class _Tp, bool _IsClass> 252227825Stheraven// struct ____ref_return0 // _IsClass is true 253227825Stheraven// : public ________ref_return0<_Tp, __has_result_type<typename remove_cv<_Tp>::type>::value> 254227825Stheraven// { 255227825Stheraven// }; 256227825Stheraven// 257227825Stheraven// template <class _Tp, bool _HasResultType> 258227825Stheraven// struct ______ref_return0 // _HasResultType is true 259227825Stheraven// { 260227825Stheraven// typedef typename __callable_type<_Tp>::result_type type; 261227825Stheraven// }; 262227825Stheraven// 263227825Stheraven// template <class _Tp> 264227825Stheraven// struct ______ref_return0<_Tp, false> // pointer to member data 265227825Stheraven// { 266227825Stheraven// typedef void type; 267227825Stheraven// }; 268227825Stheraven// 269227825Stheraven// template <class _Tp> 270227825Stheraven// struct ____ref_return0<_Tp, false> 271227825Stheraven// : public ______ref_return0<typename remove_cv<_Tp>::type, 272227825Stheraven// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value> 273227825Stheraven// { 274227825Stheraven// }; 275227825Stheraven// 276227825Stheraven// template <class _Tp> 277227825Stheraven// struct __ref_return0 278227825Stheraven// : public ____ref_return0<typename remove_reference<_Tp>::type, 279227825Stheraven// is_class<typename remove_reference<_Tp>::type>::value> 280227825Stheraven// { 281227825Stheraven// }; 282227825Stheraven// 283227825Stheraven// __ref_return1 284227825Stheraven// 285227825Stheraven// template <class _Tp, bool _IsClass, class _A0> 286227825Stheraven// struct ____ref_return1 // _IsClass is true 287227825Stheraven// { 288227825Stheraven// typedef typename result_of<_Tp(_A0)>::type type; 289227825Stheraven// }; 290227825Stheraven// 291227825Stheraven// template <class _Tp, bool _HasResultType, class _A0> 292227825Stheraven// struct ______ref_return1 // _HasResultType is true 293227825Stheraven// { 294227825Stheraven// typedef typename __callable_type<_Tp>::result_type type; 295227825Stheraven// }; 296227825Stheraven// 297227825Stheraven// template <class _Tp, class _A0, bool> 298227825Stheraven// struct __ref_return1_member_data1; 299227825Stheraven// 300227825Stheraven// template <class _R, class _C, class _A0> 301227825Stheraven// struct __ref_return1_member_data1<_R _C::*, _A0, true> 302227825Stheraven// { 303227825Stheraven// typedef typename __apply_cv<_A0, _R>::type& type; 304227825Stheraven// }; 305227825Stheraven// 306227825Stheraven// template <class _R, class _C, class _A0> 307227825Stheraven// struct __ref_return1_member_data1<_R _C::*, _A0, false> 308227825Stheraven// { 309227825Stheraven// static _A0 __a; 310227825Stheraven// typedef typename __apply_cv<decltype(*__a), _R>::type& type; 311227825Stheraven// }; 312227825Stheraven// 313227825Stheraven// template <class _Tp, class _A0> 314227825Stheraven// struct __ref_return1_member_data; 315227825Stheraven// 316227825Stheraven// template <class _R, class _C, class _A0> 317227825Stheraven// struct __ref_return1_member_data<_R _C::*, _A0> 318227825Stheraven// : public __ref_return1_member_data1<_R _C::*, _A0, 319227825Stheraven// is_same<typename remove_cv<_C>::type, 320227825Stheraven// typename remove_cv<typename remove_reference<_A0>::type>::type>::value> 321227825Stheraven// { 322227825Stheraven// }; 323227825Stheraven// 324227825Stheraven// template <class _Tp, class _A0> 325227825Stheraven// struct ______ref_return1<_Tp, false, _A0> // pointer to member data 326227825Stheraven// : public __ref_return1_member_data<typename remove_cv<_Tp>::type, _A0> 327227825Stheraven// { 328227825Stheraven// }; 329227825Stheraven// 330227825Stheraven// template <class _Tp, class _A0> 331227825Stheraven// struct ____ref_return1<_Tp, false, _A0> 332227825Stheraven// : public ______ref_return1<typename remove_cv<_Tp>::type, 333227825Stheraven// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0> 334227825Stheraven// { 335227825Stheraven// }; 336227825Stheraven// 337227825Stheraven// template <class _Tp, class _A0> 338227825Stheraven// struct __ref_return1 339227825Stheraven// : public ____ref_return1<typename remove_reference<_Tp>::type, 340227825Stheraven// is_class<typename remove_reference<_Tp>::type>::value, _A0> 341227825Stheraven// { 342227825Stheraven// }; 343227825Stheraven// 344227825Stheraven// __ref_return2 345227825Stheraven// 346227825Stheraven// template <class _Tp, bool _IsClass, class _A0, class _A1> 347227825Stheraven// struct ____ref_return2 // _IsClass is true 348227825Stheraven// { 349227825Stheraven// typedef typename result_of<_Tp(_A0, _A1)>::type type; 350227825Stheraven// }; 351227825Stheraven// 352227825Stheraven// template <class _Tp, bool _HasResultType, class _A0, class _A1> 353227825Stheraven// struct ______ref_return2 // _HasResultType is true 354227825Stheraven// { 355227825Stheraven// typedef typename __callable_type<_Tp>::result_type type; 356227825Stheraven// }; 357227825Stheraven// 358227825Stheraven// template <class _Tp> 359227825Stheraven// struct ______ref_return2<_Tp, false, class _A0, class _A1> // pointer to member data 360227825Stheraven// { 361227825Stheraven// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer" 362227825Stheraven// " to member data with too many arguments."); 363227825Stheraven// }; 364227825Stheraven// 365227825Stheraven// template <class _Tp, class _A0, class _A1> 366227825Stheraven// struct ____ref_return2<_Tp, false, _A0, _A1> 367227825Stheraven// : public ______ref_return2<typename remove_cv<_Tp>::type, 368227825Stheraven// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1> 369227825Stheraven// { 370227825Stheraven// }; 371227825Stheraven// 372227825Stheraven// template <class _Tp, class _A0, class _A1> 373227825Stheraven// struct __ref_return2 374227825Stheraven// : public ____ref_return2<typename remove_reference<_Tp>::type, 375227825Stheraven// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1> 376227825Stheraven// { 377227825Stheraven// }; 378227825Stheraven// 379227825Stheraven// __ref_return3 380227825Stheraven// 381227825Stheraven// template <class _Tp, bool _IsClass, class _A0, class _A1, class _A2> 382227825Stheraven// struct ____ref_return3 // _IsClass is true 383227825Stheraven// { 384227825Stheraven// typedef typename result_of<_Tp(_A0, _A1, _A2)>::type type; 385227825Stheraven// }; 386227825Stheraven// 387227825Stheraven// template <class _Tp, bool _HasResultType, class _A0, class _A1, class _A2> 388227825Stheraven// struct ______ref_return3 // _HasResultType is true 389227825Stheraven// { 390227825Stheraven// typedef typename __callable_type<_Tp>::result_type type; 391227825Stheraven// }; 392227825Stheraven// 393227825Stheraven// template <class _Tp> 394227825Stheraven// struct ______ref_return3<_Tp, false, class _A0, class _A1, class _A2> // pointer to member data 395227825Stheraven// { 396227825Stheraven// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer" 397227825Stheraven// " to member data with too many arguments."); 398227825Stheraven// }; 399227825Stheraven// 400227825Stheraven// template <class _Tp, class _A0, class _A1, class _A2> 401227825Stheraven// struct ____ref_return3<_Tp, false, _A0, _A1, _A2> 402227825Stheraven// : public ______ref_return3<typename remove_cv<_Tp>::type, 403227825Stheraven// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1, _A2> 404227825Stheraven// { 405227825Stheraven// }; 406227825Stheraven// 407227825Stheraven// template <class _Tp, class _A0, class _A1, class _A2> 408227825Stheraven// struct __ref_return3 409227825Stheraven// : public ____ref_return3<typename remove_reference<_Tp>::type, 410227825Stheraven// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1, _A2> 411227825Stheraven// { 412227825Stheraven// }; 413227825Stheraven 414227825Stheraven// first bullet 415227825Stheraven 416227825Stheraventemplate <class _R, class _T, class _T1> 417227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 418227825Stheraventypename enable_if 419227825Stheraven< 420227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 421227825Stheraven _R 422227825Stheraven>::type 423227825Stheraven__invoke(_R (_T::*__f)(), _T1& __t1) 424227825Stheraven{ 425227825Stheraven return (__t1.*__f)(); 426227825Stheraven} 427227825Stheraven 428227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 429227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 430227825Stheraventypename enable_if 431227825Stheraven< 432227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 433227825Stheraven _R 434227825Stheraven>::type 435227825Stheraven__invoke(_R (_T::*__f)(_A0), _T1& __t1, _A0& __a0) 436227825Stheraven{ 437227825Stheraven return (__t1.*__f)(__a0); 438227825Stheraven} 439227825Stheraven 440227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 441227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 442227825Stheraventypename enable_if 443227825Stheraven< 444227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 445227825Stheraven _R 446227825Stheraven>::type 447227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1) 448227825Stheraven{ 449227825Stheraven return (__t1.*__f)(__a0, __a1); 450227825Stheraven} 451227825Stheraven 452227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 453227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 454227825Stheraventypename enable_if 455227825Stheraven< 456227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 457227825Stheraven _R 458227825Stheraven>::type 459227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) 460227825Stheraven{ 461227825Stheraven return (__t1.*__f)(__a0, __a1, __a2); 462227825Stheraven} 463227825Stheraven 464227825Stheraventemplate <class _R, class _T, class _T1> 465227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 466227825Stheraventypename enable_if 467227825Stheraven< 468227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 469227825Stheraven _R 470227825Stheraven>::type 471227825Stheraven__invoke(_R (_T::*__f)() const, _T1& __t1) 472227825Stheraven{ 473227825Stheraven return (__t1.*__f)(); 474227825Stheraven} 475227825Stheraven 476227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 477227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 478227825Stheraventypename enable_if 479227825Stheraven< 480227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 481227825Stheraven _R 482227825Stheraven>::type 483227825Stheraven__invoke(_R (_T::*__f)(_A0) const, _T1& __t1, _A0& __a0) 484227825Stheraven{ 485227825Stheraven return (__t1.*__f)(__a0); 486227825Stheraven} 487227825Stheraven 488227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 489227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 490227825Stheraventypename enable_if 491227825Stheraven< 492227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 493227825Stheraven _R 494227825Stheraven>::type 495227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1) 496227825Stheraven{ 497227825Stheraven return (__t1.*__f)(__a0, __a1); 498227825Stheraven} 499227825Stheraven 500227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 501227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 502227825Stheraventypename enable_if 503227825Stheraven< 504227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 505227825Stheraven _R 506227825Stheraven>::type 507227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) 508227825Stheraven{ 509227825Stheraven return (__t1.*__f)(__a0, __a1, __a2); 510227825Stheraven} 511227825Stheraven 512227825Stheraventemplate <class _R, class _T, class _T1> 513227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 514227825Stheraventypename enable_if 515227825Stheraven< 516227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 517227825Stheraven _R 518227825Stheraven>::type 519227825Stheraven__invoke(_R (_T::*__f)() volatile, _T1& __t1) 520227825Stheraven{ 521227825Stheraven return (__t1.*__f)(); 522227825Stheraven} 523227825Stheraven 524227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 525227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 526227825Stheraventypename enable_if 527227825Stheraven< 528227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 529227825Stheraven _R 530227825Stheraven>::type 531227825Stheraven__invoke(_R (_T::*__f)(_A0) volatile, _T1& __t1, _A0& __a0) 532227825Stheraven{ 533227825Stheraven return (__t1.*__f)(__a0); 534227825Stheraven} 535227825Stheraven 536227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 537227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 538227825Stheraventypename enable_if 539227825Stheraven< 540227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 541227825Stheraven _R 542227825Stheraven>::type 543227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1) 544227825Stheraven{ 545227825Stheraven return (__t1.*__f)(__a0, __a1); 546227825Stheraven} 547227825Stheraven 548227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 549227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 550227825Stheraventypename enable_if 551227825Stheraven< 552227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 553227825Stheraven _R 554227825Stheraven>::type 555227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) 556227825Stheraven{ 557227825Stheraven return (__t1.*__f)(__a0, __a1, __a2); 558227825Stheraven} 559227825Stheraven 560227825Stheraventemplate <class _R, class _T, class _T1> 561227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 562227825Stheraventypename enable_if 563227825Stheraven< 564227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 565227825Stheraven _R 566227825Stheraven>::type 567227825Stheraven__invoke(_R (_T::*__f)() const volatile, _T1& __t1) 568227825Stheraven{ 569227825Stheraven return (__t1.*__f)(); 570227825Stheraven} 571227825Stheraven 572227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 573227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 574227825Stheraventypename enable_if 575227825Stheraven< 576227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 577227825Stheraven _R 578227825Stheraven>::type 579227825Stheraven__invoke(_R (_T::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0) 580227825Stheraven{ 581227825Stheraven return (__t1.*__f)(__a0); 582227825Stheraven} 583227825Stheraven 584227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 585227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 586227825Stheraventypename enable_if 587227825Stheraven< 588227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 589227825Stheraven _R 590227825Stheraven>::type 591227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1) 592227825Stheraven{ 593227825Stheraven return (__t1.*__f)(__a0, __a1); 594227825Stheraven} 595227825Stheraven 596227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 597227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 598227825Stheraventypename enable_if 599227825Stheraven< 600227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 601227825Stheraven _R 602227825Stheraven>::type 603227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) 604227825Stheraven{ 605227825Stheraven return (__t1.*__f)(__a0, __a1, __a2); 606227825Stheraven} 607227825Stheraven 608227825Stheraven// second bullet 609227825Stheraven 610227825Stheraventemplate <class _R, class _T, class _T1> 611227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 612227825Stheraventypename enable_if 613227825Stheraven< 614227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 615227825Stheraven _R 616227825Stheraven>::type 617227825Stheraven__invoke(_R (_T::*__f)(), _T1 __t1) 618227825Stheraven{ 619227825Stheraven return ((*__t1).*__f)(); 620227825Stheraven} 621227825Stheraven 622227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 623227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 624227825Stheraventypename enable_if 625227825Stheraven< 626227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 627227825Stheraven _R 628227825Stheraven>::type 629227825Stheraven__invoke(_R (_T::*__f)(_A0), _T1 __t1, _A0& __a0) 630227825Stheraven{ 631227825Stheraven return ((*__t1).*__f)(__a0); 632227825Stheraven} 633227825Stheraven 634227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 635227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 636227825Stheraventypename enable_if 637227825Stheraven< 638227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 639227825Stheraven _R 640227825Stheraven>::type 641227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1) 642227825Stheraven{ 643227825Stheraven return ((*__t1).*__f)(__a0, __a1); 644227825Stheraven} 645227825Stheraven 646227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 647227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 648227825Stheraventypename enable_if 649227825Stheraven< 650227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 651227825Stheraven _R 652227825Stheraven>::type 653227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) 654227825Stheraven{ 655227825Stheraven return ((*__t1).*__f)(__a0, __a1, __a2); 656227825Stheraven} 657227825Stheraven 658227825Stheraventemplate <class _R, class _T, class _T1> 659227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 660227825Stheraventypename enable_if 661227825Stheraven< 662227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 663227825Stheraven _R 664227825Stheraven>::type 665227825Stheraven__invoke(_R (_T::*__f)() const, _T1 __t1) 666227825Stheraven{ 667227825Stheraven return ((*__t1).*__f)(); 668227825Stheraven} 669227825Stheraven 670227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 671227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 672227825Stheraventypename enable_if 673227825Stheraven< 674227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 675227825Stheraven _R 676227825Stheraven>::type 677227825Stheraven__invoke(_R (_T::*__f)(_A0) const, _T1 __t1, _A0& __a0) 678227825Stheraven{ 679227825Stheraven return ((*__t1).*__f)(__a0); 680227825Stheraven} 681227825Stheraven 682227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 683227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 684227825Stheraventypename enable_if 685227825Stheraven< 686227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 687227825Stheraven _R 688227825Stheraven>::type 689227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1) 690227825Stheraven{ 691227825Stheraven return ((*__t1).*__f)(__a0, __a1); 692227825Stheraven} 693227825Stheraven 694227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 695227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 696227825Stheraventypename enable_if 697227825Stheraven< 698227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 699227825Stheraven _R 700227825Stheraven>::type 701227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) 702227825Stheraven{ 703227825Stheraven return ((*__t1).*__f)(__a0, __a1, __a2); 704227825Stheraven} 705227825Stheraven 706227825Stheraventemplate <class _R, class _T, class _T1> 707227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 708227825Stheraventypename enable_if 709227825Stheraven< 710227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 711227825Stheraven _R 712227825Stheraven>::type 713227825Stheraven__invoke(_R (_T::*__f)() volatile, _T1 __t1) 714227825Stheraven{ 715227825Stheraven return ((*__t1).*__f)(); 716227825Stheraven} 717227825Stheraven 718227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 719227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 720227825Stheraventypename enable_if 721227825Stheraven< 722227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 723227825Stheraven _R 724227825Stheraven>::type 725227825Stheraven__invoke(_R (_T::*__f)(_A0) volatile, _T1 __t1, _A0& __a0) 726227825Stheraven{ 727227825Stheraven return ((*__t1).*__f)(__a0); 728227825Stheraven} 729227825Stheraven 730227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 731227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 732227825Stheraventypename enable_if 733227825Stheraven< 734227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 735227825Stheraven _R 736227825Stheraven>::type 737227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1) 738227825Stheraven{ 739227825Stheraven return ((*__t1).*__f)(__a0, __a1); 740227825Stheraven} 741227825Stheraven 742227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 743227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 744227825Stheraventypename enable_if 745227825Stheraven< 746227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 747227825Stheraven _R 748227825Stheraven>::type 749227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) 750227825Stheraven{ 751227825Stheraven return ((*__t1).*__f)(__a0, __a1, __a2); 752227825Stheraven} 753227825Stheraven 754227825Stheraventemplate <class _R, class _T, class _T1> 755227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 756227825Stheraventypename enable_if 757227825Stheraven< 758227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 759227825Stheraven _R 760227825Stheraven>::type 761227825Stheraven__invoke(_R (_T::*__f)() const volatile, _T1 __t1) 762227825Stheraven{ 763227825Stheraven return ((*__t1).*__f)(); 764227825Stheraven} 765227825Stheraven 766227825Stheraventemplate <class _R, class _T, class _T1, class _A0> 767227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 768227825Stheraventypename enable_if 769227825Stheraven< 770227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 771227825Stheraven _R 772227825Stheraven>::type 773227825Stheraven__invoke(_R (_T::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0) 774227825Stheraven{ 775227825Stheraven return ((*__t1).*__f)(__a0); 776227825Stheraven} 777227825Stheraven 778227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1> 779227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 780227825Stheraventypename enable_if 781227825Stheraven< 782227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 783227825Stheraven _R 784227825Stheraven>::type 785227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1) 786227825Stheraven{ 787227825Stheraven return ((*__t1).*__f)(__a0, __a1); 788227825Stheraven} 789227825Stheraven 790227825Stheraventemplate <class _R, class _T, class _T1, class _A0, class _A1, class _A2> 791227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 792227825Stheraventypename enable_if 793227825Stheraven< 794227825Stheraven !is_base_of<_T, typename remove_reference<_T1>::type>::value, 795227825Stheraven _R 796227825Stheraven>::type 797227825Stheraven__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) 798227825Stheraven{ 799227825Stheraven return ((*__t1).*__f)(__a0, __a1, __a2); 800227825Stheraven} 801227825Stheraven 802227825Stheraven// third bullet 803227825Stheraven 804227825Stheraventemplate <class _R, class _T, class _T1> 805227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 806227825Stheraventypename enable_if 807227825Stheraven< 808227825Stheraven is_base_of<_T, typename remove_reference<_T1>::type>::value, 809227825Stheraven typename __apply_cv<_T1, _R>::type& 810227825Stheraven>::type 811227825Stheraven__invoke(_R _T::* __f, _T1& __t1) 812227825Stheraven{ 813227825Stheraven return __t1.*__f; 814227825Stheraven} 815227825Stheraven 816227825Stheraventemplate <class _R, class _T> 817227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 818227825Stheravenvoid 819227825Stheraven__invoke(_R _T::*) 820227825Stheraven{ 821227825Stheraven} 822227825Stheraven 823227825Stheraven// template <class _D, class _R, class _T, class _T1> 824227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 825227825Stheraven// typename enable_if 826227825Stheraven// < 827227825Stheraven// is_base_of<_T, typename remove_reference<_T1>::type>::value, 828227825Stheraven// typename __ref_return1<_R _T::*, _T1>::type 829227825Stheraven// >::type 830227825Stheraven// __invoke(_R _T::* __f, _T1& __t1) 831227825Stheraven// { 832227825Stheraven// return __t1.*__f; 833227825Stheraven// } 834227825Stheraven 835227825Stheraven// forth bullet 836227825Stheraven 837227825Stheraventemplate <class _T1, class _R, bool> 838227825Stheravenstruct __4th_helper 839227825Stheraven{ 840227825Stheraven}; 841227825Stheraven 842227825Stheraventemplate <class _T1, class _R> 843227825Stheravenstruct __4th_helper<_T1, _R, true> 844227825Stheraven{ 845227825Stheraven typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _R>::type type; 846227825Stheraven}; 847227825Stheraven 848227825Stheraventemplate <class _R, class _T, class _T1> 849227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 850227825Stheraventypename __4th_helper<_T1, _R, 851227825Stheraven !is_base_of<_T, 852227825Stheraven typename remove_reference<_T1>::type 853227825Stheraven >::value 854227825Stheraven >::type& 855227825Stheraven__invoke(_R _T::* __f, _T1& __t1) 856227825Stheraven{ 857227825Stheraven return (*__t1).*__f; 858227825Stheraven} 859227825Stheraven 860227825Stheraven// template <class _D, class _R, class _T, class _T1> 861227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 862227825Stheraven// typename enable_if 863227825Stheraven// < 864227825Stheraven// !is_base_of<_T, typename remove_reference<_T1>::type>::value, 865227825Stheraven// typename __ref_return1<_R _T::*, _T1>::type 866227825Stheraven// >::type 867227825Stheraven// __invoke(_R _T::* __f, _T1 __t1) 868227825Stheraven// { 869227825Stheraven// return (*__t1).*__f; 870227825Stheraven// } 871227825Stheraven 872227825Stheraven// fifth bullet 873227825Stheraven 874227825Stheraventemplate <class _F> 875227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 876227825Stheravendecltype(declval<_F>()()) 877227825Stheraven__invoke(_F __f) 878227825Stheraven{ 879227825Stheraven return __f(); 880227825Stheraven} 881227825Stheraven 882227825Stheraventemplate <class _F, class _A0> 883227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 884227825Stheravendecltype(declval<_F>()(declval<_A0&>())) 885227825Stheraven__invoke(_F __f, _A0& __a0) 886227825Stheraven{ 887227825Stheraven return __f(__a0); 888227825Stheraven} 889227825Stheraven 890227825Stheraventemplate <class _F, class _A0, class _A1> 891227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 892227825Stheravendecltype(declval<_F>()(declval<_A0&>(), declval<_A1&>())) 893227825Stheraven__invoke(_F __f, _A0& __a0, _A1& __a1) 894227825Stheraven{ 895227825Stheraven return __f(__a0, __a1); 896227825Stheraven} 897227825Stheraven 898227825Stheraventemplate <class _F, class _A0, class _A1, class _A2> 899227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 900227825Stheravendecltype(declval<_F>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>())) 901227825Stheraven__invoke(_F __f, _A0& __a0, _A1& __a1, _A2& __a2) 902227825Stheraven{ 903227825Stheraven return __f(__a0, __a1, __a2); 904227825Stheraven} 905227825Stheraven 906227825Stheraven// template <class _R, class _F> 907227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 908227825Stheraven// _R 909227825Stheraven// __invoke(_F& __f) 910227825Stheraven// { 911227825Stheraven// return __f(); 912227825Stheraven// } 913227825Stheraven// 914227825Stheraven// template <class _R, class _F, class _A0> 915227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 916227825Stheraven// typename enable_if 917227825Stheraven// < 918227825Stheraven// !is_member_pointer<_F>::value, 919227825Stheraven// _R 920227825Stheraven// >::type 921227825Stheraven// __invoke(_F& __f, _A0& __a0) 922227825Stheraven// { 923227825Stheraven// return __f(__a0); 924227825Stheraven// } 925227825Stheraven// 926227825Stheraven// template <class _R, class _F, class _A0, class _A1> 927227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 928227825Stheraven// _R 929227825Stheraven// __invoke(_F& __f, _A0& __a0, _A1& __a1) 930227825Stheraven// { 931227825Stheraven// return __f(__a0, __a1); 932227825Stheraven// } 933227825Stheraven// 934227825Stheraven// template <class _R, class _F, class _A0, class _A1, class _A2> 935227825Stheraven// inline _LIBCPP_INLINE_VISIBILITY 936227825Stheraven// _R 937227825Stheraven// __invoke(_F& __f, _A0& __a0, _A1& __a1, _A2& __a2) 938227825Stheraven// { 939227825Stheraven// return __f(__a0, __a1, __a2); 940227825Stheraven// } 941227825Stheraven 942227825Stheraventemplate <class _Tp> 943227825Stheravenstruct __has_type 944227825Stheraven{ 945227825Stheravenprivate: 946227825Stheraven struct __two {char _; char __;}; 947227825Stheraven template <class _Up> static __two __test(...); 948227825Stheraven template <class _Up> static char __test(typename _Up::type* = 0); 949227825Stheravenpublic: 950227825Stheraven static const bool value = sizeof(__test<_Tp>(0)) == 1; 951227825Stheraven}; 952227825Stheraven 953227825Stheraventemplate <class _F, bool = __has_result_type<__weak_result_type<_F> >::value> 954227825Stheravenstruct __invoke_return 955227825Stheraven{ 956227825Stheraven typedef typename __weak_result_type<_F>::result_type type; 957227825Stheraven}; 958227825Stheraven 959227825Stheraventemplate <class _F> 960227825Stheravenstruct __invoke_return<_F, false> 961227825Stheraven{ 962227825Stheraven typedef decltype(__invoke(_VSTD::declval<_F>())) type; 963227825Stheraven}; 964227825Stheraven 965227825Stheraventemplate <class _Tp, class _A0> 966227825Stheravenstruct __invoke_return0 967227825Stheraven{ 968227825Stheraven typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type; 969227825Stheraven}; 970227825Stheraven 971227825Stheraventemplate <class _R, class _T, class _A0> 972227825Stheravenstruct __invoke_return0<_R _T::*, _A0> 973227825Stheraven{ 974227825Stheraven typedef typename __apply_cv<_A0, _R>::type& type; 975227825Stheraven}; 976227825Stheraven 977227825Stheraventemplate <class _R, class _T, class _A0> 978227825Stheravenstruct __invoke_return0<_R _T::*, _A0*> 979227825Stheraven{ 980227825Stheraven typedef typename __apply_cv<_A0, _R>::type& type; 981227825Stheraven}; 982227825Stheraven 983227825Stheraventemplate <class _Tp, class _A0, class _A1> 984227825Stheravenstruct __invoke_return1 985227825Stheraven{ 986227825Stheraven typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(), 987227825Stheraven _VSTD::declval<_A1>())) type; 988227825Stheraven}; 989227825Stheraven 990227825Stheraventemplate <class _Tp, class _A0, class _A1, class _A2> 991227825Stheravenstruct __invoke_return2 992227825Stheraven{ 993227825Stheraven typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(), 994227825Stheraven _VSTD::declval<_A1>(), 995227825Stheraven _VSTD::declval<_A2>())) type; 996227825Stheraven}; 997227825Stheraven 998227825Stheraventemplate <class _Tp> 999227825Stheravenclass _LIBCPP_VISIBLE reference_wrapper 1000227825Stheraven : public __weak_result_type<_Tp> 1001227825Stheraven{ 1002227825Stheravenpublic: 1003227825Stheraven // types 1004227825Stheraven typedef _Tp type; 1005227825Stheravenprivate: 1006227825Stheraven type* __f_; 1007227825Stheraven 1008227825Stheravenpublic: 1009227825Stheraven // construct/copy/destroy 1010227825Stheraven _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) : __f_(&__f) {} 1011227825Stheraven 1012227825Stheraven // access 1013227825Stheraven _LIBCPP_INLINE_VISIBILITY operator type& () const {return *__f_;} 1014227825Stheraven _LIBCPP_INLINE_VISIBILITY type& get() const {return *__f_;} 1015227825Stheraven 1016227825Stheraven // invoke 1017227825Stheraven 1018227825Stheraven _LIBCPP_INLINE_VISIBILITY 1019227825Stheraven typename __invoke_return<type&>::type 1020227825Stheraven operator() () const 1021227825Stheraven { 1022227825Stheraven return __invoke(get()); 1023227825Stheraven } 1024227825Stheraven 1025227825Stheraven template <class _A0> 1026227825Stheraven _LIBCPP_INLINE_VISIBILITY 1027227825Stheraven typename __invoke_return0<type&, _A0>::type 1028227825Stheraven operator() (_A0& __a0) const 1029227825Stheraven { 1030227825Stheraven return __invoke(get(), __a0); 1031227825Stheraven } 1032227825Stheraven 1033227825Stheraven template <class _A0, class _A1> 1034227825Stheraven _LIBCPP_INLINE_VISIBILITY 1035227825Stheraven typename __invoke_return1<type&, _A0, _A1>::type 1036227825Stheraven operator() (_A0& __a0, _A1& __a1) const 1037227825Stheraven { 1038227825Stheraven return __invoke(get(), __a0, __a1); 1039227825Stheraven } 1040227825Stheraven 1041227825Stheraven template <class _A0, class _A1, class _A2> 1042227825Stheraven _LIBCPP_INLINE_VISIBILITY 1043227825Stheraven typename __invoke_return2<type&, _A0, _A1, _A2>::type 1044227825Stheraven operator() (_A0& __a0, _A1& __a1, _A2& __a2) const 1045227825Stheraven { 1046227825Stheraven return __invoke(get(), __a0, __a1, __a2); 1047227825Stheraven } 1048227825Stheraven}; 1049227825Stheraven 1050227825Stheraventemplate <class _Tp> struct ____is_reference_wrapper : public false_type {}; 1051227825Stheraventemplate <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {}; 1052227825Stheraventemplate <class _Tp> struct __is_reference_wrapper 1053227825Stheraven : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {}; 1054227825Stheraven 1055227825Stheraventemplate <class _Tp> 1056227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 1057227825Stheravenreference_wrapper<_Tp> 1058227825Stheravenref(_Tp& __t) 1059227825Stheraven{ 1060227825Stheraven return reference_wrapper<_Tp>(__t); 1061227825Stheraven} 1062227825Stheraven 1063227825Stheraventemplate <class _Tp> 1064227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 1065227825Stheravenreference_wrapper<_Tp> 1066227825Stheravenref(reference_wrapper<_Tp> __t) 1067227825Stheraven{ 1068227825Stheraven return ref(__t.get()); 1069227825Stheraven} 1070227825Stheraven 1071227825Stheraventemplate <class _Tp> 1072227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 1073227825Stheravenreference_wrapper<const _Tp> 1074227825Stheravencref(const _Tp& __t) 1075227825Stheraven{ 1076227825Stheraven return reference_wrapper<const _Tp>(__t); 1077227825Stheraven} 1078227825Stheraven 1079227825Stheraventemplate <class _Tp> 1080227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 1081227825Stheravenreference_wrapper<const _Tp> 1082227825Stheravencref(reference_wrapper<_Tp> __t) 1083227825Stheraven{ 1084227825Stheraven return cref(__t.get()); 1085227825Stheraven} 1086227825Stheraven 1087227825Stheraven#endif // _LIBCPP_FUNCTIONAL_BASE_03 1088