blob: f297ee057a9bbae840586159ddb4d05955d24c57 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_FUNCTIONAL_BASE_03
12#define _LIBCPP_FUNCTIONAL_BASE_03
13
14// manual variadic expansion for <functional>
15
16// __weak_result_type
17
18template <class _Tp>
19struct __derives_from_unary_function
20{
21private:
Howard Hinnant9c0df142012-10-30 19:06:59 +000022 struct __two {char __lx; char __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000023 static __two __test(...);
Howard Hinnant99968442011-11-29 18:15:50 +000024 template <class _Ap, class _Rp>
25 static unary_function<_Ap, _Rp>
26 __test(const volatile unary_function<_Ap, _Rp>*);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000027public:
28 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
29 typedef decltype(__test((_Tp*)0)) type;
30};
31
32template <class _Tp>
33struct __derives_from_binary_function
34{
35private:
Howard Hinnant9c0df142012-10-30 19:06:59 +000036 struct __two {char __lx; char __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000037 static __two __test(...);
Howard Hinnant99968442011-11-29 18:15:50 +000038 template <class _A1, class _A2, class _Rp>
39 static binary_function<_A1, _A2, _Rp>
40 __test(const volatile binary_function<_A1, _A2, _Rp>*);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000041public:
42 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
43 typedef decltype(__test((_Tp*)0)) type;
44};
45
46template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
47struct __maybe_derive_from_unary_function // bool is true
48 : public __derives_from_unary_function<_Tp>::type
49{
50};
51
52template <class _Tp>
53struct __maybe_derive_from_unary_function<_Tp, false>
54{
55};
56
57template <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
58struct __maybe_derive_from_binary_function // bool is true
59 : public __derives_from_binary_function<_Tp>::type
60{
61};
62
63template <class _Tp>
64struct __maybe_derive_from_binary_function<_Tp, false>
65{
66};
67
68template <class _Tp, bool = __has_result_type<_Tp>::value>
69struct __weak_result_type_imp // bool is true
70 : public __maybe_derive_from_unary_function<_Tp>,
71 public __maybe_derive_from_binary_function<_Tp>
72{
73 typedef typename _Tp::result_type result_type;
74};
75
76template <class _Tp>
77struct __weak_result_type_imp<_Tp, false>
78 : public __maybe_derive_from_unary_function<_Tp>,
79 public __maybe_derive_from_binary_function<_Tp>
80{
81};
82
83template <class _Tp>
84struct __weak_result_type
85 : public __weak_result_type_imp<typename remove_reference<_Tp>::type>
86{
87};
88
89// 0 argument case
90
Howard Hinnant99968442011-11-29 18:15:50 +000091template <class _Rp>
92struct __weak_result_type<_Rp ()>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000093{
Howard Hinnant99968442011-11-29 18:15:50 +000094 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000095};
96
Howard Hinnant99968442011-11-29 18:15:50 +000097template <class _Rp>
98struct __weak_result_type<_Rp (&)()>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000099{
Howard Hinnant99968442011-11-29 18:15:50 +0000100 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000101};
102
Howard Hinnant99968442011-11-29 18:15:50 +0000103template <class _Rp>
104struct __weak_result_type<_Rp (*)()>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000105{
Howard Hinnant99968442011-11-29 18:15:50 +0000106 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000107};
108
109// 1 argument case
110
Howard Hinnant99968442011-11-29 18:15:50 +0000111template <class _Rp, class _A1>
112struct __weak_result_type<_Rp (_A1)>
113 : public unary_function<_A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000114{
115};
116
Howard Hinnant99968442011-11-29 18:15:50 +0000117template <class _Rp, class _A1>
118struct __weak_result_type<_Rp (&)(_A1)>
119 : public unary_function<_A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000120{
121};
122
Howard Hinnant99968442011-11-29 18:15:50 +0000123template <class _Rp, class _A1>
124struct __weak_result_type<_Rp (*)(_A1)>
125 : public unary_function<_A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000126{
127};
128
Howard Hinnant99968442011-11-29 18:15:50 +0000129template <class _Rp, class _Cp>
130struct __weak_result_type<_Rp (_Cp::*)()>
131 : public unary_function<_Cp*, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000132{
133};
134
Howard Hinnant99968442011-11-29 18:15:50 +0000135template <class _Rp, class _Cp>
136struct __weak_result_type<_Rp (_Cp::*)() const>
137 : public unary_function<const _Cp*, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000138{
139};
140
Howard Hinnant99968442011-11-29 18:15:50 +0000141template <class _Rp, class _Cp>
142struct __weak_result_type<_Rp (_Cp::*)() volatile>
143 : public unary_function<volatile _Cp*, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000144{
145};
146
Howard Hinnant99968442011-11-29 18:15:50 +0000147template <class _Rp, class _Cp>
148struct __weak_result_type<_Rp (_Cp::*)() const volatile>
149 : public unary_function<const volatile _Cp*, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000150{
151};
152
153// 2 argument case
154
Howard Hinnant99968442011-11-29 18:15:50 +0000155template <class _Rp, class _A1, class _A2>
156struct __weak_result_type<_Rp (_A1, _A2)>
157 : public binary_function<_A1, _A2, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000158{
159};
160
Howard Hinnant99968442011-11-29 18:15:50 +0000161template <class _Rp, class _A1, class _A2>
162struct __weak_result_type<_Rp (*)(_A1, _A2)>
163 : public binary_function<_A1, _A2, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000164{
165};
166
Howard Hinnant99968442011-11-29 18:15:50 +0000167template <class _Rp, class _A1, class _A2>
168struct __weak_result_type<_Rp (&)(_A1, _A2)>
169 : public binary_function<_A1, _A2, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000170{
171};
172
Howard Hinnant99968442011-11-29 18:15:50 +0000173template <class _Rp, class _Cp, class _A1>
174struct __weak_result_type<_Rp (_Cp::*)(_A1)>
175 : public binary_function<_Cp*, _A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000176{
177};
178
Howard Hinnant99968442011-11-29 18:15:50 +0000179template <class _Rp, class _Cp, class _A1>
180struct __weak_result_type<_Rp (_Cp::*)(_A1) const>
181 : public binary_function<const _Cp*, _A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000182{
183};
184
Howard Hinnant99968442011-11-29 18:15:50 +0000185template <class _Rp, class _Cp, class _A1>
186struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
187 : public binary_function<volatile _Cp*, _A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000188{
189};
190
Howard Hinnant99968442011-11-29 18:15:50 +0000191template <class _Rp, class _Cp, class _A1>
192struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
193 : public binary_function<const volatile _Cp*, _A1, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000194{
195};
196
197// 3 or more arguments
198
Howard Hinnant99968442011-11-29 18:15:50 +0000199template <class _Rp, class _A1, class _A2, class _A3>
200struct __weak_result_type<_Rp (_A1, _A2, _A3)>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201{
Howard Hinnant99968442011-11-29 18:15:50 +0000202 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000203};
204
Howard Hinnant99968442011-11-29 18:15:50 +0000205template <class _Rp, class _A1, class _A2, class _A3>
206struct __weak_result_type<_Rp (&)(_A1, _A2, _A3)>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000207{
Howard Hinnant99968442011-11-29 18:15:50 +0000208 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000209};
210
Howard Hinnant99968442011-11-29 18:15:50 +0000211template <class _Rp, class _A1, class _A2, class _A3>
212struct __weak_result_type<_Rp (*)(_A1, _A2, _A3)>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000213{
Howard Hinnant99968442011-11-29 18:15:50 +0000214 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000215};
216
Howard Hinnant99968442011-11-29 18:15:50 +0000217template <class _Rp, class _Cp, class _A1, class _A2>
218struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2)>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000219{
Howard Hinnant99968442011-11-29 18:15:50 +0000220 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000221};
222
Howard Hinnant99968442011-11-29 18:15:50 +0000223template <class _Rp, class _Cp, class _A1, class _A2>
224struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) const>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000225{
Howard Hinnant99968442011-11-29 18:15:50 +0000226 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000227};
228
Howard Hinnant99968442011-11-29 18:15:50 +0000229template <class _Rp, class _Cp, class _A1, class _A2>
230struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) volatile>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000231{
Howard Hinnant99968442011-11-29 18:15:50 +0000232 typedef _Rp result_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000233};
234
235// __invoke
236
237// __ref_return0
Howard Hinnant324bb032010-08-22 00:02:43 +0000238//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000239// template <class _Tp, bool _HasResultType>
240// struct ________ref_return0 // _HasResultType is true
241// {
242// typedef typename _Tp::result_type type;
243// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000244//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000245// template <class _Tp>
246// struct ________ref_return0<_Tp, false>
247// {
248// typedef void type;
249// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000250//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000251// template <class _Tp, bool _IsClass>
252// struct ____ref_return0 // _IsClass is true
253// : public ________ref_return0<_Tp, __has_result_type<typename remove_cv<_Tp>::type>::value>
254// {
255// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000256//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000257// template <class _Tp, bool _HasResultType>
258// struct ______ref_return0 // _HasResultType is true
259// {
260// typedef typename __callable_type<_Tp>::result_type type;
261// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000262//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000263// template <class _Tp>
264// struct ______ref_return0<_Tp, false> // pointer to member data
265// {
266// typedef void type;
267// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000268//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000269// template <class _Tp>
270// struct ____ref_return0<_Tp, false>
271// : public ______ref_return0<typename remove_cv<_Tp>::type,
272// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value>
273// {
274// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000275//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276// template <class _Tp>
277// struct __ref_return0
278// : public ____ref_return0<typename remove_reference<_Tp>::type,
279// is_class<typename remove_reference<_Tp>::type>::value>
280// {
281// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000282//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000283// __ref_return1
Howard Hinnant324bb032010-08-22 00:02:43 +0000284//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000285// template <class _Tp, bool _IsClass, class _A0>
286// struct ____ref_return1 // _IsClass is true
287// {
288// typedef typename result_of<_Tp(_A0)>::type type;
289// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000290//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000291// template <class _Tp, bool _HasResultType, class _A0>
292// struct ______ref_return1 // _HasResultType is true
293// {
294// typedef typename __callable_type<_Tp>::result_type type;
295// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000296//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000297// template <class _Tp, class _A0, bool>
298// struct __ref_return1_member_data1;
Howard Hinnant324bb032010-08-22 00:02:43 +0000299//
Howard Hinnant99968442011-11-29 18:15:50 +0000300// template <class _Rp, class _Cp, class _A0>
301// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, true>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000302// {
Howard Hinnant99968442011-11-29 18:15:50 +0000303// typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000304// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000305//
Howard Hinnant99968442011-11-29 18:15:50 +0000306// template <class _Rp, class _Cp, class _A0>
307// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000308// {
309// static _A0 __a;
Howard Hinnant99968442011-11-29 18:15:50 +0000310// typedef typename __apply_cv<decltype(*__a), _Rp>::type& type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000311// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000312//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000313// template <class _Tp, class _A0>
314// struct __ref_return1_member_data;
Howard Hinnant324bb032010-08-22 00:02:43 +0000315//
Howard Hinnant99968442011-11-29 18:15:50 +0000316// template <class _Rp, class _Cp, class _A0>
317// struct __ref_return1_member_data<_Rp _Cp::*, _A0>
318// : public __ref_return1_member_data1<_Rp _Cp::*, _A0,
319// is_same<typename remove_cv<_Cp>::type,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000320// typename remove_cv<typename remove_reference<_A0>::type>::type>::value>
321// {
322// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000323//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000324// template <class _Tp, class _A0>
325// struct ______ref_return1<_Tp, false, _A0> // pointer to member data
326// : public __ref_return1_member_data<typename remove_cv<_Tp>::type, _A0>
327// {
328// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000329//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000330// template <class _Tp, class _A0>
331// struct ____ref_return1<_Tp, false, _A0>
332// : public ______ref_return1<typename remove_cv<_Tp>::type,
333// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0>
334// {
335// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000336//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000337// template <class _Tp, class _A0>
338// struct __ref_return1
339// : public ____ref_return1<typename remove_reference<_Tp>::type,
340// is_class<typename remove_reference<_Tp>::type>::value, _A0>
341// {
342// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000343//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000344// __ref_return2
Howard Hinnant324bb032010-08-22 00:02:43 +0000345//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000346// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000351//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000352// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000357//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000358// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000364//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000365// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000371//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000372// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000378//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000379// __ref_return3
Howard Hinnant324bb032010-08-22 00:02:43 +0000380//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000381// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000386//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000387// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000392//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000393// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000399//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000400// 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// };
Howard Hinnant324bb032010-08-22 00:02:43 +0000406//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000407// 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
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000414// first bullet
415
Howard Hinnant99968442011-11-29 18:15:50 +0000416template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000417inline _LIBCPP_INLINE_VISIBILITY
418typename enable_if
419<
Howard Hinnant99968442011-11-29 18:15:50 +0000420 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
421 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000422>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000423__invoke(_Rp (_Tp::*__f)(), _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000424{
425 return (__t1.*__f)();
426}
427
Howard Hinnant99968442011-11-29 18:15:50 +0000428template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000429inline _LIBCPP_INLINE_VISIBILITY
430typename enable_if
431<
Howard Hinnant99968442011-11-29 18:15:50 +0000432 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
433 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000434>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000435__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000436{
437 return (__t1.*__f)(__a0);
438}
439
Howard Hinnant99968442011-11-29 18:15:50 +0000440template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000441inline _LIBCPP_INLINE_VISIBILITY
442typename enable_if
443<
Howard Hinnant99968442011-11-29 18:15:50 +0000444 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
445 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000446>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000447__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448{
449 return (__t1.*__f)(__a0, __a1);
450}
451
Howard Hinnant99968442011-11-29 18:15:50 +0000452template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000453inline _LIBCPP_INLINE_VISIBILITY
454typename enable_if
455<
Howard Hinnant99968442011-11-29 18:15:50 +0000456 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
457 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000458>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000459__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000460{
461 return (__t1.*__f)(__a0, __a1, __a2);
462}
463
Howard Hinnant99968442011-11-29 18:15:50 +0000464template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000465inline _LIBCPP_INLINE_VISIBILITY
466typename enable_if
467<
Howard Hinnant99968442011-11-29 18:15:50 +0000468 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
469 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000470>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000471__invoke(_Rp (_Tp::*__f)() const, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000472{
473 return (__t1.*__f)();
474}
475
Howard Hinnant99968442011-11-29 18:15:50 +0000476template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000477inline _LIBCPP_INLINE_VISIBILITY
478typename enable_if
479<
Howard Hinnant99968442011-11-29 18:15:50 +0000480 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
481 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000482>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000483__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000484{
485 return (__t1.*__f)(__a0);
486}
487
Howard Hinnant99968442011-11-29 18:15:50 +0000488template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000489inline _LIBCPP_INLINE_VISIBILITY
490typename enable_if
491<
Howard Hinnant99968442011-11-29 18:15:50 +0000492 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
493 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000494>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000495__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000496{
497 return (__t1.*__f)(__a0, __a1);
498}
499
Howard Hinnant99968442011-11-29 18:15:50 +0000500template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000501inline _LIBCPP_INLINE_VISIBILITY
502typename enable_if
503<
Howard Hinnant99968442011-11-29 18:15:50 +0000504 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
505 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000506>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000507__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000508{
509 return (__t1.*__f)(__a0, __a1, __a2);
510}
511
Howard Hinnant99968442011-11-29 18:15:50 +0000512template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000513inline _LIBCPP_INLINE_VISIBILITY
514typename enable_if
515<
Howard Hinnant99968442011-11-29 18:15:50 +0000516 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
517 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000519__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520{
521 return (__t1.*__f)();
522}
523
Howard Hinnant99968442011-11-29 18:15:50 +0000524template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000525inline _LIBCPP_INLINE_VISIBILITY
526typename enable_if
527<
Howard Hinnant99968442011-11-29 18:15:50 +0000528 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
529 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000530>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000531__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000532{
533 return (__t1.*__f)(__a0);
534}
535
Howard Hinnant99968442011-11-29 18:15:50 +0000536template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000537inline _LIBCPP_INLINE_VISIBILITY
538typename enable_if
539<
Howard Hinnant99968442011-11-29 18:15:50 +0000540 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
541 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000542>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000543__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000544{
545 return (__t1.*__f)(__a0, __a1);
546}
547
Howard Hinnant99968442011-11-29 18:15:50 +0000548template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000549inline _LIBCPP_INLINE_VISIBILITY
550typename enable_if
551<
Howard Hinnant99968442011-11-29 18:15:50 +0000552 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
553 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000555__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000556{
557 return (__t1.*__f)(__a0, __a1, __a2);
558}
559
Howard Hinnant99968442011-11-29 18:15:50 +0000560template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000561inline _LIBCPP_INLINE_VISIBILITY
562typename enable_if
563<
Howard Hinnant99968442011-11-29 18:15:50 +0000564 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
565 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000566>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000567__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000568{
569 return (__t1.*__f)();
570}
571
Howard Hinnant99968442011-11-29 18:15:50 +0000572template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000573inline _LIBCPP_INLINE_VISIBILITY
574typename enable_if
575<
Howard Hinnant99968442011-11-29 18:15:50 +0000576 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
577 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000578>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000579__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000580{
581 return (__t1.*__f)(__a0);
582}
583
Howard Hinnant99968442011-11-29 18:15:50 +0000584template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000585inline _LIBCPP_INLINE_VISIBILITY
586typename enable_if
587<
Howard Hinnant99968442011-11-29 18:15:50 +0000588 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
589 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000590>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000591__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592{
593 return (__t1.*__f)(__a0, __a1);
594}
595
Howard Hinnant99968442011-11-29 18:15:50 +0000596template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000597inline _LIBCPP_INLINE_VISIBILITY
598typename enable_if
599<
Howard Hinnant99968442011-11-29 18:15:50 +0000600 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
601 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000602>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000603__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604{
605 return (__t1.*__f)(__a0, __a1, __a2);
606}
607
608// second bullet
609
Howard Hinnant99968442011-11-29 18:15:50 +0000610template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000611inline _LIBCPP_INLINE_VISIBILITY
612typename enable_if
613<
Howard Hinnant99968442011-11-29 18:15:50 +0000614 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
615 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000616>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000617__invoke(_Rp (_Tp::*__f)(), _T1 __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000618{
619 return ((*__t1).*__f)();
620}
621
Howard Hinnant99968442011-11-29 18:15:50 +0000622template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000623inline _LIBCPP_INLINE_VISIBILITY
624typename enable_if
625<
Howard Hinnant99968442011-11-29 18:15:50 +0000626 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
627 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000628>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000629__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000630{
631 return ((*__t1).*__f)(__a0);
632}
633
Howard Hinnant99968442011-11-29 18:15:50 +0000634template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000635inline _LIBCPP_INLINE_VISIBILITY
636typename enable_if
637<
Howard Hinnant99968442011-11-29 18:15:50 +0000638 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
639 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000640>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000641__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000642{
643 return ((*__t1).*__f)(__a0, __a1);
644}
645
Howard Hinnant99968442011-11-29 18:15:50 +0000646template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000647inline _LIBCPP_INLINE_VISIBILITY
648typename enable_if
649<
Howard Hinnant99968442011-11-29 18:15:50 +0000650 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
651 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000652>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000653__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000654{
655 return ((*__t1).*__f)(__a0, __a1, __a2);
656}
657
Howard Hinnant99968442011-11-29 18:15:50 +0000658template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000659inline _LIBCPP_INLINE_VISIBILITY
660typename enable_if
661<
Howard Hinnant99968442011-11-29 18:15:50 +0000662 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
663 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000665__invoke(_Rp (_Tp::*__f)() const, _T1 __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000666{
667 return ((*__t1).*__f)();
668}
669
Howard Hinnant99968442011-11-29 18:15:50 +0000670template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000671inline _LIBCPP_INLINE_VISIBILITY
672typename enable_if
673<
Howard Hinnant99968442011-11-29 18:15:50 +0000674 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
675 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000676>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000677__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000678{
679 return ((*__t1).*__f)(__a0);
680}
681
Howard Hinnant99968442011-11-29 18:15:50 +0000682template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000683inline _LIBCPP_INLINE_VISIBILITY
684typename enable_if
685<
Howard Hinnant99968442011-11-29 18:15:50 +0000686 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
687 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000688>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000689__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000690{
691 return ((*__t1).*__f)(__a0, __a1);
692}
693
Howard Hinnant99968442011-11-29 18:15:50 +0000694template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000695inline _LIBCPP_INLINE_VISIBILITY
696typename enable_if
697<
Howard Hinnant99968442011-11-29 18:15:50 +0000698 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
699 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000700>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000701__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000702{
703 return ((*__t1).*__f)(__a0, __a1, __a2);
704}
705
Howard Hinnant99968442011-11-29 18:15:50 +0000706template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000707inline _LIBCPP_INLINE_VISIBILITY
708typename enable_if
709<
Howard Hinnant99968442011-11-29 18:15:50 +0000710 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
711 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000712>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000713__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000714{
715 return ((*__t1).*__f)();
716}
717
Howard Hinnant99968442011-11-29 18:15:50 +0000718template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000719inline _LIBCPP_INLINE_VISIBILITY
720typename enable_if
721<
Howard Hinnant99968442011-11-29 18:15:50 +0000722 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
723 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000724>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000725__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000726{
727 return ((*__t1).*__f)(__a0);
728}
729
Howard Hinnant99968442011-11-29 18:15:50 +0000730template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000731inline _LIBCPP_INLINE_VISIBILITY
732typename enable_if
733<
Howard Hinnant99968442011-11-29 18:15:50 +0000734 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
735 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000736>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000737__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000738{
739 return ((*__t1).*__f)(__a0, __a1);
740}
741
Howard Hinnant99968442011-11-29 18:15:50 +0000742template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743inline _LIBCPP_INLINE_VISIBILITY
744typename enable_if
745<
Howard Hinnant99968442011-11-29 18:15:50 +0000746 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
747 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000748>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000749__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000750{
751 return ((*__t1).*__f)(__a0, __a1, __a2);
752}
753
Howard Hinnant99968442011-11-29 18:15:50 +0000754template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000755inline _LIBCPP_INLINE_VISIBILITY
756typename enable_if
757<
Howard Hinnant99968442011-11-29 18:15:50 +0000758 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
759 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000760>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000761__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000762{
763 return ((*__t1).*__f)();
764}
765
Howard Hinnant99968442011-11-29 18:15:50 +0000766template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000767inline _LIBCPP_INLINE_VISIBILITY
768typename enable_if
769<
Howard Hinnant99968442011-11-29 18:15:50 +0000770 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
771 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000772>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000773__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000774{
775 return ((*__t1).*__f)(__a0);
776}
777
Howard Hinnant99968442011-11-29 18:15:50 +0000778template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000779inline _LIBCPP_INLINE_VISIBILITY
780typename enable_if
781<
Howard Hinnant99968442011-11-29 18:15:50 +0000782 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
783 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000784>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000785__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000786{
787 return ((*__t1).*__f)(__a0, __a1);
788}
789
Howard Hinnant99968442011-11-29 18:15:50 +0000790template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000791inline _LIBCPP_INLINE_VISIBILITY
792typename enable_if
793<
Howard Hinnant99968442011-11-29 18:15:50 +0000794 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
795 _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000796>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000797__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000798{
799 return ((*__t1).*__f)(__a0, __a1, __a2);
800}
801
802// third bullet
803
Howard Hinnant99968442011-11-29 18:15:50 +0000804template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000805inline _LIBCPP_INLINE_VISIBILITY
806typename enable_if
807<
Howard Hinnant99968442011-11-29 18:15:50 +0000808 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
809 typename __apply_cv<_T1, _Rp>::type&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000810>::type
Howard Hinnant99968442011-11-29 18:15:50 +0000811__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000812{
813 return __t1.*__f;
814}
815
Howard Hinnant99968442011-11-29 18:15:50 +0000816template <class _Rp, class _Tp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000817inline _LIBCPP_INLINE_VISIBILITY
818void
Howard Hinnant99968442011-11-29 18:15:50 +0000819__invoke(_Rp _Tp::*)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000820{
821}
822
Howard Hinnant99968442011-11-29 18:15:50 +0000823// template <class _Dp, class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000824// inline _LIBCPP_INLINE_VISIBILITY
825// typename enable_if
826// <
Howard Hinnant99968442011-11-29 18:15:50 +0000827// is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
828// typename __ref_return1<_Rp _Tp::*, _T1>::type
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000829// >::type
Howard Hinnant99968442011-11-29 18:15:50 +0000830// __invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000831// {
832// return __t1.*__f;
833// }
834
835// forth bullet
836
Howard Hinnant99968442011-11-29 18:15:50 +0000837template <class _T1, class _Rp, bool>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000838struct __4th_helper
839{
840};
841
Howard Hinnant99968442011-11-29 18:15:50 +0000842template <class _T1, class _Rp>
843struct __4th_helper<_T1, _Rp, true>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000844{
Howard Hinnant99968442011-11-29 18:15:50 +0000845 typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Rp>::type type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000846};
847
Howard Hinnant99968442011-11-29 18:15:50 +0000848template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000849inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000850typename __4th_helper<_T1, _Rp,
851 !is_base_of<_Tp,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000852 typename remove_reference<_T1>::type
853 >::value
854 >::type&
Howard Hinnant99968442011-11-29 18:15:50 +0000855__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000856{
857 return (*__t1).*__f;
858}
859
Howard Hinnant99968442011-11-29 18:15:50 +0000860// template <class _Dp, class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000861// inline _LIBCPP_INLINE_VISIBILITY
862// typename enable_if
863// <
Howard Hinnant99968442011-11-29 18:15:50 +0000864// !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
865// typename __ref_return1<_Rp _Tp::*, _T1>::type
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000866// >::type
Howard Hinnant99968442011-11-29 18:15:50 +0000867// __invoke(_Rp _Tp::* __f, _T1 __t1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000868// {
869// return (*__t1).*__f;
870// }
871
872// fifth bullet
873
Howard Hinnant99968442011-11-29 18:15:50 +0000874template <class _Fp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000875inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000876decltype(declval<_Fp>()())
877__invoke(_Fp __f)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878{
879 return __f();
880}
881
Howard Hinnant99968442011-11-29 18:15:50 +0000882template <class _Fp, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000883inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000884decltype(declval<_Fp>()(declval<_A0&>()))
885__invoke(_Fp __f, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000886{
887 return __f(__a0);
888}
889
Howard Hinnant99968442011-11-29 18:15:50 +0000890template <class _Fp, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000891inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000892decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>()))
893__invoke(_Fp __f, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000894{
895 return __f(__a0, __a1);
896}
897
Howard Hinnant99968442011-11-29 18:15:50 +0000898template <class _Fp, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000899inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000900decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>()))
901__invoke(_Fp __f, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000902{
903 return __f(__a0, __a1, __a2);
904}
905
Howard Hinnant99968442011-11-29 18:15:50 +0000906// template <class _Rp, class _Fp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000907// inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000908// _Rp
909// __invoke(_Fp& __f)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000910// {
911// return __f();
912// }
Howard Hinnant324bb032010-08-22 00:02:43 +0000913//
Howard Hinnant99968442011-11-29 18:15:50 +0000914// template <class _Rp, class _Fp, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000915// inline _LIBCPP_INLINE_VISIBILITY
916// typename enable_if
917// <
Howard Hinnant99968442011-11-29 18:15:50 +0000918// !is_member_pointer<_Fp>::value,
919// _Rp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000920// >::type
Howard Hinnant99968442011-11-29 18:15:50 +0000921// __invoke(_Fp& __f, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000922// {
923// return __f(__a0);
924// }
Howard Hinnant324bb032010-08-22 00:02:43 +0000925//
Howard Hinnant99968442011-11-29 18:15:50 +0000926// template <class _Rp, class _Fp, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000927// inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000928// _Rp
929// __invoke(_Fp& __f, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000930// {
931// return __f(__a0, __a1);
932// }
Howard Hinnant324bb032010-08-22 00:02:43 +0000933//
Howard Hinnant99968442011-11-29 18:15:50 +0000934// template <class _Rp, class _Fp, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000935// inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50 +0000936// _Rp
937// __invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000938// {
939// return __f(__a0, __a1, __a2);
940// }
941
942template <class _Tp>
943struct __has_type
944{
945private:
Howard Hinnant9c0df142012-10-30 19:06:59 +0000946 struct __two {char __lx; char __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000947 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
Howard Hinnant99968442011-11-29 18:15:50 +0000953template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000954struct __invoke_return
955{
Howard Hinnant99968442011-11-29 18:15:50 +0000956 typedef typename __weak_result_type<_Fp>::result_type type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000957};
958
Howard Hinnant99968442011-11-29 18:15:50 +0000959template <class _Fp>
960struct __invoke_return<_Fp, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000961{
Howard Hinnant99968442011-11-29 18:15:50 +0000962 typedef decltype(__invoke(_VSTD::declval<_Fp>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000963};
964
965template <class _Tp, class _A0>
966struct __invoke_return0
967{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000968 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000969};
970
Howard Hinnant99968442011-11-29 18:15:50 +0000971template <class _Rp, class _Tp, class _A0>
972struct __invoke_return0<_Rp _Tp::*, _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000973{
Howard Hinnant99968442011-11-29 18:15:50 +0000974 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000975};
976
Howard Hinnant99968442011-11-29 18:15:50 +0000977template <class _Rp, class _Tp, class _A0>
978struct __invoke_return0<_Rp _Tp::*, _A0*>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000979{
Howard Hinnant99968442011-11-29 18:15:50 +0000980 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000981};
982
983template <class _Tp, class _A0, class _A1>
984struct __invoke_return1
985{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000986 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
987 _VSTD::declval<_A1>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000988};
989
990template <class _Tp, class _A0, class _A1, class _A2>
991struct __invoke_return2
992{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000993 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
994 _VSTD::declval<_A1>(),
995 _VSTD::declval<_A2>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000996};
997
998template <class _Tp>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000999class _LIBCPP_TYPE_VIS_ONLY reference_wrapper
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001000 : 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
Howard Hinnant99acc502010-09-21 17:32:39 +00001018 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001019 typename __invoke_return<type&>::type
1020 operator() () const
1021 {
1022 return __invoke(get());
1023 }
1024
1025 template <class _A0>
Howard Hinnant99acc502010-09-21 17:32:39 +00001026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001027 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>
Howard Hinnant99acc502010-09-21 17:32:39 +00001034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001035 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>
Howard Hinnant99acc502010-09-21 17:32:39 +00001042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001043 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
Marshall Clow0ea7f8c2014-01-06 14:00:09 +00001050template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
1051template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001052template <class _Tp> struct __is_reference_wrapper
Marshall Clow0ea7f8c2014-01-06 14:00:09 +00001053 : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001054
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
Howard Hinnant324bb032010-08-22 00:02:43 +00001087#endif // _LIBCPP_FUNCTIONAL_BASE_03