__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