__functional_base_03 revision 256281
176082Sbmah// -*- C++ -*-
276082Sbmah//===----------------------------------------------------------------------===//
376082Sbmah//
476082Sbmah//                     The LLVM Compiler Infrastructure
576082Sbmah//
676082Sbmah// This file is dual licensed under the MIT and the University of Illinois Open
776082Sbmah// Source Licenses. See LICENSE.TXT for details.
876082Sbmah//
976082Sbmah//===----------------------------------------------------------------------===//
1076082Sbmah
1176082Sbmah#ifndef _LIBCPP_FUNCTIONAL_BASE_03
1276082Sbmah#define _LIBCPP_FUNCTIONAL_BASE_03
1381327Sbmah
1481327Sbmah// manual variadic expansion for <functional>
1581327Sbmah
1681327Sbmah// __weak_result_type
1781327Sbmah
1881327Sbmahtemplate <class _Tp>
1981327Sbmahstruct __derives_from_unary_function
2081327Sbmah{
2181327Sbmahprivate:
2281327Sbmah    struct __two {char __lx; char __lxx;};
2381327Sbmah    static __two __test(...);
2481327Sbmah    template <class _Ap, class _Rp>
2581327Sbmah        static unary_function<_Ap, _Rp>
2681327Sbmah        __test(const volatile unary_function<_Ap, _Rp>*);
2781327Sbmahpublic:
2881327Sbmah    static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
2981327Sbmah    typedef decltype(__test((_Tp*)0)) type;
3081327Sbmah};
3181327Sbmah
3281327Sbmahtemplate <class _Tp>
3381327Sbmahstruct __derives_from_binary_function
3481327Sbmah{
3581327Sbmahprivate:
3681327Sbmah    struct __two {char __lx; char __lxx;};
3781327Sbmah    static __two __test(...);
3881327Sbmah    template <class _A1, class _A2, class _Rp>
3981327Sbmah        static binary_function<_A1, _A2, _Rp>
4081327Sbmah        __test(const volatile binary_function<_A1, _A2, _Rp>*);
4181327Sbmahpublic:
4281327Sbmah    static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
4381327Sbmah    typedef decltype(__test((_Tp*)0)) type;
4481327Sbmah};
4581327Sbmah
4681327Sbmahtemplate <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
4781327Sbmahstruct __maybe_derive_from_unary_function  // bool is true
4881327Sbmah    : public __derives_from_unary_function<_Tp>::type
4981327Sbmah{
5081327Sbmah};
5181327Sbmah
5281327Sbmahtemplate <class _Tp>
5381327Sbmahstruct __maybe_derive_from_unary_function<_Tp, false>
5481327Sbmah{
5581327Sbmah};
5681327Sbmah
5781327Sbmahtemplate <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
5881327Sbmahstruct __maybe_derive_from_binary_function  // bool is true
5981327Sbmah    : public __derives_from_binary_function<_Tp>::type
6081327Sbmah{
6181327Sbmah};
6281327Sbmah
6381327Sbmahtemplate <class _Tp>
6481327Sbmahstruct __maybe_derive_from_binary_function<_Tp, false>
6581327Sbmah{
6681327Sbmah};
6781327Sbmah
6881327Sbmahtemplate <class _Tp, bool = __has_result_type<_Tp>::value>
6981327Sbmahstruct __weak_result_type_imp // bool is true
7081327Sbmah    : public __maybe_derive_from_unary_function<_Tp>,
7181327Sbmah      public __maybe_derive_from_binary_function<_Tp>
7281327Sbmah{
7381327Sbmah    typedef typename _Tp::result_type result_type;
7481327Sbmah};
7581327Sbmah
7681327Sbmahtemplate <class _Tp>
7781327Sbmahstruct __weak_result_type_imp<_Tp, false>
7881327Sbmah    : public __maybe_derive_from_unary_function<_Tp>,
7981327Sbmah      public __maybe_derive_from_binary_function<_Tp>
8081327Sbmah{
8181327Sbmah};
8281327Sbmah
8381327Sbmahtemplate <class _Tp>
8481327Sbmahstruct __weak_result_type
8581327Sbmah    : public __weak_result_type_imp<typename remove_reference<_Tp>::type>
8681327Sbmah{
8781327Sbmah};
8881327Sbmah
8981327Sbmah// 0 argument case
9081327Sbmah
9181327Sbmahtemplate <class _Rp>
9281327Sbmahstruct __weak_result_type<_Rp ()>
9381327Sbmah{
9481327Sbmah    typedef _Rp result_type;
9581327Sbmah};
9681327Sbmah
9781327Sbmahtemplate <class _Rp>
9881327Sbmahstruct __weak_result_type<_Rp (&)()>
9981327Sbmah{
10081327Sbmah    typedef _Rp result_type;
10181327Sbmah};
10281327Sbmah
10381327Sbmahtemplate <class _Rp>
10481327Sbmahstruct __weak_result_type<_Rp (*)()>
10581327Sbmah{
10681327Sbmah    typedef _Rp result_type;
10781327Sbmah};
10881327Sbmah
10981327Sbmah// 1 argument case
11081327Sbmah
11181327Sbmahtemplate <class _Rp, class _A1>
11281327Sbmahstruct __weak_result_type<_Rp (_A1)>
11381327Sbmah    : public unary_function<_A1, _Rp>
11481327Sbmah{
11581327Sbmah};
11681327Sbmah
11781327Sbmahtemplate <class _Rp, class _A1>
11881327Sbmahstruct __weak_result_type<_Rp (&)(_A1)>
11981327Sbmah    : public unary_function<_A1, _Rp>
12081327Sbmah{
12181327Sbmah};
12281327Sbmah
12381327Sbmahtemplate <class _Rp, class _A1>
12481327Sbmahstruct __weak_result_type<_Rp (*)(_A1)>
12581327Sbmah    : public unary_function<_A1, _Rp>
12681327Sbmah{
12781327Sbmah};
12881327Sbmah
12981327Sbmahtemplate <class _Rp, class _Cp>
13081327Sbmahstruct __weak_result_type<_Rp (_Cp::*)()>
13181327Sbmah    : public unary_function<_Cp*, _Rp>
13281327Sbmah{
13381327Sbmah};
13481327Sbmah
13581327Sbmahtemplate <class _Rp, class _Cp>
13681327Sbmahstruct __weak_result_type<_Rp (_Cp::*)() const>
13781327Sbmah    : public unary_function<const _Cp*, _Rp>
13881327Sbmah{
13981327Sbmah};
14081327Sbmah
14181327Sbmahtemplate <class _Rp, class _Cp>
14281327Sbmahstruct __weak_result_type<_Rp (_Cp::*)() volatile>
14381327Sbmah    : public unary_function<volatile _Cp*, _Rp>
14481327Sbmah{
14581327Sbmah};
14681327Sbmah
14781327Sbmahtemplate <class _Rp, class _Cp>
14881327Sbmahstruct __weak_result_type<_Rp (_Cp::*)() const volatile>
14981327Sbmah    : public unary_function<const volatile _Cp*, _Rp>
15081327Sbmah{
15181327Sbmah};
15281327Sbmah
15381327Sbmah// 2 argument case
15481327Sbmah
15581327Sbmahtemplate <class _Rp, class _A1, class _A2>
15681327Sbmahstruct __weak_result_type<_Rp (_A1, _A2)>
15781327Sbmah    : public binary_function<_A1, _A2, _Rp>
15881327Sbmah{
15981327Sbmah};
16081327Sbmah
16181327Sbmahtemplate <class _Rp, class _A1, class _A2>
16281327Sbmahstruct __weak_result_type<_Rp (*)(_A1, _A2)>
16381327Sbmah    : public binary_function<_A1, _A2, _Rp>
16481327Sbmah{
16581327Sbmah};
16681327Sbmah
16781327Sbmahtemplate <class _Rp, class _A1, class _A2>
16881327Sbmahstruct __weak_result_type<_Rp (&)(_A1, _A2)>
16981327Sbmah    : public binary_function<_A1, _A2, _Rp>
17081327Sbmah{
17181327Sbmah};
17281327Sbmah
17381327Sbmahtemplate <class _Rp, class _Cp, class _A1>
17481327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1)>
17581327Sbmah    : public binary_function<_Cp*, _A1, _Rp>
17681327Sbmah{
17781327Sbmah};
17881327Sbmah
17981327Sbmahtemplate <class _Rp, class _Cp, class _A1>
18081327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1) const>
18181327Sbmah    : public binary_function<const _Cp*, _A1, _Rp>
18281327Sbmah{
18381327Sbmah};
18481327Sbmah
18581327Sbmahtemplate <class _Rp, class _Cp, class _A1>
18681327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
18781327Sbmah    : public binary_function<volatile _Cp*, _A1, _Rp>
18881327Sbmah{
18981327Sbmah};
19081327Sbmah
19181327Sbmahtemplate <class _Rp, class _Cp, class _A1>
19281327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
19381327Sbmah    : public binary_function<const volatile _Cp*, _A1, _Rp>
19481327Sbmah{
19581327Sbmah};
19681327Sbmah
19781327Sbmah// 3 or more arguments
19881327Sbmah
19981327Sbmahtemplate <class _Rp, class _A1, class _A2, class _A3>
20081327Sbmahstruct __weak_result_type<_Rp (_A1, _A2, _A3)>
20181327Sbmah{
20281327Sbmah    typedef _Rp result_type;
20381327Sbmah};
20481327Sbmah
20581327Sbmahtemplate <class _Rp, class _A1, class _A2, class _A3>
20681327Sbmahstruct __weak_result_type<_Rp (&)(_A1, _A2, _A3)>
20781327Sbmah{
20881327Sbmah    typedef _Rp result_type;
20981327Sbmah};
21081327Sbmah
21181327Sbmahtemplate <class _Rp, class _A1, class _A2, class _A3>
21281327Sbmahstruct __weak_result_type<_Rp (*)(_A1, _A2, _A3)>
21381327Sbmah{
21481327Sbmah    typedef _Rp result_type;
21581327Sbmah};
21681327Sbmah
21781327Sbmahtemplate <class _Rp, class _Cp, class _A1, class _A2>
21881327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2)>
21981327Sbmah{
22081327Sbmah    typedef _Rp result_type;
22181327Sbmah};
22281327Sbmah
22381327Sbmahtemplate <class _Rp, class _Cp, class _A1, class _A2>
22481327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) const>
22581327Sbmah{
22681327Sbmah    typedef _Rp result_type;
22781327Sbmah};
22881327Sbmah
22981327Sbmahtemplate <class _Rp, class _Cp, class _A1, class _A2>
23081327Sbmahstruct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) volatile>
23181327Sbmah{
23281327Sbmah    typedef _Rp result_type;
23381327Sbmah};
23481327Sbmah
23581327Sbmah// __invoke
23681327Sbmah
23781327Sbmah// __ref_return0
23881327Sbmah//
23981327Sbmah// template <class _Tp, bool _HasResultType>
24081327Sbmah// struct ________ref_return0  // _HasResultType is true
24181327Sbmah// {
24281327Sbmah//     typedef typename _Tp::result_type type;
24381327Sbmah// };
24481327Sbmah//
24581327Sbmah// template <class _Tp>
24681327Sbmah// struct ________ref_return0<_Tp, false>
24781327Sbmah// {
24881327Sbmah//     typedef void type;
24981327Sbmah// };
25081327Sbmah//
25181327Sbmah// template <class _Tp, bool _IsClass>
25281327Sbmah// struct ____ref_return0  // _IsClass is true
25381327Sbmah//     : public ________ref_return0<_Tp, __has_result_type<typename remove_cv<_Tp>::type>::value>
25481327Sbmah// {
25581327Sbmah// };
25681327Sbmah//
25781327Sbmah// template <class _Tp, bool _HasResultType>
25881327Sbmah// struct ______ref_return0  // _HasResultType is true
25981327Sbmah// {
26081327Sbmah//     typedef typename __callable_type<_Tp>::result_type type;
26181327Sbmah// };
26281327Sbmah//
26381327Sbmah// template <class _Tp>
26481327Sbmah// struct ______ref_return0<_Tp, false>  // pointer to member data
26581327Sbmah// {
26681327Sbmah//     typedef void type;
26781327Sbmah// };
26881327Sbmah//
26981327Sbmah// template <class _Tp>
27081327Sbmah// struct ____ref_return0<_Tp, false>
27181327Sbmah//     : public ______ref_return0<typename remove_cv<_Tp>::type,
27281327Sbmah//                  __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value>
27381327Sbmah// {
27481327Sbmah// };
27581327Sbmah//
27681327Sbmah// template <class _Tp>
27781327Sbmah// struct __ref_return0
27881327Sbmah//     : public ____ref_return0<typename remove_reference<_Tp>::type,
27981327Sbmah//                    is_class<typename remove_reference<_Tp>::type>::value>
28081327Sbmah// {
28181327Sbmah// };
28281327Sbmah//
28381327Sbmah// __ref_return1
28481327Sbmah//
28581327Sbmah// template <class _Tp, bool _IsClass, class _A0>
28681327Sbmah// struct ____ref_return1  // _IsClass is true
28781327Sbmah// {
28881327Sbmah//     typedef typename result_of<_Tp(_A0)>::type type;
28981327Sbmah// };
29081327Sbmah//
29181327Sbmah// template <class _Tp, bool _HasResultType, class _A0>
29281327Sbmah// struct ______ref_return1  // _HasResultType is true
29381327Sbmah// {
29481327Sbmah//     typedef typename __callable_type<_Tp>::result_type type;
29581327Sbmah// };
29681327Sbmah//
29781327Sbmah// template <class _Tp, class _A0, bool>
29881327Sbmah// struct __ref_return1_member_data1;
29981327Sbmah//
30081327Sbmah// template <class _Rp, class _Cp, class _A0>
30181327Sbmah// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, true>
30281327Sbmah// {
30381327Sbmah//     typedef typename __apply_cv<_A0, _Rp>::type& type;
30481327Sbmah// };
30581327Sbmah//
30681327Sbmah// template <class _Rp, class _Cp, class _A0>
30781327Sbmah// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, false>
30881327Sbmah// {
30981327Sbmah//     static _A0 __a;
31081327Sbmah//     typedef typename __apply_cv<decltype(*__a), _Rp>::type& type;
31181327Sbmah// };
31281327Sbmah//
31381327Sbmah// template <class _Tp, class _A0>
31481327Sbmah// struct __ref_return1_member_data;
31581327Sbmah//
31681327Sbmah// template <class _Rp, class _Cp, class _A0>
31781327Sbmah// struct __ref_return1_member_data<_Rp _Cp::*, _A0>
31881327Sbmah//     : public __ref_return1_member_data1<_Rp _Cp::*, _A0,
31981327Sbmah//                 is_same<typename remove_cv<_Cp>::type,
32081327Sbmah//                         typename remove_cv<typename remove_reference<_A0>::type>::type>::value>
32181327Sbmah// {
32281327Sbmah// };
32381327Sbmah//
32481327Sbmah// template <class _Tp, class _A0>
32581327Sbmah// struct ______ref_return1<_Tp, false, _A0>  // pointer to member data
32681327Sbmah//     : public __ref_return1_member_data<typename remove_cv<_Tp>::type, _A0>
32781327Sbmah// {
32881327Sbmah// };
32981327Sbmah//
33081327Sbmah// template <class _Tp, class _A0>
33181327Sbmah// struct ____ref_return1<_Tp, false, _A0>
33281327Sbmah//     : public ______ref_return1<typename remove_cv<_Tp>::type,
33381327Sbmah//                  __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0>
33481327Sbmah// {
33581327Sbmah// };
33681327Sbmah//
33781327Sbmah// template <class _Tp, class _A0>
33881327Sbmah// struct __ref_return1
33981327Sbmah//     : public ____ref_return1<typename remove_reference<_Tp>::type,
34081327Sbmah//                    is_class<typename remove_reference<_Tp>::type>::value, _A0>
34181327Sbmah// {
34281327Sbmah// };
34381327Sbmah//
34476082Sbmah// __ref_return2
345//
346// template <class _Tp, bool _IsClass, class _A0, class _A1>
347// struct ____ref_return2  // _IsClass is true
348// {
349//     typedef typename result_of<_Tp(_A0, _A1)>::type type;
350// };
351//
352// template <class _Tp, bool _HasResultType, class _A0, class _A1>
353// struct ______ref_return2  // _HasResultType is true
354// {
355//     typedef typename __callable_type<_Tp>::result_type type;
356// };
357//
358// template <class _Tp>
359// struct ______ref_return2<_Tp, false, class _A0, class _A1>  // pointer to member data
360// {
361//     static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer"
362//                          " to member data with too many arguments.");
363// };
364//
365// template <class _Tp, class _A0, class _A1>
366// struct ____ref_return2<_Tp, false, _A0, _A1>
367//     : public ______ref_return2<typename remove_cv<_Tp>::type,
368//                  __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1>
369// {
370// };
371//
372// template <class _Tp, class _A0, class _A1>
373// struct __ref_return2
374//     : public ____ref_return2<typename remove_reference<_Tp>::type,
375//                    is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1>
376// {
377// };
378//
379// __ref_return3
380//
381// template <class _Tp, bool _IsClass, class _A0, class _A1, class _A2>
382// struct ____ref_return3  // _IsClass is true
383// {
384//     typedef typename result_of<_Tp(_A0, _A1, _A2)>::type type;
385// };
386//
387// template <class _Tp, bool _HasResultType, class _A0, class _A1, class _A2>
388// struct ______ref_return3  // _HasResultType is true
389// {
390//     typedef typename __callable_type<_Tp>::result_type type;
391// };
392//
393// template <class _Tp>
394// struct ______ref_return3<_Tp, false, class _A0, class _A1, class _A2>  // pointer to member data
395// {
396//     static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer"
397//                          " to member data with too many arguments.");
398// };
399//
400// template <class _Tp, class _A0, class _A1, class _A2>
401// struct ____ref_return3<_Tp, false, _A0, _A1, _A2>
402//     : public ______ref_return3<typename remove_cv<_Tp>::type,
403//                  __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1, _A2>
404// {
405// };
406//
407// template <class _Tp, class _A0, class _A1, class _A2>
408// struct __ref_return3
409//     : public ____ref_return3<typename remove_reference<_Tp>::type,
410//                    is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1, _A2>
411// {
412// };
413
414// first bullet
415
416template <class _Rp, class _Tp, class _T1>
417inline _LIBCPP_INLINE_VISIBILITY
418typename enable_if
419<
420    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
421    _Rp
422>::type
423__invoke(_Rp (_Tp::*__f)(), _T1& __t1)
424{
425    return (__t1.*__f)();
426}
427
428template <class _Rp, class _Tp, class _T1, class _A0>
429inline _LIBCPP_INLINE_VISIBILITY
430typename enable_if
431<
432    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
433    _Rp
434>::type
435__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0)
436{
437    return (__t1.*__f)(__a0);
438}
439
440template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
441inline _LIBCPP_INLINE_VISIBILITY
442typename enable_if
443<
444    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
445    _Rp
446>::type
447__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
448{
449    return (__t1.*__f)(__a0, __a1);
450}
451
452template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
453inline _LIBCPP_INLINE_VISIBILITY
454typename enable_if
455<
456    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
457    _Rp
458>::type
459__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
460{
461    return (__t1.*__f)(__a0, __a1, __a2);
462}
463
464template <class _Rp, class _Tp, class _T1>
465inline _LIBCPP_INLINE_VISIBILITY
466typename enable_if
467<
468    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
469    _Rp
470>::type
471__invoke(_Rp (_Tp::*__f)() const, _T1& __t1)
472{
473    return (__t1.*__f)();
474}
475
476template <class _Rp, class _Tp, class _T1, class _A0>
477inline _LIBCPP_INLINE_VISIBILITY
478typename enable_if
479<
480    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
481    _Rp
482>::type
483__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0)
484{
485    return (__t1.*__f)(__a0);
486}
487
488template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
489inline _LIBCPP_INLINE_VISIBILITY
490typename enable_if
491<
492    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
493    _Rp
494>::type
495__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
496{
497    return (__t1.*__f)(__a0, __a1);
498}
499
500template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
501inline _LIBCPP_INLINE_VISIBILITY
502typename enable_if
503<
504    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
505    _Rp
506>::type
507__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
508{
509    return (__t1.*__f)(__a0, __a1, __a2);
510}
511
512template <class _Rp, class _Tp, class _T1>
513inline _LIBCPP_INLINE_VISIBILITY
514typename enable_if
515<
516    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
517    _Rp
518>::type
519__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1)
520{
521    return (__t1.*__f)();
522}
523
524template <class _Rp, class _Tp, class _T1, class _A0>
525inline _LIBCPP_INLINE_VISIBILITY
526typename enable_if
527<
528    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
529    _Rp
530>::type
531__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
532{
533    return (__t1.*__f)(__a0);
534}
535
536template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
537inline _LIBCPP_INLINE_VISIBILITY
538typename enable_if
539<
540    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
541    _Rp
542>::type
543__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
544{
545    return (__t1.*__f)(__a0, __a1);
546}
547
548template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
549inline _LIBCPP_INLINE_VISIBILITY
550typename enable_if
551<
552    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
553    _Rp
554>::type
555__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
556{
557    return (__t1.*__f)(__a0, __a1, __a2);
558}
559
560template <class _Rp, class _Tp, class _T1>
561inline _LIBCPP_INLINE_VISIBILITY
562typename enable_if
563<
564    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
565    _Rp
566>::type
567__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1)
568{
569    return (__t1.*__f)();
570}
571
572template <class _Rp, class _Tp, class _T1, class _A0>
573inline _LIBCPP_INLINE_VISIBILITY
574typename enable_if
575<
576    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
577    _Rp
578>::type
579__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
580{
581    return (__t1.*__f)(__a0);
582}
583
584template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
585inline _LIBCPP_INLINE_VISIBILITY
586typename enable_if
587<
588    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
589    _Rp
590>::type
591__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
592{
593    return (__t1.*__f)(__a0, __a1);
594}
595
596template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
597inline _LIBCPP_INLINE_VISIBILITY
598typename enable_if
599<
600    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
601    _Rp
602>::type
603__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
604{
605    return (__t1.*__f)(__a0, __a1, __a2);
606}
607
608// second bullet
609
610template <class _Rp, class _Tp, class _T1>
611inline _LIBCPP_INLINE_VISIBILITY
612typename enable_if
613<
614    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
615    _Rp
616>::type
617__invoke(_Rp (_Tp::*__f)(), _T1 __t1)
618{
619    return ((*__t1).*__f)();
620}
621
622template <class _Rp, class _Tp, class _T1, class _A0>
623inline _LIBCPP_INLINE_VISIBILITY
624typename enable_if
625<
626    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
627    _Rp
628>::type
629__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0)
630{
631    return ((*__t1).*__f)(__a0);
632}
633
634template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
635inline _LIBCPP_INLINE_VISIBILITY
636typename enable_if
637<
638    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
639    _Rp
640>::type
641__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
642{
643    return ((*__t1).*__f)(__a0, __a1);
644}
645
646template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
647inline _LIBCPP_INLINE_VISIBILITY
648typename enable_if
649<
650    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
651    _Rp
652>::type
653__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
654{
655    return ((*__t1).*__f)(__a0, __a1, __a2);
656}
657
658template <class _Rp, class _Tp, class _T1>
659inline _LIBCPP_INLINE_VISIBILITY
660typename enable_if
661<
662    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
663    _Rp
664>::type
665__invoke(_Rp (_Tp::*__f)() const, _T1 __t1)
666{
667    return ((*__t1).*__f)();
668}
669
670template <class _Rp, class _Tp, class _T1, class _A0>
671inline _LIBCPP_INLINE_VISIBILITY
672typename enable_if
673<
674    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
675    _Rp
676>::type
677__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0)
678{
679    return ((*__t1).*__f)(__a0);
680}
681
682template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
683inline _LIBCPP_INLINE_VISIBILITY
684typename enable_if
685<
686    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
687    _Rp
688>::type
689__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
690{
691    return ((*__t1).*__f)(__a0, __a1);
692}
693
694template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
695inline _LIBCPP_INLINE_VISIBILITY
696typename enable_if
697<
698    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
699    _Rp
700>::type
701__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
702{
703    return ((*__t1).*__f)(__a0, __a1, __a2);
704}
705
706template <class _Rp, class _Tp, class _T1>
707inline _LIBCPP_INLINE_VISIBILITY
708typename enable_if
709<
710    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
711    _Rp
712>::type
713__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1)
714{
715    return ((*__t1).*__f)();
716}
717
718template <class _Rp, class _Tp, class _T1, class _A0>
719inline _LIBCPP_INLINE_VISIBILITY
720typename enable_if
721<
722    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
723    _Rp
724>::type
725__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
726{
727    return ((*__t1).*__f)(__a0);
728}
729
730template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
731inline _LIBCPP_INLINE_VISIBILITY
732typename enable_if
733<
734    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
735    _Rp
736>::type
737__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
738{
739    return ((*__t1).*__f)(__a0, __a1);
740}
741
742template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
743inline _LIBCPP_INLINE_VISIBILITY
744typename enable_if
745<
746    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
747    _Rp
748>::type
749__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
750{
751    return ((*__t1).*__f)(__a0, __a1, __a2);
752}
753
754template <class _Rp, class _Tp, class _T1>
755inline _LIBCPP_INLINE_VISIBILITY
756typename enable_if
757<
758    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
759    _Rp
760>::type
761__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1)
762{
763    return ((*__t1).*__f)();
764}
765
766template <class _Rp, class _Tp, class _T1, class _A0>
767inline _LIBCPP_INLINE_VISIBILITY
768typename enable_if
769<
770    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
771    _Rp
772>::type
773__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
774{
775    return ((*__t1).*__f)(__a0);
776}
777
778template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
779inline _LIBCPP_INLINE_VISIBILITY
780typename enable_if
781<
782    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
783    _Rp
784>::type
785__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
786{
787    return ((*__t1).*__f)(__a0, __a1);
788}
789
790template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
791inline _LIBCPP_INLINE_VISIBILITY
792typename enable_if
793<
794    !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
795    _Rp
796>::type
797__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
798{
799    return ((*__t1).*__f)(__a0, __a1, __a2);
800}
801
802// third bullet
803
804template <class _Rp, class _Tp, class _T1>
805inline _LIBCPP_INLINE_VISIBILITY
806typename enable_if
807<
808    is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
809    typename __apply_cv<_T1, _Rp>::type&
810>::type
811__invoke(_Rp _Tp::* __f, _T1& __t1)
812{
813    return __t1.*__f;
814}
815
816template <class _Rp, class _Tp>
817inline _LIBCPP_INLINE_VISIBILITY
818void
819__invoke(_Rp _Tp::*)
820{
821}
822
823// template <class _Dp, class _Rp, class _Tp, class _T1>
824// inline _LIBCPP_INLINE_VISIBILITY
825// typename enable_if
826// <
827//     is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
828//     typename __ref_return1<_Rp _Tp::*, _T1>::type
829// >::type
830// __invoke(_Rp _Tp::* __f, _T1& __t1)
831// {
832//     return __t1.*__f;
833// }
834
835// forth bullet
836
837template <class _T1, class _Rp, bool>
838struct __4th_helper
839{
840};
841
842template <class _T1, class _Rp>
843struct __4th_helper<_T1, _Rp, true>
844{
845    typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Rp>::type type;
846};
847
848template <class _Rp, class _Tp, class _T1>
849inline _LIBCPP_INLINE_VISIBILITY
850typename __4th_helper<_T1, _Rp,
851                      !is_base_of<_Tp,
852                                  typename remove_reference<_T1>::type
853                                 >::value
854                     >::type&
855__invoke(_Rp _Tp::* __f, _T1& __t1)
856{
857    return (*__t1).*__f;
858}
859
860// template <class _Dp, class _Rp, class _Tp, class _T1>
861// inline _LIBCPP_INLINE_VISIBILITY
862// typename enable_if
863// <
864//     !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
865//     typename __ref_return1<_Rp _Tp::*, _T1>::type
866// >::type
867// __invoke(_Rp _Tp::* __f, _T1 __t1)
868// {
869//     return (*__t1).*__f;
870// }
871
872// fifth bullet
873
874template <class _Fp>
875inline _LIBCPP_INLINE_VISIBILITY
876decltype(declval<_Fp>()())
877__invoke(_Fp __f)
878{
879    return __f();
880}
881
882template <class _Fp, class _A0>
883inline _LIBCPP_INLINE_VISIBILITY
884decltype(declval<_Fp>()(declval<_A0&>()))
885__invoke(_Fp __f, _A0& __a0)
886{
887    return __f(__a0);
888}
889
890template <class _Fp, class _A0, class _A1>
891inline _LIBCPP_INLINE_VISIBILITY
892decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>()))
893__invoke(_Fp __f, _A0& __a0, _A1& __a1)
894{
895    return __f(__a0, __a1);
896}
897
898template <class _Fp, class _A0, class _A1, class _A2>
899inline _LIBCPP_INLINE_VISIBILITY
900decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>()))
901__invoke(_Fp __f, _A0& __a0, _A1& __a1, _A2& __a2)
902{
903    return __f(__a0, __a1, __a2);
904}
905
906// template <class _Rp, class _Fp>
907// inline _LIBCPP_INLINE_VISIBILITY
908// _Rp
909// __invoke(_Fp& __f)
910// {
911//     return __f();
912// }
913//
914// template <class _Rp, class _Fp, class _A0>
915// inline _LIBCPP_INLINE_VISIBILITY
916// typename enable_if
917// <
918//     !is_member_pointer<_Fp>::value,
919//     _Rp
920// >::type
921// __invoke(_Fp& __f, _A0& __a0)
922// {
923//     return __f(__a0);
924// }
925//
926// template <class _Rp, class _Fp, class _A0, class _A1>
927// inline _LIBCPP_INLINE_VISIBILITY
928// _Rp
929// __invoke(_Fp& __f, _A0& __a0, _A1& __a1)
930// {
931//     return __f(__a0, __a1);
932// }
933//
934// template <class _Rp, class _Fp, class _A0, class _A1, class _A2>
935// inline _LIBCPP_INLINE_VISIBILITY
936// _Rp
937// __invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
938// {
939//     return __f(__a0, __a1, __a2);
940// }
941
942template <class _Tp>
943struct __has_type
944{
945private:
946    struct __two {char __lx; char __lxx;};
947    template <class _Up> static __two __test(...);
948    template <class _Up> static char __test(typename _Up::type* = 0);
949public:
950    static const bool value = sizeof(__test<_Tp>(0)) == 1;
951};
952
953template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
954struct __invoke_return
955{
956    typedef typename __weak_result_type<_Fp>::result_type type;
957};
958
959template <class _Fp>
960struct __invoke_return<_Fp, false>
961{
962    typedef decltype(__invoke(_VSTD::declval<_Fp>())) type;
963};
964
965template <class _Tp, class _A0>
966struct __invoke_return0
967{
968    typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type;
969};
970
971template <class _Rp, class _Tp, class _A0>
972struct __invoke_return0<_Rp _Tp::*, _A0>
973{
974    typedef typename __apply_cv<_A0, _Rp>::type& type;
975};
976
977template <class _Rp, class _Tp, class _A0>
978struct __invoke_return0<_Rp _Tp::*, _A0*>
979{
980    typedef typename __apply_cv<_A0, _Rp>::type& type;
981};
982
983template <class _Tp, class _A0, class _A1>
984struct __invoke_return1
985{
986    typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
987                                                    _VSTD::declval<_A1>())) type;
988};
989
990template <class _Tp, class _A0, class _A1, class _A2>
991struct __invoke_return2
992{
993    typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
994                                                    _VSTD::declval<_A1>(),
995                                                    _VSTD::declval<_A2>())) type;
996};
997
998template <class _Tp>
999class _LIBCPP_TYPE_VIS reference_wrapper
1000    : public __weak_result_type<_Tp>
1001{
1002public:
1003    // types
1004    typedef _Tp type;
1005private:
1006    type* __f_;
1007
1008public:
1009    // construct/copy/destroy
1010    _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) : __f_(&__f) {}
1011
1012    // access
1013    _LIBCPP_INLINE_VISIBILITY operator type&    () const {return *__f_;}
1014    _LIBCPP_INLINE_VISIBILITY          type& get() const {return *__f_;}
1015
1016    // invoke
1017
1018    _LIBCPP_INLINE_VISIBILITY
1019    typename __invoke_return<type&>::type
1020       operator() () const
1021       {
1022           return __invoke(get());
1023       }
1024
1025    template <class _A0>
1026       _LIBCPP_INLINE_VISIBILITY
1027       typename __invoke_return0<type&, _A0>::type
1028          operator() (_A0& __a0) const
1029          {
1030              return __invoke(get(), __a0);
1031          }
1032
1033    template <class _A0, class _A1>
1034       _LIBCPP_INLINE_VISIBILITY
1035       typename __invoke_return1<type&, _A0, _A1>::type
1036          operator() (_A0& __a0, _A1& __a1) const
1037          {
1038              return __invoke(get(), __a0, __a1);
1039          }
1040
1041    template <class _A0, class _A1, class _A2>
1042       _LIBCPP_INLINE_VISIBILITY
1043       typename __invoke_return2<type&, _A0, _A1, _A2>::type
1044          operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
1045          {
1046              return __invoke(get(), __a0, __a1, __a2);
1047          }
1048};
1049
1050template <class _Tp> struct ____is_reference_wrapper : public false_type {};
1051template <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {};
1052template <class _Tp> struct __is_reference_wrapper
1053    : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {};
1054
1055template <class _Tp>
1056inline _LIBCPP_INLINE_VISIBILITY
1057reference_wrapper<_Tp>
1058ref(_Tp& __t)
1059{
1060    return reference_wrapper<_Tp>(__t);
1061}
1062
1063template <class _Tp>
1064inline _LIBCPP_INLINE_VISIBILITY
1065reference_wrapper<_Tp>
1066ref(reference_wrapper<_Tp> __t)
1067{
1068    return ref(__t.get());
1069}
1070
1071template <class _Tp>
1072inline _LIBCPP_INLINE_VISIBILITY
1073reference_wrapper<const _Tp>
1074cref(const _Tp& __t)
1075{
1076    return reference_wrapper<const _Tp>(__t);
1077}
1078
1079template <class _Tp>
1080inline _LIBCPP_INLINE_VISIBILITY
1081reference_wrapper<const _Tp>
1082cref(reference_wrapper<_Tp> __t)
1083{
1084    return cref(__t.get());
1085}
1086
1087#endif  // _LIBCPP_FUNCTIONAL_BASE_03
1088