blob: f408f467f50c87073b0ffbf21f82cd79625ac990 [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<
Howard Hinnantc003db12011-11-29 18:15:50 +0000411 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
412 typename __apply_cv<_T1, _Rp>::type&
Howard Hinnant3e519522010-05-11 19:42:16 +0000413>::type
Howard Hinnantc003db12011-11-29 18:15:50 +0000414__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000415{
416 return __t1.*__f;
417}
418
Howard Hinnantc003db12011-11-29 18:15:50 +0000419template <class _Rp, class _Tp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000420inline _LIBCPP_INLINE_VISIBILITY
421void
Howard Hinnantc003db12011-11-29 18:15:50 +0000422__invoke(_Rp _Tp::*)
Howard Hinnant3e519522010-05-11 19:42:16 +0000423{
424}
425
Howard Hinnant3e519522010-05-11 19:42:16 +0000426// forth bullet
427
Howard Hinnantc003db12011-11-29 18:15:50 +0000428template <class _T1, class _Rp, bool>
Howard Hinnant3e519522010-05-11 19:42:16 +0000429struct __4th_helper
430{
431};
432
Howard Hinnantc003db12011-11-29 18:15:50 +0000433template <class _T1, class _Rp>
434struct __4th_helper<_T1, _Rp, true>
Howard Hinnant3e519522010-05-11 19:42:16 +0000435{
Howard Hinnantc003db12011-11-29 18:15:50 +0000436 typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Rp>::type type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000437};
438
Howard Hinnantc003db12011-11-29 18:15:50 +0000439template <class _Rp, class _Tp, class _T1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000440inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000441typename __4th_helper<_T1, _Rp,
442 !is_base_of<_Tp,
Howard Hinnant3e519522010-05-11 19:42:16 +0000443 typename remove_reference<_T1>::type
444 >::value
445 >::type&
Howard Hinnantc003db12011-11-29 18:15:50 +0000446__invoke(_Rp _Tp::* __f, _T1& __t1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000447{
448 return (*__t1).*__f;
449}
450
Howard Hinnant3e519522010-05-11 19:42:16 +0000451// fifth bullet
452
Howard Hinnantc003db12011-11-29 18:15:50 +0000453template <class _Fp>
Howard Hinnant3e519522010-05-11 19:42:16 +0000454inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000455decltype(declval<_Fp>()())
456__invoke(_Fp __f)
Howard Hinnant3e519522010-05-11 19:42:16 +0000457{
458 return __f();
459}
460
Howard Hinnantc003db12011-11-29 18:15:50 +0000461template <class _Fp, class _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000462inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000463decltype(declval<_Fp>()(declval<_A0&>()))
464__invoke(_Fp __f, _A0& __a0)
Howard Hinnant3e519522010-05-11 19:42:16 +0000465{
466 return __f(__a0);
467}
468
Howard Hinnantc003db12011-11-29 18:15:50 +0000469template <class _Fp, class _A0, class _A1>
Howard Hinnant3e519522010-05-11 19:42:16 +0000470inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000471decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>()))
472__invoke(_Fp __f, _A0& __a0, _A1& __a1)
Howard Hinnant3e519522010-05-11 19:42:16 +0000473{
474 return __f(__a0, __a1);
475}
476
Howard Hinnantc003db12011-11-29 18:15:50 +0000477template <class _Fp, class _A0, class _A1, class _A2>
Howard Hinnant3e519522010-05-11 19:42:16 +0000478inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc003db12011-11-29 18:15:50 +0000479decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>()))
480__invoke(_Fp __f, _A0& __a0, _A1& __a1, _A2& __a2)
Howard Hinnant3e519522010-05-11 19:42:16 +0000481{
482 return __f(__a0, __a1, __a2);
483}
484
Howard Hinnant3e519522010-05-11 19:42:16 +0000485template <class _Tp>
486struct __has_type
487{
488private:
Howard Hinnant54d333a2012-10-30 19:06:59 +0000489 struct __two {char __lx; char __lxx;};
Howard Hinnant3e519522010-05-11 19:42:16 +0000490 template <class _Up> static __two __test(...);
491 template <class _Up> static char __test(typename _Up::type* = 0);
492public:
493 static const bool value = sizeof(__test<_Tp>(0)) == 1;
494};
495
Howard Hinnantc003db12011-11-29 18:15:50 +0000496template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
Howard Hinnant3e519522010-05-11 19:42:16 +0000497struct __invoke_return
498{
Howard Hinnantc003db12011-11-29 18:15:50 +0000499 typedef typename __weak_result_type<_Fp>::result_type type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000500};
501
Howard Hinnantc003db12011-11-29 18:15:50 +0000502template <class _Fp>
503struct __invoke_return<_Fp, false>
Howard Hinnant3e519522010-05-11 19:42:16 +0000504{
Howard Hinnantc003db12011-11-29 18:15:50 +0000505 typedef decltype(__invoke(_VSTD::declval<_Fp>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000506};
507
508template <class _Tp, class _A0>
509struct __invoke_return0
510{
Howard Hinnantce48a112011-06-30 21:18:19 +0000511 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000512};
513
Howard Hinnantc003db12011-11-29 18:15:50 +0000514template <class _Rp, class _Tp, class _A0>
515struct __invoke_return0<_Rp _Tp::*, _A0>
Howard Hinnant3e519522010-05-11 19:42:16 +0000516{
Howard Hinnantc003db12011-11-29 18:15:50 +0000517 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000518};
519
Howard Hinnantc003db12011-11-29 18:15:50 +0000520template <class _Rp, class _Tp, class _A0>
521struct __invoke_return0<_Rp _Tp::*, _A0*>
Howard Hinnant3e519522010-05-11 19:42:16 +0000522{
Howard Hinnantc003db12011-11-29 18:15:50 +0000523 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000524};
525
526template <class _Tp, class _A0, class _A1>
527struct __invoke_return1
528{
Howard Hinnantce48a112011-06-30 21:18:19 +0000529 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
530 _VSTD::declval<_A1>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000531};
532
533template <class _Tp, class _A0, class _A1, class _A2>
534struct __invoke_return2
535{
Howard Hinnantce48a112011-06-30 21:18:19 +0000536 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(),
537 _VSTD::declval<_A1>(),
538 _VSTD::declval<_A2>())) type;
Howard Hinnant3e519522010-05-11 19:42:16 +0000539};
540
Howard Hinnantb3371f62010-08-22 00:02:43 +0000541#endif // _LIBCPP_FUNCTIONAL_BASE_03