blob: 0a7ff62ed698733fb015ae76197549bb277b2bf4 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_FUNCTIONAL_BASE_03
12#define _LIBCPP_FUNCTIONAL_BASE_03
13
14// manual variadic expansion for <functional>
15
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000016// __invoke
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000017// first bullet
18
Dan Albert1d4a1ed2016-05-25 22:36:09 -070019template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000020inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -070021typename enable_if
22<
23 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
24 _Rp
25>::type
26__invoke(_Rp (_Tp::*__f)(), _T1& __t1)
27{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000028 return (__t1.*__f)();
29}
30
Dan Albert1d4a1ed2016-05-25 22:36:09 -070031template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000032inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -070033typename enable_if
34<
35 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
36 _Rp
37>::type
38__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0)
39{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000040 return (__t1.*__f)(__a0);
41}
42
Dan Albert1d4a1ed2016-05-25 22:36:09 -070043template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000044inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -070045typename enable_if
46<
47 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
48 _Rp
49>::type
50__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
51{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000052 return (__t1.*__f)(__a0, __a1);
53}
54
Dan Albert1d4a1ed2016-05-25 22:36:09 -070055template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000056inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -070057typename enable_if
58<
59 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
60 _Rp
61>::type
62__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
63{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000064 return (__t1.*__f)(__a0, __a1, __a2);
65}
66
Dan Albert1d4a1ed2016-05-25 22:36:09 -070067template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000068inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -070069typename enable_if
70<
71 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
72 _Rp
73>::type
74__invoke(_Rp (_Tp::*__f)() const, _T1& __t1)
75{
76 return (__t1.*__f)();
77}
78
79template <class _Rp, class _Tp, class _T1, class _A0>
80inline _LIBCPP_INLINE_VISIBILITY
81typename enable_if
82<
83 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
84 _Rp
85>::type
86__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0)
87{
88 return (__t1.*__f)(__a0);
89}
90
91template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
92inline _LIBCPP_INLINE_VISIBILITY
93typename enable_if
94<
95 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
96 _Rp
97>::type
98__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
99{
100 return (__t1.*__f)(__a0, __a1);
101}
102
103template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
104inline _LIBCPP_INLINE_VISIBILITY
105typename enable_if
106<
107 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
108 _Rp
109>::type
110__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
111{
112 return (__t1.*__f)(__a0, __a1, __a2);
113}
114
115template <class _Rp, class _Tp, class _T1>
116inline _LIBCPP_INLINE_VISIBILITY
117typename enable_if
118<
119 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
120 _Rp
121>::type
122__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1)
123{
124 return (__t1.*__f)();
125}
126
127template <class _Rp, class _Tp, class _T1, class _A0>
128inline _LIBCPP_INLINE_VISIBILITY
129typename enable_if
130<
131 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
132 _Rp
133>::type
134__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
135{
136 return (__t1.*__f)(__a0);
137}
138
139template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
140inline _LIBCPP_INLINE_VISIBILITY
141typename enable_if
142<
143 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
144 _Rp
145>::type
146__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
147{
148 return (__t1.*__f)(__a0, __a1);
149}
150
151template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
152inline _LIBCPP_INLINE_VISIBILITY
153typename enable_if
154<
155 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
156 _Rp
157>::type
158__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
159{
160 return (__t1.*__f)(__a0, __a1, __a2);
161}
162
163template <class _Rp, class _Tp, class _T1>
164inline _LIBCPP_INLINE_VISIBILITY
165typename enable_if
166<
167 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
168 _Rp
169>::type
170__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1)
171{
172 return (__t1.*__f)();
173}
174
175template <class _Rp, class _Tp, class _T1, class _A0>
176inline _LIBCPP_INLINE_VISIBILITY
177typename enable_if
178<
179 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
180 _Rp
181>::type
182__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
183{
184 return (__t1.*__f)(__a0);
185}
186
187template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
188inline _LIBCPP_INLINE_VISIBILITY
189typename enable_if
190<
191 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
192 _Rp
193>::type
194__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
195{
196 return (__t1.*__f)(__a0, __a1);
197}
198
199template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
200inline _LIBCPP_INLINE_VISIBILITY
201typename enable_if
202<
203 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
204 _Rp
205>::type
206__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
207{
208 return (__t1.*__f)(__a0, __a1, __a2);
209}
210
211// second bullet
212
213template <class _Rp, class _Tp, class _T1>
214inline _LIBCPP_INLINE_VISIBILITY
215typename enable_if
216<
217 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
218 _Rp
219>::type
220__invoke(_Rp (_Tp::*__f)(), _T1 __t1)
221{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000222 return ((*__t1).*__f)();
223}
224
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700225template <class _Rp, class _Tp, class _T1, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000226inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700227typename enable_if
228<
229 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
230 _Rp
231>::type
232__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0)
233{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000234 return ((*__t1).*__f)(__a0);
235}
236
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700237template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000238inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700239typename enable_if
240<
241 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
242 _Rp
243>::type
244__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
245{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000246 return ((*__t1).*__f)(__a0, __a1);
247}
248
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700249template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000250inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700251typename enable_if
252<
253 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
254 _Rp
255>::type
256__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
257{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000258 return ((*__t1).*__f)(__a0, __a1, __a2);
259}
260
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700261template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000262inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700263typename enable_if
264<
265 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
266 _Rp
267>::type
268__invoke(_Rp (_Tp::*__f)() const, _T1 __t1)
269{
270 return ((*__t1).*__f)();
271}
272
273template <class _Rp, class _Tp, class _T1, class _A0>
274inline _LIBCPP_INLINE_VISIBILITY
275typename enable_if
276<
277 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
278 _Rp
279>::type
280__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0)
281{
282 return ((*__t1).*__f)(__a0);
283}
284
285template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
286inline _LIBCPP_INLINE_VISIBILITY
287typename enable_if
288<
289 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
290 _Rp
291>::type
292__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
293{
294 return ((*__t1).*__f)(__a0, __a1);
295}
296
297template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
298inline _LIBCPP_INLINE_VISIBILITY
299typename enable_if
300<
301 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
302 _Rp
303>::type
304__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
305{
306 return ((*__t1).*__f)(__a0, __a1, __a2);
307}
308
309template <class _Rp, class _Tp, class _T1>
310inline _LIBCPP_INLINE_VISIBILITY
311typename enable_if
312<
313 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
314 _Rp
315>::type
316__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1)
317{
318 return ((*__t1).*__f)();
319}
320
321template <class _Rp, class _Tp, class _T1, class _A0>
322inline _LIBCPP_INLINE_VISIBILITY
323typename enable_if
324<
325 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
326 _Rp
327>::type
328__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
329{
330 return ((*__t1).*__f)(__a0);
331}
332
333template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
334inline _LIBCPP_INLINE_VISIBILITY
335typename enable_if
336<
337 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
338 _Rp
339>::type
340__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
341{
342 return ((*__t1).*__f)(__a0, __a1);
343}
344
345template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
346inline _LIBCPP_INLINE_VISIBILITY
347typename enable_if
348<
349 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
350 _Rp
351>::type
352__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
353{
354 return ((*__t1).*__f)(__a0, __a1, __a2);
355}
356
357template <class _Rp, class _Tp, class _T1>
358inline _LIBCPP_INLINE_VISIBILITY
359typename enable_if
360<
361 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
362 _Rp
363>::type
364__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1)
365{
366 return ((*__t1).*__f)();
367}
368
369template <class _Rp, class _Tp, class _T1, class _A0>
370inline _LIBCPP_INLINE_VISIBILITY
371typename enable_if
372<
373 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
374 _Rp
375>::type
376__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
377{
378 return ((*__t1).*__f)(__a0);
379}
380
381template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
382inline _LIBCPP_INLINE_VISIBILITY
383typename enable_if
384<
385 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
386 _Rp
387>::type
388__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
389{
390 return ((*__t1).*__f)(__a0, __a1);
391}
392
393template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
394inline _LIBCPP_INLINE_VISIBILITY
395typename enable_if
396<
397 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
398 _Rp
399>::type
400__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
401{
402 return ((*__t1).*__f)(__a0, __a1, __a2);
403}
404
405// third bullet
406
407template <class _Rp, class _Tp, class _T1>
408inline _LIBCPP_INLINE_VISIBILITY
409typename enable_if
410<
411 is_member_object_pointer<_Rp _Tp::*>::value &&
412 is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
413 __apply_cv<_T1, _Rp>
414>::type::type&
415__invoke(_Rp _Tp::* __f, _T1& __t1)
416{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000417 return __t1.*__f;
418}
419
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700420
421// forth bullet
422
423template <class _T1, class _Rp, bool>
424struct __4th_helper
425{
426};
427
428template <class _T1, class _Rp>
429struct __4th_helper<_T1, _Rp, true>
430{
431 typedef typename __apply_cv<decltype(*_VSTD::declval<_T1&>()), _Rp>::type type;
432};
433
434template <class _Rp, class _Tp, class _T1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000435inline _LIBCPP_INLINE_VISIBILITY
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700436typename __4th_helper<_T1, _Rp,
437 is_member_object_pointer<_Rp _Tp::*>::value &&
438 !is_base_of<_Tp, typename remove_reference<_T1>::type>::value
439>::type&
440__invoke(_Rp _Tp::* __f, _T1& __t1)
441{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000442 return (*__t1).*__f;
443}
444
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000445// fifth bullet
446
Howard Hinnant99968442011-11-29 18:15:50 +0000447template <class _Fp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000449decltype(_VSTD::declval<_Fp&>()())
450__invoke(_Fp& __f)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000451{
452 return __f();
453}
454
Howard Hinnant99968442011-11-29 18:15:50 +0000455template <class _Fp, class _A0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000456inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000457decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>()))
458__invoke(_Fp& __f, _A0& __a0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000459{
460 return __f(__a0);
461}
462
Howard Hinnant99968442011-11-29 18:15:50 +0000463template <class _Fp, class _A0, class _A1>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000464inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000465decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>()))
466__invoke(_Fp& __f, _A0& __a0, _A1& __a1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000467{
468 return __f(__a0, __a1);
469}
470
Howard Hinnant99968442011-11-29 18:15:50 +0000471template <class _Fp, class _A0, class _A1, class _A2>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000472inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier12ddf2c2015-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 Hinnantbc8d3f92010-05-11 19:42:16 +0000475{
476 return __f(__a0, __a1, __a2);
477}
478
Howard Hinnant99968442011-11-29 18:15:50 +0000479template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000480struct __invoke_return
481{
Howard Hinnant99968442011-11-29 18:15:50 +0000482 typedef typename __weak_result_type<_Fp>::result_type type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000483};
484
Howard Hinnant99968442011-11-29 18:15:50 +0000485template <class _Fp>
486struct __invoke_return<_Fp, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000487{
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000488 typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000489};
490
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700491template <class _Tp, class _A0, bool = is_member_object_pointer<_Tp>::value>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000492struct __invoke_return0
493{
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000494 typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000495};
496
Howard Hinnant99968442011-11-29 18:15:50 +0000497template <class _Rp, class _Tp, class _A0>
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700498struct __invoke_return0<_Rp _Tp::*, _A0, true>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000499{
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700500 typedef typename __apply_cv<_A0, _Rp>::type& type;
501};
502
503template <class _Rp, class _Tp, class _A0>
504struct __invoke_return0<_Rp _Tp::*, _A0*, true>
505{
506 typedef typename __apply_cv<_A0, _Rp>::type& type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000507};
508
509template <class _Tp, class _A0, class _A1>
510struct __invoke_return1
511{
Eric Fiselier12ddf2c2015-07-28 01:52:08 +0000512 typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700513 _VSTD::declval<_A1&>())) type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000514};
515
516template <class _Tp, class _A0, class _A1, class _A2>
517struct __invoke_return2
518{
Eric Fiselier12ddf2c2015-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 Hinnantbc8d3f92010-05-11 19:42:16 +0000522};
523
Howard Hinnant324bb032010-08-22 00:02:43 +0000524#endif // _LIBCPP_FUNCTIONAL_BASE_03