blob: 0493151568d1f2ec457c63cf0ad6cc0feb09342b [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
Howard Hinnant5b08a8a2010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:16 +00005//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
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:
22 struct __two {char _; char __;};
23 static __two __test(...);
24 template <class _A, class _R>
25 static unary_function<_A, _R>
26 __test(const volatile unary_function<_A, _R>*);
27public:
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:
36 struct __two {char _; char __;};
37 static __two __test(...);
38 template <class _A1, class _A2, class _R>
39 static binary_function<_A1, _A2, _R>
40 __test(const volatile binary_function<_A1, _A2, _R>*);
41public:
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
91template <class _R>
92struct __weak_result_type<_R ()>
93{
94 typedef _R result_type;
95};
96
97template <class _R>
98struct __weak_result_type<_R (&)()>
99{
100 typedef _R result_type;
101};
102
103template <class _R>
104struct __weak_result_type<_R (*)()>
105{
106 typedef _R result_type;
107};
108
109// 1 argument case
110
111template <class _R, class _A1>
112struct __weak_result_type<_R (_A1)>
113 : public unary_function<_A1, _R>
114{
115};
116
117template <class _R, class _A1>
118struct __weak_result_type<_R (&)(_A1)>
119 : public unary_function<_A1, _R>
120{
121};
122
123template <class _R, class _A1>
124struct __weak_result_type<_R (*)(_A1)>
125 : public unary_function<_A1, _R>
126{
127};
128
129template <class _R, class _C>
130struct __weak_result_type<_R (_C::*)()>
131 : public unary_function<_C*, _R>
132{
133};
134
135template <class _R, class _C>
136struct __weak_result_type<_R (_C::*)() const>
137 : public unary_function<const _C*, _R>
138{
139};
140
141template <class _R, class _C>
142struct __weak_result_type<_R (_C::*)() volatile>
143 : public unary_function<volatile _C*, _R>
144{
145};
146
147template <class _R, class _C>
148struct __weak_result_type<_R (_C::*)() const volatile>
149 : public unary_function<const volatile _C*, _R>
150{
151};
152
153// 2 argument case
154
155template <class _R, class _A1, class _A2>
156struct __weak_result_type<_R (_A1, _A2)>
157 : public binary_function<_A1, _A2, _R>
158{
159};
160
161template <class _R, class _A1, class _A2>
162struct __weak_result_type<_R (*)(_A1, _A2)>
163 : public binary_function<_A1, _A2, _R>
164{
165};
166
167template <class _R, class _A1, class _A2>
168struct __weak_result_type<_R (&)(_A1, _A2)>
169 : public binary_function<_A1, _A2, _R>
170{
171};
172
173template <class _R, class _C, class _A1>
174struct __weak_result_type<_R (_C::*)(_A1)>
175 : public binary_function<_C*, _A1, _R>
176{
177};
178
179template <class _R, class _C, class _A1>
180struct __weak_result_type<_R (_C::*)(_A1) const>
181 : public binary_function<const _C*, _A1, _R>
182{
183};
184
185template <class _R, class _C, class _A1>
186struct __weak_result_type<_R (_C::*)(_A1) volatile>
187 : public binary_function<volatile _C*, _A1, _R>
188{
189};
190
191template <class _R, class _C, class _A1>
192struct __weak_result_type<_R (_C::*)(_A1) const volatile>
193 : public binary_function<const volatile _C*, _A1, _R>
194{
195};
196
197// 3 or more arguments
198
199template <class _R, class _A1, class _A2, class _A3>
200struct __weak_result_type<_R (_A1, _A2, _A3)>
201{
202 typedef _R result_type;
203};
204
205template <class _R, class _A1, class _A2, class _A3>
206struct __weak_result_type<_R (&)(_A1, _A2, _A3)>
207{
208 typedef _R result_type;
209};
210
211template <class _R, class _A1, class _A2, class _A3>
212struct __weak_result_type<_R (*)(_A1, _A2, _A3)>
213{
214 typedef _R result_type;
215};
216
217template <class _R, class _C, class _A1, class _A2>
218struct __weak_result_type<_R (_C::*)(_A1, _A2)>
219{
220 typedef _R result_type;
221};
222
223template <class _R, class _C, class _A1, class _A2>
224struct __weak_result_type<_R (_C::*)(_A1, _A2) const>
225{
226 typedef _R result_type;
227};
228
229template <class _R, class _C, class _A1, class _A2>
230struct __weak_result_type<_R (_C::*)(_A1, _A2) volatile>
231{
232 typedef _R result_type;
233};
234
235// __invoke
236
237// __ref_return0
238//
239// template <class _Tp, bool _HasResultType>
240// struct ________ref_return0 // _HasResultType is true
241// {
242// typedef typename _Tp::result_type type;
243// };
244//
245// template <class _Tp>
246// struct ________ref_return0<_Tp, false>
247// {
248// typedef void type;
249// };
250//
251// 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// };
256//
257// template <class _Tp, bool _HasResultType>
258// struct ______ref_return0 // _HasResultType is true
259// {
260// typedef typename __callable_type<_Tp>::result_type type;
261// };
262//
263// template <class _Tp>
264// struct ______ref_return0<_Tp, false> // pointer to member data
265// {
266// typedef void type;
267// };
268//
269// 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// };
275//
276// 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// };
282//
283// __ref_return1
284//
285// 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// };
290//
291// 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// };
296//
297// template <class _Tp, class _A0, bool>
298// struct __ref_return1_member_data1;
299//
300// template <class _R, class _C, class _A0>
301// struct __ref_return1_member_data1<_R _C::*, _A0, true>
302// {
303// typedef typename __apply_cv<_A0, _R>::type& type;
304// };
305//
306// template <class _R, class _C, class _A0>
307// struct __ref_return1_member_data1<_R _C::*, _A0, false>
308// {
309// static _A0 __a;
310// typedef typename __apply_cv<decltype(*__a), _R>::type& type;
311// };
312//
313// template <class _Tp, class _A0>
314// struct __ref_return1_member_data;
315//
316// template <class _R, class _C, class _A0>
317// struct __ref_return1_member_data<_R _C::*, _A0>
318// : public __ref_return1_member_data1<_R _C::*, _A0,
319// is_same<typename remove_cv<_C>::type,
320// typename remove_cv<typename remove_reference<_A0>::type>::type>::value>
321// {
322// };
323//
324// 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// };
329//
330// 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// };
336//
337// 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// };
343//
344// __ref_return2
345//
346// template <class _Tp, bool _IsClass, class _A0, class _A1>
347// struct ____ref_return2 // _IsClass is true
348// {
349// typedef typename result_of<_Tp(_A0, _A1)>::type type;
350// };
351//
352// template <class _Tp, bool _HasResultType, class _A0, class _A1>
353// struct ______ref_return2 // _HasResultType is true
354// {
355// typedef typename __callable_type<_Tp>::result_type type;
356// };
357//
358// template <class _Tp>
359// struct ______ref_return2<_Tp, false, class _A0, class _A1> // pointer to member data
360// {
361// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer"
362// " to member data with too many arguments.");
363// };
364//
365// template <class _Tp, class _A0, class _A1>
366// struct ____ref_return2<_Tp, false, _A0, _A1>
367// : public ______ref_return2<typename remove_cv<_Tp>::type,
368// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1>
369// {
370// };
371//
372// template <class _Tp, class _A0, class _A1>
373// struct __ref_return2
374// : public ____ref_return2<typename remove_reference<_Tp>::type,
375// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1>
376// {
377// };
378//
379// __ref_return3
380//
381// template <class _Tp, bool _IsClass, class _A0, class _A1, class _A2>
382// struct ____ref_return3 // _IsClass is true
383// {
384// typedef typename result_of<_Tp(_A0, _A1, _A2)>::type type;
385// };
386//
387// template <class _Tp, bool _HasResultType, class _A0, class _A1, class _A2>
388// struct ______ref_return3 // _HasResultType is true
389// {
390// typedef typename __callable_type<_Tp>::result_type type;
391// };
392//
393// template <class _Tp>
394// struct ______ref_return3<_Tp, false, class _A0, class _A1, class _A2> // pointer to member data
395// {
396// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer"
397// " to member data with too many arguments.");
398// };
399//
400// template <class _Tp, class _A0, class _A1, class _A2>
401// struct ____ref_return3<_Tp, false, _A0, _A1, _A2>
402// : public ______ref_return3<typename remove_cv<_Tp>::type,
403// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1, _A2>
404// {
405// };
406//
407// template <class _Tp, class _A0, class _A1, class _A2>
408// struct __ref_return3
409// : public ____ref_return3<typename remove_reference<_Tp>::type,
410// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1, _A2>
411// {
412// };
413
414
415// first bullet
416
417template <class _R, class _T, class _T1>
418inline _LIBCPP_INLINE_VISIBILITY
419typename enable_if
420<
421 is_base_of<_T, typename remove_reference<_T1>::type>::value,
422 _R
423>::type
424__invoke(_R (_T::*__f)(), _T1& __t1)
425{
426 return (__t1.*__f)();
427}
428
429template <class _R, class _T, class _T1, class _A0>
430inline _LIBCPP_INLINE_VISIBILITY
431typename enable_if
432<
433 is_base_of<_T, typename remove_reference<_T1>::type>::value,
434 _R
435>::type
436__invoke(_R (_T::*__f)(_A0), _T1& __t1, _A0& __a0)
437{
438 return (__t1.*__f)(__a0);
439}
440
441template <class _R, class _T, class _T1, class _A0, class _A1>
442inline _LIBCPP_INLINE_VISIBILITY
443typename enable_if
444<
445 is_base_of<_T, typename remove_reference<_T1>::type>::value,
446 _R
447>::type
448__invoke(_R (_T::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
449{
450 return (__t1.*__f)(__a0, __a1);
451}
452
453template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
454inline _LIBCPP_INLINE_VISIBILITY
455typename enable_if
456<
457 is_base_of<_T, typename remove_reference<_T1>::type>::value,
458 _R
459>::type
460__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
461{
462 return (__t1.*__f)(__a0, __a1, __a2);
463}
464
465template <class _R, class _T, class _T1>
466inline _LIBCPP_INLINE_VISIBILITY
467typename enable_if
468<
469 is_base_of<_T, typename remove_reference<_T1>::type>::value,
470 _R
471>::type
472__invoke(_R (_T::*__f)() const, _T1& __t1)
473{
474 return (__t1.*__f)();
475}
476
477template <class _R, class _T, class _T1, class _A0>
478inline _LIBCPP_INLINE_VISIBILITY
479typename enable_if
480<
481 is_base_of<_T, typename remove_reference<_T1>::type>::value,
482 _R
483>::type
484__invoke(_R (_T::*__f)(_A0) const, _T1& __t1, _A0& __a0)
485{
486 return (__t1.*__f)(__a0);
487}
488
489template <class _R, class _T, class _T1, class _A0, class _A1>
490inline _LIBCPP_INLINE_VISIBILITY
491typename enable_if
492<
493 is_base_of<_T, typename remove_reference<_T1>::type>::value,
494 _R
495>::type
496__invoke(_R (_T::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
497{
498 return (__t1.*__f)(__a0, __a1);
499}
500
501template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
502inline _LIBCPP_INLINE_VISIBILITY
503typename enable_if
504<
505 is_base_of<_T, typename remove_reference<_T1>::type>::value,
506 _R
507>::type
508__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
509{
510 return (__t1.*__f)(__a0, __a1, __a2);
511}
512
513template <class _R, class _T, class _T1>
514inline _LIBCPP_INLINE_VISIBILITY
515typename enable_if
516<
517 is_base_of<_T, typename remove_reference<_T1>::type>::value,
518 _R
519>::type
520__invoke(_R (_T::*__f)() volatile, _T1& __t1)
521{
522 return (__t1.*__f)();
523}
524
525template <class _R, class _T, class _T1, class _A0>
526inline _LIBCPP_INLINE_VISIBILITY
527typename enable_if
528<
529 is_base_of<_T, typename remove_reference<_T1>::type>::value,
530 _R
531>::type
532__invoke(_R (_T::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
533{
534 return (__t1.*__f)(__a0);
535}
536
537template <class _R, class _T, class _T1, class _A0, class _A1>
538inline _LIBCPP_INLINE_VISIBILITY
539typename enable_if
540<
541 is_base_of<_T, typename remove_reference<_T1>::type>::value,
542 _R
543>::type
544__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
545{
546 return (__t1.*__f)(__a0, __a1);
547}
548
549template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
550inline _LIBCPP_INLINE_VISIBILITY
551typename enable_if
552<
553 is_base_of<_T, typename remove_reference<_T1>::type>::value,
554 _R
555>::type
556__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
557{
558 return (__t1.*__f)(__a0, __a1, __a2);
559}
560
561template <class _R, class _T, class _T1>
562inline _LIBCPP_INLINE_VISIBILITY
563typename enable_if
564<
565 is_base_of<_T, typename remove_reference<_T1>::type>::value,
566 _R
567>::type
568__invoke(_R (_T::*__f)() const volatile, _T1& __t1)
569{
570 return (__t1.*__f)();
571}
572
573template <class _R, class _T, class _T1, class _A0>
574inline _LIBCPP_INLINE_VISIBILITY
575typename enable_if
576<
577 is_base_of<_T, typename remove_reference<_T1>::type>::value,
578 _R
579>::type
580__invoke(_R (_T::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
581{
582 return (__t1.*__f)(__a0);
583}
584
585template <class _R, class _T, class _T1, class _A0, class _A1>
586inline _LIBCPP_INLINE_VISIBILITY
587typename enable_if
588<
589 is_base_of<_T, typename remove_reference<_T1>::type>::value,
590 _R
591>::type
592__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
593{
594 return (__t1.*__f)(__a0, __a1);
595}
596
597template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
598inline _LIBCPP_INLINE_VISIBILITY
599typename enable_if
600<
601 is_base_of<_T, typename remove_reference<_T1>::type>::value,
602 _R
603>::type
604__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
605{
606 return (__t1.*__f)(__a0, __a1, __a2);
607}
608
609// second bullet
610
611template <class _R, class _T, class _T1>
612inline _LIBCPP_INLINE_VISIBILITY
613typename enable_if
614<
615 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
616 _R
617>::type
618__invoke(_R (_T::*__f)(), _T1 __t1)
619{
620 return ((*__t1).*__f)();
621}
622
623template <class _R, class _T, class _T1, class _A0>
624inline _LIBCPP_INLINE_VISIBILITY
625typename enable_if
626<
627 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
628 _R
629>::type
630__invoke(_R (_T::*__f)(_A0), _T1 __t1, _A0& __a0)
631{
632 return ((*__t1).*__f)(__a0);
633}
634
635template <class _R, class _T, class _T1, class _A0, class _A1>
636inline _LIBCPP_INLINE_VISIBILITY
637typename enable_if
638<
639 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
640 _R
641>::type
642__invoke(_R (_T::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
643{
644 return ((*__t1).*__f)(__a0, __a1);
645}
646
647template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
648inline _LIBCPP_INLINE_VISIBILITY
649typename enable_if
650<
651 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
652 _R
653>::type
654__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
655{
656 return ((*__t1).*__f)(__a0, __a1, __a2);
657}
658
659template <class _R, class _T, class _T1>
660inline _LIBCPP_INLINE_VISIBILITY
661typename enable_if
662<
663 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
664 _R
665>::type
666__invoke(_R (_T::*__f)() const, _T1 __t1)
667{
668 return ((*__t1).*__f)();
669}
670
671template <class _R, class _T, class _T1, class _A0>
672inline _LIBCPP_INLINE_VISIBILITY
673typename enable_if
674<
675 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
676 _R
677>::type
678__invoke(_R (_T::*__f)(_A0) const, _T1 __t1, _A0& __a0)
679{
680 return ((*__t1).*__f)(__a0);
681}
682
683template <class _R, class _T, class _T1, class _A0, class _A1>
684inline _LIBCPP_INLINE_VISIBILITY
685typename enable_if
686<
687 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
688 _R
689>::type
690__invoke(_R (_T::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
691{
692 return ((*__t1).*__f)(__a0, __a1);
693}
694
695template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
696inline _LIBCPP_INLINE_VISIBILITY
697typename enable_if
698<
699 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
700 _R
701>::type
702__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
703{
704 return ((*__t1).*__f)(__a0, __a1, __a2);
705}
706
707template <class _R, class _T, class _T1>
708inline _LIBCPP_INLINE_VISIBILITY
709typename enable_if
710<
711 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
712 _R
713>::type
714__invoke(_R (_T::*__f)() volatile, _T1 __t1)
715{
716 return ((*__t1).*__f)();
717}
718
719template <class _R, class _T, class _T1, class _A0>
720inline _LIBCPP_INLINE_VISIBILITY
721typename enable_if
722<
723 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
724 _R
725>::type
726__invoke(_R (_T::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
727{
728 return ((*__t1).*__f)(__a0);
729}
730
731template <class _R, class _T, class _T1, class _A0, class _A1>
732inline _LIBCPP_INLINE_VISIBILITY
733typename enable_if
734<
735 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
736 _R
737>::type
738__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
739{
740 return ((*__t1).*__f)(__a0, __a1);
741}
742
743template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
744inline _LIBCPP_INLINE_VISIBILITY
745typename enable_if
746<
747 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
748 _R
749>::type
750__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
751{
752 return ((*__t1).*__f)(__a0, __a1, __a2);
753}
754
755template <class _R, class _T, class _T1>
756inline _LIBCPP_INLINE_VISIBILITY
757typename enable_if
758<
759 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
760 _R
761>::type
762__invoke(_R (_T::*__f)() const volatile, _T1 __t1)
763{
764 return ((*__t1).*__f)();
765}
766
767template <class _R, class _T, class _T1, class _A0>
768inline _LIBCPP_INLINE_VISIBILITY
769typename enable_if
770<
771 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
772 _R
773>::type
774__invoke(_R (_T::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
775{
776 return ((*__t1).*__f)(__a0);
777}
778
779template <class _R, class _T, class _T1, class _A0, class _A1>
780inline _LIBCPP_INLINE_VISIBILITY
781typename enable_if
782<
783 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
784 _R
785>::type
786__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
787{
788 return ((*__t1).*__f)(__a0, __a1);
789}
790
791template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
792inline _LIBCPP_INLINE_VISIBILITY
793typename enable_if
794<
795 !is_base_of<_T, typename remove_reference<_T1>::type>::value,
796 _R
797>::type
798__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
799{
800 return ((*__t1).*__f)(__a0, __a1, __a2);
801}
802
803// third bullet
804
805template <class _R, class _T, class _T1>
806inline _LIBCPP_INLINE_VISIBILITY
807typename enable_if
808<
809 is_base_of<_T, typename remove_reference<_T1>::type>::value,
810 typename __apply_cv<_T1, _R>::type&
811>::type
812__invoke(_R _T::* __f, _T1& __t1)
813{
814 return __t1.*__f;
815}
816
817template <class _R, class _T>
818inline _LIBCPP_INLINE_VISIBILITY
819void
820__invoke(_R _T::*)
821{
822}
823
824// template <class _D, class _R, class _T, class _T1>
825// inline _LIBCPP_INLINE_VISIBILITY
826// typename enable_if
827// <
828// is_base_of<_T, typename remove_reference<_T1>::type>::value,
829// typename __ref_return1<_R _T::*, _T1>::type
830// >::type
831// __invoke(_R _T::* __f, _T1& __t1)
832// {
833// return __t1.*__f;
834// }
835
836// forth bullet
837
838template <class _T1, class _R, bool>
839struct __4th_helper
840{
841};
842
843template <class _T1, class _R>
844struct __4th_helper<_T1, _R, true>
845{
846 typedef typename __apply_cv<decltype(*_STD::declval<_T1>()), _R>::type type;
847};
848
849template <class _R, class _T, class _T1>
850inline _LIBCPP_INLINE_VISIBILITY
851typename __4th_helper<_T1, _R,
852 !is_base_of<_T,
853 typename remove_reference<_T1>::type
854 >::value
855 >::type&
856__invoke(_R _T::* __f, _T1& __t1)
857{
858 return (*__t1).*__f;
859}
860
861// template <class _D, class _R, class _T, class _T1>
862// inline _LIBCPP_INLINE_VISIBILITY
863// typename enable_if
864// <
865// !is_base_of<_T, typename remove_reference<_T1>::type>::value,
866// typename __ref_return1<_R _T::*, _T1>::type
867// >::type
868// __invoke(_R _T::* __f, _T1 __t1)
869// {
870// return (*__t1).*__f;
871// }
872
873// fifth bullet
874
875template <class _F>
876inline _LIBCPP_INLINE_VISIBILITY
877typename result_of<_F()>::type
878__invoke(_F __f)
879{
880 return __f();
881}
882
883template <class _F, class _A0>
884inline _LIBCPP_INLINE_VISIBILITY
885typename result_of<_F(_A0)>::type
886__invoke(_F __f, _A0& __a0)
887{
888 return __f(__a0);
889}
890
891template <class _F, class _A0, class _A1>
892inline _LIBCPP_INLINE_VISIBILITY
893typename result_of<_F(_A0, _A1)>::type
894__invoke(_F __f, _A0& __a0, _A1& __a1)
895{
896 return __f(__a0, __a1);
897}
898
899template <class _F, class _A0, class _A1, class _A2>
900inline _LIBCPP_INLINE_VISIBILITY
901typename result_of<_F(_A0, _A1, _A2)>::type
902__invoke(_F __f, _A0& __a0, _A1& __a1, _A2& __a2)
903{
904 return __f(__a0, __a1, __a2);
905}
906
907// template <class _R, class _F>
908// inline _LIBCPP_INLINE_VISIBILITY
909// _R
910// __invoke(_F& __f)
911// {
912// return __f();
913// }
914//
915// template <class _R, class _F, class _A0>
916// inline _LIBCPP_INLINE_VISIBILITY
917// typename enable_if
918// <
919// !is_member_pointer<_F>::value,
920// _R
921// >::type
922// __invoke(_F& __f, _A0& __a0)
923// {
924// return __f(__a0);
925// }
926//
927// template <class _R, class _F, class _A0, class _A1>
928// inline _LIBCPP_INLINE_VISIBILITY
929// _R
930// __invoke(_F& __f, _A0& __a0, _A1& __a1)
931// {
932// return __f(__a0, __a1);
933// }
934//
935// template <class _R, class _F, class _A0, class _A1, class _A2>
936// inline _LIBCPP_INLINE_VISIBILITY
937// _R
938// __invoke(_F& __f, _A0& __a0, _A1& __a1, _A2& __a2)
939// {
940// return __f(__a0, __a1, __a2);
941// }
942
943template <class _Tp>
944struct __has_type
945{
946private:
947 struct __two {char _; char __;};
948 template <class _Up> static __two __test(...);
949 template <class _Up> static char __test(typename _Up::type* = 0);
950public:
951 static const bool value = sizeof(__test<_Tp>(0)) == 1;
952};
953
954template <class _F, bool = __has_result_type<__weak_result_type<_F> >::value>
955struct __invoke_return
956{
957 typedef typename __weak_result_type<_F>::result_type type;
958};
959
960template <class _F>
961struct __invoke_return<_F, false>
962{
963 typedef decltype(__invoke(_STD::declval<_F>())) type;
964};
965
966template <class _Tp, class _A0>
967struct __invoke_return0
968{
969 typedef decltype(__invoke(_STD::declval<_Tp>(), _STD::declval<_A0>())) type;
970};
971
972template <class _R, class _T, class _A0>
973struct __invoke_return0<_R _T::*, _A0>
974{
975 typedef typename __apply_cv<_A0, _R>::type& type;
976};
977
978template <class _R, class _T, class _A0>
979struct __invoke_return0<_R _T::*, _A0*>
980{
981 typedef typename __apply_cv<_A0, _R>::type& type;
982};
983
984template <class _Tp, class _A0, class _A1>
985struct __invoke_return1
986{
987 typedef decltype(__invoke(_STD::declval<_Tp>(), _STD::declval<_A0>(),
988 _STD::declval<_A1>())) type;
989};
990
991template <class _Tp, class _A0, class _A1, class _A2>
992struct __invoke_return2
993{
994 typedef decltype(__invoke(_STD::declval<_Tp>(), _STD::declval<_A0>(),
995 _STD::declval<_A1>(),
996 _STD::declval<_A2>())) type;
997};
998
999template <class _Tp>
1000class reference_wrapper
1001 : public __weak_result_type<_Tp>
1002{
1003public:
1004 // types
1005 typedef _Tp type;
1006private:
1007 type* __f_;
1008
1009public:
1010 // construct/copy/destroy
1011 _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) : __f_(&__f) {}
1012
1013 // access
1014 _LIBCPP_INLINE_VISIBILITY operator type& () const {return *__f_;}
1015 _LIBCPP_INLINE_VISIBILITY type& get() const {return *__f_;}
1016
1017 // invoke
1018
1019 typename __invoke_return<type&>::type
1020 operator() () const
1021 {
1022 return __invoke(get());
1023 }
1024
1025 template <class _A0>
1026 typename __invoke_return0<type&, _A0>::type
1027 operator() (_A0& __a0) const
1028 {
1029 return __invoke(get(), __a0);
1030 }
1031
1032 template <class _A0, class _A1>
1033 typename __invoke_return1<type&, _A0, _A1>::type
1034 operator() (_A0& __a0, _A1& __a1) const
1035 {
1036 return __invoke(get(), __a0, __a1);
1037 }
1038
1039 template <class _A0, class _A1, class _A2>
1040 typename __invoke_return2<type&, _A0, _A1, _A2>::type
1041 operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
1042 {
1043 return __invoke(get(), __a0, __a1, __a2);
1044 }
1045};
1046
1047template <class _Tp> struct ____is_reference_wrapper : public false_type {};
1048template <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {};
1049template <class _Tp> struct __is_reference_wrapper
1050 : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {};
1051
1052template <class _Tp>
1053inline _LIBCPP_INLINE_VISIBILITY
1054reference_wrapper<_Tp>
1055ref(_Tp& __t)
1056{
1057 return reference_wrapper<_Tp>(__t);
1058}
1059
1060template <class _Tp>
1061inline _LIBCPP_INLINE_VISIBILITY
1062reference_wrapper<_Tp>
1063ref(reference_wrapper<_Tp> __t)
1064{
1065 return ref(__t.get());
1066}
1067
1068template <class _Tp>
1069inline _LIBCPP_INLINE_VISIBILITY
1070reference_wrapper<const _Tp>
1071cref(const _Tp& __t)
1072{
1073 return reference_wrapper<const _Tp>(__t);
1074}
1075
1076template <class _Tp>
1077inline _LIBCPP_INLINE_VISIBILITY
1078reference_wrapper<const _Tp>
1079cref(reference_wrapper<_Tp> __t)
1080{
1081 return cref(__t.get());
1082}
1083
1084#endif