blob: 0a7ff62ed698733fb015ae76197549bb277b2bf4 [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//
Howard Hinnant412dbeb2010-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 Hinnant3e519522010-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
Howard Hinnant3e519522010-05-11 19:42:16 +000016// __invoke
Howard Hinnant3e519522010-05-11 19:42:16 +000017// first bullet
18
Howard Hinnantc003db12011-11-29 18:15:50 +000019template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +000020inline _LIBCPP_INLINE_VISIBILITY
21typename enable_if
22<
Howard Hinnantc003db12011-11-29 18:15:50 +000023 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
24 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000025>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000026__invoke(_Rp (_Tp::*__f)(), _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +000027{
28 return (__t1.*__f)();
29}
30
Howard Hinnantc003db12011-11-29 18:15:50 +000031template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +000032inline _LIBCPP_INLINE_VISIBILITY
33typename enable_if
34<
Howard Hinnantc003db12011-11-29 18:15:50 +000035 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
36 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000037>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000038__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +000039{
40 return (__t1.*__f)(__a0);
41}
42
Howard Hinnantc003db12011-11-29 18:15:50 +000043template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +000044inline _LIBCPP_INLINE_VISIBILITY
45typename enable_if
46<
Howard Hinnantc003db12011-11-29 18:15:50 +000047 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
48 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000049>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000050__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +000051{
52 return (__t1.*__f)(__a0, __a1);
53}
54
Howard Hinnantc003db12011-11-29 18:15:50 +000055template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +000056inline _LIBCPP_INLINE_VISIBILITY
57typename enable_if
58<
Howard Hinnantc003db12011-11-29 18:15:50 +000059 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
60 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000061>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000062__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +000063{
64 return (__t1.*__f)(__a0, __a1, __a2);
65}
66
Howard Hinnantc003db12011-11-29 18:15:50 +000067template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +000068inline _LIBCPP_INLINE_VISIBILITY
69typename enable_if
70<
Howard Hinnantc003db12011-11-29 18:15:50 +000071 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
72 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000073>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000074__invoke(_Rp (_Tp::*__f)() const, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +000075{
76 return (__t1.*__f)();
77}
78
Howard Hinnantc003db12011-11-29 18:15:50 +000079template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +000080inline _LIBCPP_INLINE_VISIBILITY
81typename enable_if
82<
Howard Hinnantc003db12011-11-29 18:15:50 +000083 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
84 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000085>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000086__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +000087{
88 return (__t1.*__f)(__a0);
89}
90
Howard Hinnantc003db12011-11-29 18:15:50 +000091template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +000092inline _LIBCPP_INLINE_VISIBILITY
93typename enable_if
94<
Howard Hinnantc003db12011-11-29 18:15:50 +000095 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
96 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +000097>::type
Howard Hinnantc003db12011-11-29 18:15:50 +000098__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +000099{
100 return (__t1.*__f)(__a0, __a1);
101}
102
Howard Hinnantc003db12011-11-29 18:15:50 +0000103template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000104inline _LIBCPP_INLINE_VISIBILITY
105typename enable_if
106<
Howard Hinnantc003db12011-11-29 18:15:50 +0000107 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
108 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000109>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000110__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000111{
112 return (__t1.*__f)(__a0, __a1, __a2);
113}
114
Howard Hinnantc003db12011-11-29 18:15:50 +0000115template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000116inline _LIBCPP_INLINE_VISIBILITY
117typename enable_if
118<
Howard Hinnantc003db12011-11-29 18:15:50 +0000119 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
120 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000121>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000122__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000123{
124 return (__t1.*__f)();
125}
126
Howard Hinnantc003db12011-11-29 18:15:50 +0000127template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000128inline _LIBCPP_INLINE_VISIBILITY
129typename enable_if
130<
Howard Hinnantc003db12011-11-29 18:15:50 +0000131 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
132 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000133>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000134__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000135{
136 return (__t1.*__f)(__a0);
137}
138
Howard Hinnantc003db12011-11-29 18:15:50 +0000139template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000140inline _LIBCPP_INLINE_VISIBILITY
141typename enable_if
142<
Howard Hinnantc003db12011-11-29 18:15:50 +0000143 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
144 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000145>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000146__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000147{
148 return (__t1.*__f)(__a0, __a1);
149}
150
Howard Hinnantc003db12011-11-29 18:15:50 +0000151template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000152inline _LIBCPP_INLINE_VISIBILITY
153typename enable_if
154<
Howard Hinnantc003db12011-11-29 18:15:50 +0000155 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
156 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000157>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000158__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000159{
160 return (__t1.*__f)(__a0, __a1, __a2);
161}
162
Howard Hinnantc003db12011-11-29 18:15:50 +0000163template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000164inline _LIBCPP_INLINE_VISIBILITY
165typename enable_if
166<
Howard Hinnantc003db12011-11-29 18:15:50 +0000167 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
168 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000169>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000170__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000171{
172 return (__t1.*__f)();
173}
174
Howard Hinnantc003db12011-11-29 18:15:50 +0000175template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000176inline _LIBCPP_INLINE_VISIBILITY
177typename enable_if
178<
Howard Hinnantc003db12011-11-29 18:15:50 +0000179 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
180 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000181>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000182__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000183{
184 return (__t1.*__f)(__a0);
185}
186
Howard Hinnantc003db12011-11-29 18:15:50 +0000187template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000188inline _LIBCPP_INLINE_VISIBILITY
189typename enable_if
190<
Howard Hinnantc003db12011-11-29 18:15:50 +0000191 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
192 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000193>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000194__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000195{
196 return (__t1.*__f)(__a0, __a1);
197}
198
Howard Hinnantc003db12011-11-29 18:15:50 +0000199template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000200inline _LIBCPP_INLINE_VISIBILITY
201typename enable_if
202<
Howard Hinnantc003db12011-11-29 18:15:50 +0000203 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
204 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000205>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000206__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000207{
208 return (__t1.*__f)(__a0, __a1, __a2);
209}
210
211// second bullet
212
Howard Hinnantc003db12011-11-29 18:15:50 +0000213template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000214inline _LIBCPP_INLINE_VISIBILITY
215typename enable_if
216<
Howard Hinnantc003db12011-11-29 18:15:50 +0000217 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
218 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000219>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000220__invoke(_Rp (_Tp::*__f)(), _T1 __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000221{
222 return ((*__t1).*__f)();
223}
224
Howard Hinnantc003db12011-11-29 18:15:50 +0000225template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000226inline _LIBCPP_INLINE_VISIBILITY
227typename enable_if
228<
Howard Hinnantc003db12011-11-29 18:15:50 +0000229 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
230 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000231>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000232__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000233{
234 return ((*__t1).*__f)(__a0);
235}
236
Howard Hinnantc003db12011-11-29 18:15:50 +0000237template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000238inline _LIBCPP_INLINE_VISIBILITY
239typename enable_if
240<
Howard Hinnantc003db12011-11-29 18:15:50 +0000241 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
242 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000243>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000244__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000245{
246 return ((*__t1).*__f)(__a0, __a1);
247}
248
Howard Hinnantc003db12011-11-29 18:15:50 +0000249template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000250inline _LIBCPP_INLINE_VISIBILITY
251typename enable_if
252<
Howard Hinnantc003db12011-11-29 18:15:50 +0000253 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
254 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000255>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000256__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000257{
258 return ((*__t1).*__f)(__a0, __a1, __a2);
259}
260
Howard Hinnantc003db12011-11-29 18:15:50 +0000261template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000262inline _LIBCPP_INLINE_VISIBILITY
263typename enable_if
264<
Howard Hinnantc003db12011-11-29 18:15:50 +0000265 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
266 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000267>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000268__invoke(_Rp (_Tp::*__f)() const, _T1 __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000269{
270 return ((*__t1).*__f)();
271}
272
Howard Hinnantc003db12011-11-29 18:15:50 +0000273template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000274inline _LIBCPP_INLINE_VISIBILITY
275typename enable_if
276<
Howard Hinnantc003db12011-11-29 18:15:50 +0000277 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
278 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000279>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000280__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000281{
282 return ((*__t1).*__f)(__a0);
283}
284
Howard Hinnantc003db12011-11-29 18:15:50 +0000285template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000286inline _LIBCPP_INLINE_VISIBILITY
287typename enable_if
288<
Howard Hinnantc003db12011-11-29 18:15:50 +0000289 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
290 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000291>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000292__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000293{
294 return ((*__t1).*__f)(__a0, __a1);
295}
296
Howard Hinnantc003db12011-11-29 18:15:50 +0000297template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000298inline _LIBCPP_INLINE_VISIBILITY
299typename enable_if
300<
Howard Hinnantc003db12011-11-29 18:15:50 +0000301 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
302 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000303>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000304__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000305{
306 return ((*__t1).*__f)(__a0, __a1, __a2);
307}
308
Howard Hinnantc003db12011-11-29 18:15:50 +0000309template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000310inline _LIBCPP_INLINE_VISIBILITY
311typename enable_if
312<
Howard Hinnantc003db12011-11-29 18:15:50 +0000313 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
314 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000315>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000316__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000317{
318 return ((*__t1).*__f)();
319}
320
Howard Hinnantc003db12011-11-29 18:15:50 +0000321template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000322inline _LIBCPP_INLINE_VISIBILITY
323typename enable_if
324<
Howard Hinnantc003db12011-11-29 18:15:50 +0000325 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
326 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000327>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000328__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000329{
330 return ((*__t1).*__f)(__a0);
331}
332
Howard Hinnantc003db12011-11-29 18:15:50 +0000333template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000334inline _LIBCPP_INLINE_VISIBILITY
335typename enable_if
336<
Howard Hinnantc003db12011-11-29 18:15:50 +0000337 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
338 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000339>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000340__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000341{
342 return ((*__t1).*__f)(__a0, __a1);
343}
344
Howard Hinnantc003db12011-11-29 18:15:50 +0000345template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000346inline _LIBCPP_INLINE_VISIBILITY
347typename enable_if
348<
Howard Hinnantc003db12011-11-29 18:15:50 +0000349 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
350 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000351>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000352__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000353{
354 return ((*__t1).*__f)(__a0, __a1, __a2);
355}
356
Howard Hinnantc003db12011-11-29 18:15:50 +0000357template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000358inline _LIBCPP_INLINE_VISIBILITY
359typename enable_if
360<
Howard Hinnantc003db12011-11-29 18:15:50 +0000361 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
362 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000363>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000364__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000365{
366 return ((*__t1).*__f)();
367}
368
Howard Hinnantc003db12011-11-29 18:15:50 +0000369template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000370inline _LIBCPP_INLINE_VISIBILITY
371typename enable_if
372<
Howard Hinnantc003db12011-11-29 18:15:50 +0000373 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
374 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000375>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000376__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000377{
378 return ((*__t1).*__f)(__a0);
379}
380
Howard Hinnantc003db12011-11-29 18:15:50 +0000381template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000382inline _LIBCPP_INLINE_VISIBILITY
383typename enable_if
384<
Howard Hinnantc003db12011-11-29 18:15:50 +0000385 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
386 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000387>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000388__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000389{
390 return ((*__t1).*__f)(__a0, __a1);
391}
392
Howard Hinnantc003db12011-11-29 18:15:50 +0000393template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000394inline _LIBCPP_INLINE_VISIBILITY
395typename enable_if
396<
Howard Hinnantc003db12011-11-29 18:15:50 +0000397 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
398 _Rp
Howard Hinnant3e519522010-05-11 19:42:16 +0000399>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000400__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000401{
402 return ((*__t1).*__f)(__a0, __a1, __a2);
403}
404
405// third bullet
406
Howard Hinnantc003db12011-11-29 18:15:50 +0000407template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000408inline _LIBCPP_INLINE_VISIBILITY
409typename enable_if
410<
Eric Fiseliere62bda72015-07-28 02:15:53 +0000411 is_member_object_pointer<_Rp _Tp::*>::value &&
Howard Hinnantc003db12011-11-29 18:15:50 +0000412 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
Eric Fiseliere62bda72015-07-28 02:15:53 +0000413 __apply_cv<_T1, _Rp>
414>::type::type&
Howard Hinnantc003db12011-11-29 18:15:50 +0000415__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000416{
417 return __t1.*__f;
418}
419
Howard Hinnant3e519522010-05-11 19:42:16 +0000420
Howard Hinnant3e519522010-05-11 19:42:16 +0000421// forth bullet
422
Howard Hinnantc003db12011-11-29 18:15:50 +0000423template <class _T1, class _Rp, bool>
Howard Hinnant3e519522010-05-11 19:42:16 +0000424struct __4th_helper
425{
426};
427
Howard Hinnantc003db12011-11-29 18:15:50 +0000428template <class _T1, class _Rp>
429struct __4th_helper<_T1, _Rp, true>
Howard Hinnant3e519522010-05-11 19:42:16 +0000430{
Eric Fiselierfda20d92015-07-28 01:52:08 +0000431 typedef typename __apply_cv<decltype(*_VSTD::declval<_T1&>()), _Rp>::type type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000432};
433
Howard Hinnantc003db12011-11-29 18:15:50 +0000434template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000435inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000436typename __4th_helper<_T1, _Rp,
Eric Fiseliere62bda72015-07-28 02:15:53 +0000437 is_member_object_pointer<_Rp _Tp::*>::value &&
438 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value
439>::type&
Howard Hinnantc003db12011-11-29 18:15:50 +0000440__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000441{
442 return (*__t1).*__f;
443}
444
Howard Hinnant3e519522010-05-11 19:42:16 +0000445// fifth bullet
446
Howard Hinnantc003db12011-11-29 18:15:50 +0000447template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000448inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfda20d92015-07-28 01:52:08 +0000449decltype(_VSTD::declval<_Fp&>()())
450__invoke(_Fp& __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000451{
452 return __f();
453}
454
Howard Hinnantc003db12011-11-29 18:15:50 +0000455template <class _Fp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000456inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfda20d92015-07-28 01:52:08 +0000457decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>()))
458__invoke(_Fp& __f, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000459{
460 return __f(__a0);
461}
462
Howard Hinnantc003db12011-11-29 18:15:50 +0000463template <class _Fp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000464inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfda20d92015-07-28 01:52:08 +0000465decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>()))
466__invoke(_Fp& __f, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000467{
468 return __f(__a0, __a1);
469}
470
Howard Hinnantc003db12011-11-29 18:15:50 +0000471template <class _Fp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000472inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfda20d92015-07-28 01:52:08 +0000473decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>(), _VSTD::declval<_A2&>()))
474__invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000475{
476 return __f(__a0, __a1, __a2);
477}
478
Howard Hinnantc003db12011-11-29 18:15:50 +0000479template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
Howard Hinnant3e519522010-05-11 19:42:16 +0000480struct __invoke_return
481{
Howard Hinnantc003db12011-11-29 18:15:50 +0000482 typedef typename __weak_result_type<_Fp>::result_type type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000483};
484
Howard Hinnantc003db12011-11-29 18:15:50 +0000485template <class _Fp>
486struct __invoke_return<_Fp, false>
Howard Hinnant3e519522010-05-11 19:42:16 +0000487{
Eric Fiselierfda20d92015-07-28 01:52:08 +0000488 typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000489};
490
Eric Fiseliere62bda72015-07-28 02:15:53 +0000491template <class _Tp, class _A0, bool = is_member_object_pointer<_Tp>::value>
Howard Hinnant3e519522010-05-11 19:42:16 +0000492struct __invoke_return0
493{
Eric Fiselierfda20d92015-07-28 01:52:08 +0000494 typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000495};
496
Howard Hinnantc003db12011-11-29 18:15:50 +0000497template <class _Rp, class _Tp, class _A0>
Eric Fiseliere62bda72015-07-28 02:15:53 +0000498struct __invoke_return0<_Rp _Tp::*, _A0, true>
Howard Hinnant3e519522010-05-11 19:42:16 +0000499{
Howard Hinnantc003db12011-11-29 18:15:50 +0000500 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000501};
502
Howard Hinnantc003db12011-11-29 18:15:50 +0000503template <class _Rp, class _Tp, class _A0>
Eric Fiseliere62bda72015-07-28 02:15:53 +0000504struct __invoke_return0<_Rp _Tp::*, _A0*, true>
Howard Hinnant3e519522010-05-11 19:42:16 +0000505{
Howard Hinnantc003db12011-11-29 18:15:50 +0000506 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000507};
508
509template <class _Tp, class _A0, class _A1>
510struct __invoke_return1
511{
Eric Fiselierfda20d92015-07-28 01:52:08 +0000512 typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
513 _VSTD::declval<_A1&>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000514};
515
516template <class _Tp, class _A0, class _A1, class _A2>
517struct __invoke_return2
518{
Eric Fiselierfda20d92015-07-28 01:52:08 +0000519 typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
520 _VSTD::declval<_A1&>(),
521 _VSTD::declval<_A2&>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000522};
523
Howard Hinnantb3371f62010-08-22 00:02:43 +0000524#endif // _LIBCPP_FUNCTIONAL_BASE_03