comparison DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 // Copyright (C) 2012-2013 Vicente J. Botet Escriba
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 // 2013/04 Vicente J. Botet Escriba
7 // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
8 // Make use of Boost.Move
9 // Make use of Boost.Tuple (movable)
10 // 2012 Vicente J. Botet Escriba
11 // Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined
12 // 2012 Vicente J. Botet Escriba
13 // Adapt to boost libc++ implementation
14
15 //===----------------------------------------------------------------------===//
16 //
17 // The LLVM Compiler Infrastructure
18 //
19 // This file is dual licensed under the MIT and the University of Illinois Open
20 // Source Licenses. See LICENSE.TXT for details.
21 //
22 // The invoke code is based on the one from libcxx.
23 //===----------------------------------------------------------------------===//
24
25 #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
26 #define BOOST_THREAD_DETAIL_INVOKE_HPP
27
28 #include <boost/config.hpp>
29 #include <boost/static_assert.hpp>
30 #include <boost/thread/detail/move.hpp>
31 #include <boost/type_traits/is_base_of.hpp>
32 #include <boost/type_traits/remove_reference.hpp>
33 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
34 #include <functional>
35 #endif
36
37 namespace boost
38 {
39 namespace detail
40 {
41
42
43 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
44 ! defined(BOOST_NO_SFINAE_EXPR) && \
45 ! defined(BOOST_NO_CXX11_DECLTYPE) && \
46 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
47 ! defined(BOOST_NO_CXX11_AUTO)
48
49 #define BOOST_THREAD_PROVIDES_INVOKE
50
51 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
52 // bullets 1 and 2
53
54 template <class Fp, class A0, class ...Args>
55 inline auto
56 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
57 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
58 {
59 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
60 }
61
62 template <class Fp, class A0, class ...Args>
63 inline auto
64 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
65 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
66 {
67 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
68 }
69
70 // bullets 3 and 4
71
72 template <class Fp, class A0>
73 inline auto
74 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
75 -> decltype(boost::forward<A0>(a0).*f)
76 {
77 return boost::forward<A0>(a0).*f;
78 }
79
80 template <class Fp, class A0>
81 inline auto
82 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
83 -> decltype((*boost::forward<A0>(a0)).*f)
84 {
85 return (*boost::forward<A0>(a0)).*f;
86 }
87
88 // bullet 5
89
90 template <class Fp, class ...Args>
91 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
92 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
93 {
94 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
95 }
96 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
97
98 // bullets 1 and 2
99
100 template <class Fp, class A0>
101 inline
102 auto
103 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
104 -> decltype((boost::forward<A0>(a0).*f)())
105 {
106 return (boost::forward<A0>(a0).*f)();
107 }
108 template <class Fp, class A0, class A1>
109 inline
110 auto
111 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
112 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)))
113 {
114 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1));
115 }
116 template <class Fp, class A0, class A1, class A2>
117 inline
118 auto
119 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
120 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
121 {
122 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
123 }
124
125 template <class Fp, class A0>
126 inline
127 auto
128 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
129 -> decltype(((*boost::forward<A0>(a0)).*f)())
130 {
131 return ((*boost::forward<A0>(a0)).*f)();
132 }
133 template <class Fp, class A0, class A1>
134 inline
135 auto
136 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
137 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)))
138 {
139 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1));
140 }
141 template <class Fp, class A0, class A1>
142 inline
143 auto
144 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
145 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
146 {
147 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
148 }
149
150 // bullets 3 and 4
151
152 template <class Fp, class A0>
153 inline
154 auto
155 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
156 -> decltype(boost::forward<A0>(a0).*f)
157 {
158 return boost::forward<A0>(a0).*f;
159 }
160
161 template <class Fp, class A0>
162 inline
163 auto
164 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
165 -> decltype((*boost::forward<A0>(a0)).*f)
166 {
167 return (*boost::forward<A0>(a0)).*f;
168 }
169
170 // bullet 5
171
172 template <class Fp>
173 inline
174 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
175 -> decltype(boost::forward<Fp>(f)())
176 {
177 return boost::forward<Fp>(f)();
178 }
179 template <class Fp, class A1>
180 inline
181 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1)
182 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
183 {
184 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
185 } template <class Fp, class A1, class A2>
186 inline
187 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
188 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
189 {
190 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
191 }
192 template <class Fp, class A1, class A2, class A3>
193 inline
194 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
195 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
196 {
197 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
198 }
199
200 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
201
202 #elif ! defined(BOOST_NO_SFINAE_EXPR) && \
203 ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
204 defined BOOST_MSVC
205
206 template <class Ret, class Fp>
207 inline
208 Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
209 {
210 return f();
211 }
212 template <class Ret, class Fp, class A1>
213 inline
214 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
215 {
216 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
217 }
218 template <class Ret, class Fp, class A1, class A2>
219 inline
220 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
221 {
222 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
223 }
224 template <class Ret, class Fp, class A1, class A2, class A3>
225 inline
226 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
227 {
228 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
229 }
230
231 #define BOOST_THREAD_PROVIDES_INVOKE_RET
232
233 #elif ! defined BOOST_MSVC
234 //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET
235 #define BOOST_THREAD_PROVIDES_INVOKE_RET
236
237 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
238
239 // bullet 1
240 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
241 // type T or a reference to an object of type T or a reference to an object of a type derived from T
242 template <class Ret, class A, class A0, class ...Args>
243 inline
244 typename enable_if_c
245 <
246 is_base_of<A, typename remove_reference<A0>::type>::value,
247 Ret
248 >::type
249 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
250 {
251 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
252 }
253
254 template <class Ret, class A, class A0, class ...Args>
255 inline
256 typename enable_if_c
257 <
258 is_base_of<A, typename remove_reference<A0>::type>::value,
259 Ret
260 >::type
261 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
262 {
263 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
264 }
265
266 template <class Ret, class A, class A0, class ...Args>
267 inline
268 typename enable_if_c
269 <
270 is_base_of<A, typename remove_reference<A0>::type>::value,
271 Ret
272 >::type
273 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
274 {
275 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
276 }
277
278 template <class Ret, class A, class A0, class ...Args>
279 inline
280 typename enable_if_c
281 <
282 is_base_of<A, typename remove_reference<A0>::type>::value,
283 Ret
284 >::type
285 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
286 {
287 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
288 }
289
290 // bullet 2
291 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
292 // the types described in the previous item;
293 template <class Ret, class A, class A0, class ...Args>
294 inline
295 typename enable_if_c
296 <
297 ! is_base_of<A, typename remove_reference<A0>::type>::value,
298 Ret
299 >::type
300 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
301 {
302 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
303 }
304
305 template <class Ret, class A, class A0, class ...Args>
306 inline
307 typename enable_if_c
308 <
309 ! is_base_of<A, typename remove_reference<A0>::type>::value,
310 Ret
311 >::type
312 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
313 {
314 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
315 }
316
317 template <class Ret, class A, class A0, class ...Args>
318 inline
319 typename enable_if_c
320 <
321 ! is_base_of<A, typename remove_reference<A0>::type>::value,
322 Ret
323 >::type
324 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
325 {
326 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
327 }
328
329 template <class Ret, class A, class A0, class ...Args>
330 inline
331 typename enable_if_c
332 <
333 ! is_base_of<A, typename remove_reference<A0>::type>::value,
334 Ret
335 >::type
336 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
337 {
338 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
339 }
340
341 // bullet 3
342 // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
343 // reference to an object of type T or a reference to an object of a type derived from T;
344 // template <class Ret, class A, class A0>
345 // inline
346 // typename enable_if_c
347 // <
348 // is_base_of<A, typename remove_reference<A0>::type>::value,
349 // typename detail::apply_cv<A0, A>::type&
350 // >::type
351 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
352 // {
353 // return boost::forward<A0>(a0).*f;
354 // }
355
356 // bullet 4
357 // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
358 //described in the previous item;
359
360 // template <class A0, class Ret, bool>
361 // struct d4th_helper
362 // {
363 // };
364 //
365 // template <class A0, class Ret>
366 // struct d4th_helper<A0, Ret, true>
367 // {
368 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
369 // };
370 //
371 // template <class Ret, class A, class A0>
372 // inline
373 // typename detail::4th_helper<A, Ret,
374 // !is_base_of<A,
375 // typename remove_reference<A0>::type
376 // >::value
377 // >::type&
378 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
379 // {
380 // return (*boost::forward<A0>(a0)).*f;
381 // }
382
383 // template <class Ret, class A, class A0>
384 // inline
385 // typename enable_if_c
386 // <
387 // !is_base_of<A, typename remove_reference<A0>::type>::value,
388 // typename detail::ref_return1<Ret A::*, A0>::type
389 // >::type
390 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
391 // {
392 // return (*boost::forward<A0>(a0)).*f;
393 // }
394
395 // bullet 5
396 // f(t1, t2, ..., tN) in all other cases.
397
398 template <class Ret, class Fp, class ...Args>
399 inline
400 typename enable_if_c
401 <
402 ! is_member_function_pointer<Fp>::value,
403 Ret
404 >::type
405 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
406 {
407 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
408 }
409 template <class Ret, class ...Args>
410 inline Ret
411 invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args)
412 {
413 return f(boost::forward<Args>(args)...);
414 }
415 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
416 // bullet 1
417 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
418 // type T or a reference to an object of type T or a reference to an object of a type derived from T
419
420 template <class Ret, class A, class A0>
421 inline
422 typename enable_if_c
423 <
424 is_base_of<A, typename remove_reference<A0>::type>::value,
425 Ret
426 >::type
427 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
428 {
429 return (boost::forward<A0>(a0).*f)();
430 }
431 template <class Ret, class A, class A0, class A1>
432 inline
433 typename enable_if_c
434 <
435 is_base_of<A, typename remove_reference<A0>::type>::value,
436 Ret
437 >::type
438 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
439 {
440 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
441 }
442 template <class Ret, class A, class A0, class A1>
443 inline
444 typename enable_if_c
445 <
446 is_base_of<A, typename remove_reference<A0>::type>::value,
447 Ret
448 >::type
449 invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
450 {
451 return (a0.*f)(a1);
452 }
453 template <class Ret, class A, class A0, class A1, class A2>
454 inline
455 typename enable_if_c
456 <
457 is_base_of<A, typename remove_reference<A0>::type>::value,
458 Ret
459 >::type
460 invoke(Ret (A::*f)(A1, A2),
461 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
462 )
463 {
464 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
465 }
466 template <class Ret, class A, class A0, class A1, class A2>
467 inline
468 typename enable_if_c
469 <
470 is_base_of<A, typename remove_reference<A0>::type>::value,
471 Ret
472 >::type
473 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
474 {
475 return (a0.*f)(a1, a2);
476 }
477 template <class Ret, class A, class A0, class A1, class A2, class A3>
478 inline
479 typename enable_if_c
480 <
481 is_base_of<A, typename remove_reference<A0>::type>::value,
482 Ret
483 >::type
484 invoke(Ret (A::*f)(A1, A2, A3),
485 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
486 {
487 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
488 }
489 template <class Ret, class A, class A0, class A1, class A2, class A3>
490 inline
491 typename enable_if_c
492 <
493 is_base_of<A, typename remove_reference<A0>::type>::value,
494 Ret
495 >::type
496 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
497 {
498 return (a0.*f)(a1, a2, a3);
499 }
500
501 ///
502 template <class Ret, class A, class A0>
503 inline
504 typename enable_if_c
505 <
506 is_base_of<A, typename remove_reference<A0>::type>::value,
507 Ret
508 >::type
509 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
510 {
511 return (boost::forward<A0>(a0).*f)();
512 }
513 template <class Ret, class A, class A0, class A1>
514 inline
515 typename enable_if_c
516 <
517 is_base_of<A, typename remove_reference<A0>::type>::value,
518 Ret
519 >::type
520 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
521 {
522 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
523 }
524 template <class Ret, class A, class A0, class A1>
525 inline
526 typename enable_if_c
527 <
528 is_base_of<A, typename remove_reference<A0>::type>::value,
529 Ret
530 >::type
531 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
532 {
533 return (a0.*f)(a1);
534 }
535 template <class Ret, class A, class A0, class A1, class A2>
536 inline
537 typename enable_if_c
538 <
539 is_base_of<A, typename remove_reference<A0>::type>::value,
540 Ret
541 >::type
542 invoke(Ret (A::*f)(A1, A2) const,
543 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
544 )
545 {
546 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
547 );
548 }
549 template <class Ret, class A, class A0, class A1, class A2>
550 inline
551 typename enable_if_c
552 <
553 is_base_of<A, typename remove_reference<A0>::type>::value,
554 Ret
555 >::type
556 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
557 {
558 return (a0.*f)(a1, a2);
559 }
560 template <class Ret, class A, class A0, class A1, class A2, class A3>
561 inline
562 typename enable_if_c
563 <
564 is_base_of<A, typename remove_reference<A0>::type>::value,
565 Ret
566 >::type
567 invoke(Ret (A::*f)(A1, A2, A3) const,
568 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
569 )
570 {
571 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
572 }
573 template <class Ret, class A, class A0, class A1, class A2, class A3>
574 inline
575 typename enable_if_c
576 <
577 is_base_of<A, typename remove_reference<A0>::type>::value,
578 Ret
579 >::type
580 invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
581 {
582 return (a0.*f)(a1, a2, a3);
583 }
584 ///
585 template <class Ret, class A, class A0>
586 inline
587 typename enable_if_c
588 <
589 is_base_of<A, typename remove_reference<A0>::type>::value,
590 Ret
591 >::type
592 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
593 {
594 return (boost::forward<A0>(a0).*f)();
595 }
596 template <class Ret, class A, class A0, class A1>
597 inline
598 typename enable_if_c
599 <
600 is_base_of<A, typename remove_reference<A0>::type>::value,
601 Ret
602 >::type
603 invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
604 {
605 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
606 }
607 template <class Ret, class A, class A0, class A1>
608 inline
609 typename enable_if_c
610 <
611 is_base_of<A, typename remove_reference<A0>::type>::value,
612 Ret
613 >::type
614 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
615 {
616 return (a0.*f)(a1);
617 }
618 template <class Ret, class A, class A0, class A1, class A2>
619 inline
620 typename enable_if_c
621 <
622 is_base_of<A, typename remove_reference<A0>::type>::value,
623 Ret
624 >::type
625 invoke(Ret (A::*f)(A1, A2) volatile,
626 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
627 {
628 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
629 }
630 template <class Ret, class A, class A0, class A1, class A2>
631 inline
632 typename enable_if_c
633 <
634 is_base_of<A, typename remove_reference<A0>::type>::value,
635 Ret
636 >::type
637 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
638 {
639 return (a0.*f)(a1, a2);
640 }
641 template <class Ret, class A, class A0, class A1, class A2, class A3>
642 inline
643 typename enable_if_c
644 <
645 is_base_of<A, typename remove_reference<A0>::type>::value,
646 Ret
647 >::type
648 invoke(Ret (A::*f)(A1, A2, A3) volatile,
649 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
650 )
651 {
652 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
653 }
654 template <class Ret, class A, class A0, class A1, class A2, class A3>
655 inline
656 typename enable_if_c
657 <
658 is_base_of<A, typename remove_reference<A0>::type>::value,
659 Ret
660 >::type
661 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
662 {
663 return (a0.*f)(a1, a2, a3);
664 }
665 ///
666 template <class Ret, class A, class A0>
667 inline
668 typename enable_if_c
669 <
670 is_base_of<A, typename remove_reference<A0>::type>::value,
671 Ret
672 >::type
673 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
674 {
675 return (boost::forward<A0>(a0).*f)();
676 }
677 template <class Ret, class A, class A0, class A1>
678 inline
679 typename enable_if_c
680 <
681 is_base_of<A, typename remove_reference<A0>::type>::value,
682 Ret
683 >::type
684 invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
685 {
686 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
687 }
688 template <class Ret, class A, class A0, class A1>
689 inline
690 typename enable_if_c
691 <
692 is_base_of<A, typename remove_reference<A0>::type>::value,
693 Ret
694 >::type
695 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
696 {
697 return (a0.*f)(a1);
698 }
699 template <class Ret, class A, class A0, class A1, class A2>
700 inline
701 typename enable_if_c
702 <
703 is_base_of<A, typename remove_reference<A0>::type>::value,
704 Ret
705 >::type
706 invoke(Ret (A::*f)(A1, A2) const volatile,
707 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
708 )
709 {
710 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
711 }
712 template <class Ret, class A, class A0, class A1, class A2>
713 inline
714 typename enable_if_c
715 <
716 is_base_of<A, typename remove_reference<A0>::type>::value,
717 Ret
718 >::type
719 invoke(Ret (A::*f)(A1, A2) const volatile,
720 A0 a0, A1 a1, A2 a2
721 )
722 {
723 return (a0.*f)(a1, a2);
724 }
725 template <class Ret, class A, class A0, class A1, class A2, class A3>
726 inline
727 typename enable_if_c
728 <
729 is_base_of<A, typename remove_reference<A0>::type>::value,
730 Ret
731 >::type
732 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
733 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
734 )
735 {
736 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
737 }
738 template <class Ret, class A, class A0, class A1, class A2, class A3>
739 inline
740 typename enable_if_c
741 <
742 is_base_of<A, typename remove_reference<A0>::type>::value,
743 Ret
744 >::type
745 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
746 A0 a0, A1 a1, A2 a2, A3 a3
747 )
748 {
749 return (a0.*f)(a1, a2, a3);
750 }
751
752 // bullet 2
753 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
754 // the types described in the previous item;
755 template <class Ret, class A, class A0>
756 inline
757 typename enable_if_c
758 <
759 ! is_base_of<A, typename remove_reference<A0>::type>::value,
760 Ret
761 >::type
762 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
763 {
764 return ((*boost::forward<A0>(a0)).*f)();
765 }
766 template <class Ret, class A, class A0, class A1>
767 inline
768 typename enable_if_c
769 <
770 ! is_base_of<A, typename remove_reference<A0>::type>::value,
771 Ret
772 >::type
773 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
774 {
775 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
776 }
777 template <class Ret, class A, class A0, class A1>
778 inline
779 typename enable_if_c
780 <
781 ! is_base_of<A, typename remove_reference<A0>::type>::value,
782 Ret
783 >::type
784 invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
785 {
786 return ((*a0).*f)(a1);
787 }
788 template <class Ret, class A, class A0, class A1, class A2>
789 inline
790 typename enable_if_c
791 <
792 ! is_base_of<A, typename remove_reference<A0>::type>::value,
793 Ret
794 >::type
795 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
796 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
797 {
798 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
799 }
800 template <class Ret, class A, class A0, class A1, class A2>
801 inline
802 typename enable_if_c
803 <
804 ! is_base_of<A, typename remove_reference<A0>::type>::value,
805 Ret
806 >::type
807 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
808 {
809 return ((*a0).*f)(a1, a2);
810 }
811 template <class Ret, class A, class A0, class A1, class A2, class A3>
812 inline
813 typename enable_if_c
814 <
815 ! is_base_of<A, typename remove_reference<A0>::type>::value,
816 Ret
817 >::type
818 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
819 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
820 {
821 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
822 );
823 }
824 template <class Ret, class A, class A0, class A1, class A2, class A3>
825 inline
826 typename enable_if_c
827 <
828 ! is_base_of<A, typename remove_reference<A0>::type>::value,
829 Ret
830 >::type
831 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
832 {
833 return ((*a0).*f)(a1, a2, a3);
834 }
835
836 ///
837 template <class Ret, class A, class A0>
838 inline
839 typename enable_if_c
840 <
841 ! is_base_of<A, typename remove_reference<A0>::type>::value,
842 Ret
843 >::type
844 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
845 {
846 return ((*boost::forward<A0>(a0)).*f)();
847 }
848 template <class Ret, class A, class A0, class A1>
849 inline
850 typename enable_if_c
851 <
852 ! is_base_of<A, typename remove_reference<A0>::type>::value,
853 Ret
854 >::type
855 invoke(Ret (A::*f)(A1) const,
856 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
857 {
858 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
859 }
860 template <class Ret, class A, class A0, class A1>
861 inline
862 typename enable_if_c
863 <
864 ! is_base_of<A, typename remove_reference<A0>::type>::value,
865 Ret
866 >::type
867 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
868 {
869 return ((*boost::forward<A0>(a0)).*f)(a1);
870 }
871 template <class Ret, class A, class A0, class A1>
872 inline
873 typename enable_if_c
874 <
875 ! is_base_of<A, typename remove_reference<A0>::type>::value,
876 Ret
877 >::type
878 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
879 {
880 return ((*a0).*f)(a1);
881 }
882 template <class Ret, class A, class A0, class A1, class A2>
883 inline
884 typename enable_if_c
885 <
886 ! is_base_of<A, typename remove_reference<A0>::type>::value,
887 Ret
888 >::type
889 invoke(Ret (A::*f)(A1, A2) const,
890 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
891 {
892 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
893 }
894 template <class Ret, class A, class A0, class A1, class A2>
895 inline
896 typename enable_if_c
897 <
898 ! is_base_of<A, typename remove_reference<A0>::type>::value,
899 Ret
900 >::type
901 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
902 {
903 return ((*a0).*f)(a1, a2);
904 }
905 template <class Ret, class A, class A0, class A1, class A2, class A3>
906 inline
907 typename enable_if_c
908 <
909 ! is_base_of<A, typename remove_reference<A0>::type>::value,
910 Ret
911 >::type
912 invoke(Ret (A::*f)(A1, A2, A3) const,
913 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
914 {
915 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
916 }
917 template <class Ret, class A, class A0, class A1, class A2, class A3>
918 inline
919 typename enable_if_c
920 <
921 ! is_base_of<A, typename remove_reference<A0>::type>::value,
922 Ret
923 >::type
924 invoke(Ret (A::*f)(A1, A2, A3) const,
925 A0 a0, A1 a1, A2 a2, A3 a3)
926 {
927 return ((*a0).*f)(a1, a2, a3);
928 }
929 ///
930 template <class Ret, class A, class A0>
931 inline
932 typename enable_if_c
933 <
934 ! is_base_of<A, typename remove_reference<A0>::type>::value,
935 Ret
936 >::type
937 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
938 {
939 return ((*boost::forward<A0>(a0)).*f)();
940 }
941 template <class Ret, class A, class A0, class A1>
942 inline
943 typename enable_if_c
944 <
945 ! is_base_of<A, typename remove_reference<A0>::type>::value,
946 Ret
947 >::type
948 invoke(Ret (A::*f)(A1) volatile,
949 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
950 {
951 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
952 }
953 template <class Ret, class A, class A0, class A1>
954 inline
955 typename enable_if_c
956 <
957 ! is_base_of<A, typename remove_reference<A0>::type>::value,
958 Ret
959 >::type
960 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
961 {
962 return ((*a0).*f)(a1);
963 }
964 template <class Ret, class A, class A0, class A1, class A2>
965 inline
966 typename enable_if_c
967 <
968 ! is_base_of<A, typename remove_reference<A0>::type>::value,
969 Ret
970 >::type
971 invoke(Ret (A::*f)(A1, A2) volatile,
972 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
973 {
974 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
975 }
976 template <class Ret, class A, class A0, class A1, class A2>
977 inline
978 typename enable_if_c
979 <
980 ! is_base_of<A, typename remove_reference<A0>::type>::value,
981 Ret
982 >::type
983 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
984 {
985 return ((*a0).*f)(a1, a2);
986 }
987 template <class Ret, class A, class A0, class A1, class A2, class A3>
988 inline
989 typename enable_if_c
990 <
991 ! is_base_of<A, typename remove_reference<A0>::type>::value,
992 Ret
993 >::type
994 invoke(Ret (A::*f)(A1, A2, A3) volatile,
995 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
996 {
997 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
998 }
999 template <class Ret, class A, class A0, class A1, class A2, class A3>
1000 inline
1001 typename enable_if_c
1002 <
1003 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1004 Ret
1005 >::type
1006 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
1007 {
1008 return ((*a0).*f)(a1, a2, a3);
1009 }
1010 ///
1011 template <class Ret, class A, class A0>
1012 inline
1013 typename enable_if_c
1014 <
1015 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1016 Ret
1017 >::type
1018 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
1019 {
1020 return ((*boost::forward<A0>(a0)).*f)();
1021 }
1022 template <class Ret, class A, class A0>
1023 inline
1024 typename enable_if_c
1025 <
1026 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1027 Ret
1028 >::type
1029 invoke(Ret (A::*f)() const volatile, A0 a0)
1030 {
1031 return ((*a0).*f)();
1032 }
1033 template <class Ret, class A, class A0, class A1>
1034 inline
1035 typename enable_if_c
1036 <
1037 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1038 Ret
1039 >::type
1040 invoke(Ret (A::*f)(A1) const volatile,
1041 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1042 {
1043 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1044 }
1045 template <class Ret, class A, class A0, class A1>
1046 inline
1047 typename enable_if_c
1048 <
1049 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1050 Ret
1051 >::type
1052 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
1053 {
1054 return ((*a0).*f)(a1);
1055 }
1056 template <class Ret, class A, class A0, class A1, class A2>
1057 inline
1058 typename enable_if_c
1059 <
1060 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1061 Ret
1062 >::type
1063 invoke(Ret (A::*f)(A1, A2) const volatile,
1064 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1065 {
1066 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1067 }
1068 template <class Ret, class A, class A0, class A1, class A2>
1069 inline
1070 typename enable_if_c
1071 <
1072 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1073 Ret
1074 >::type
1075 invoke(Ret (A::*f)(A1, A2) const volatile,
1076 A0 a0, A1 a1, A2 a2)
1077 {
1078 return ((*a0).*f)(a1, a2);
1079 }
1080 template <class Ret, class A, class A0, class A1, class A2, class A3>
1081 inline
1082 typename enable_if_c
1083 <
1084 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1085 Ret
1086 >::type
1087 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1088 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1089 {
1090 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1091 }
1092 template <class Ret, class A, class A0, class A1, class A2, class A3>
1093 inline
1094 typename enable_if_c
1095 <
1096 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1097 Ret
1098 >::type
1099 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1100 A0 a0, A1 a1, A2 a2, A3 a3)
1101 {
1102 return ((*a0).*f)(a1, a2, a3);
1103 }
1104 // bullet 3
1105 // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
1106 // reference to an object of type T or a reference to an object of a type derived from T;
1107 // template <class Ret, class A, class A0>
1108 // inline
1109 // typename enable_if_c
1110 // <
1111 // is_base_of<A, typename remove_reference<A0>::type>::value,
1112 // typename detail::apply_cv<A0, A>::type&
1113 // >::type
1114 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1115 // {
1116 // return boost::forward<A0>(a0).*f;
1117 // }
1118
1119 // bullet 4
1120 // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
1121 //described in the previous item;
1122
1123 // template <class A0, class Ret, bool>
1124 // struct d4th_helper
1125 // {
1126 // };
1127 //
1128 // template <class A0, class Ret>
1129 // struct d4th_helper<A0, Ret, true>
1130 // {
1131 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
1132 // };
1133 //
1134 // template <class Ret, class A, class A0>
1135 // inline
1136 // typename detail::4th_helper<A, Ret,
1137 // !is_base_of<A,
1138 // typename remove_reference<A0>::type
1139 // >::value
1140 // >::type&
1141 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1142 // {
1143 // return (*boost::forward<A0>(a0)).*f;
1144 // }
1145
1146 // template <class Ret, class A, class A0>
1147 // inline
1148 // typename enable_if_c
1149 // <
1150 // !is_base_of<A, typename remove_reference<A0>::type>::value,
1151 // typename detail::ref_return1<Ret A::*, A0>::type
1152 // >::type
1153 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1154 // {
1155 // return (*boost::forward<A0>(a0)).*f;
1156 // }
1157
1158 // bullet 5
1159 // f(t1, t2, ..., tN) in all other cases.
1160
1161 template <class Ret, class Fp>
1162 inline
1163 typename enable_if_c
1164 <
1165 ! is_member_function_pointer<Fp>::value,
1166 Ret
1167 >::type
1168 invoke(BOOST_THREAD_RV_REF(Fp) f)
1169 {
1170 return boost::forward<Fp>(f)();
1171 }
1172 template <class Ret, class Fp, class A1>
1173 inline
1174 typename enable_if_c
1175 <
1176 ! is_member_function_pointer<Fp>::value,
1177 Ret
1178 >::type
1179 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1180 {
1181 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
1182 }
1183 template <class Ret, class Fp, class A1>
1184 inline
1185 typename enable_if_c
1186 <
1187 ! is_member_function_pointer<Fp>::value,
1188 Ret
1189 >::type
1190 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1)
1191 {
1192 return boost::forward<Fp>(f)(a1);
1193 }
1194 template <class Ret, class Fp, class A1, class A2>
1195 inline
1196 typename enable_if_c
1197 <
1198 ! is_member_function_pointer<Fp>::value,
1199 Ret
1200 >::type
1201 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1202 {
1203 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1204 }
1205 template <class Ret, class Fp, class A1, class A2>
1206 inline
1207 typename enable_if_c
1208 <
1209 ! is_member_function_pointer<Fp>::value,
1210 Ret
1211 >::type
1212 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2)
1213 {
1214 return boost::forward<Fp>(f)(a1, a2);
1215 }
1216 template <class Ret, class Fp, class A1, class A2, class A3>
1217 inline
1218 typename enable_if_c
1219 <
1220 ! is_member_function_pointer<Fp>::value,
1221 Ret
1222 >::type
1223 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1224 {
1225 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1226 }
1227 template <class Ret, class Fp, class A1, class A2, class A3>
1228 inline
1229 typename enable_if_c
1230 <
1231 ! is_member_function_pointer<Fp>::value,
1232 Ret
1233 >::type
1234 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1235 {
1236 return boost::forward<Fp>(f)(a1, a2, a3);
1237 }
1238
1239 ///
1240 template <class Ret, class Fp>
1241 inline
1242 typename enable_if_c
1243 <
1244 ! is_member_function_pointer<Fp>::value,
1245 Ret
1246 >::type
1247 invoke(Fp const &f)
1248 {
1249 return f();
1250 }
1251 template <class Ret, class Fp, class A1>
1252 inline
1253 typename enable_if_c
1254 <
1255 ! is_member_function_pointer<Fp>::value,
1256 Ret
1257 >::type
1258 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1)
1259 {
1260 return f(boost::forward<A1>(a1));
1261 }
1262 template <class Ret, class Fp, class A1>
1263 inline
1264 typename enable_if_c
1265 <
1266 ! is_member_function_pointer<Fp>::value,
1267 Ret
1268 >::type
1269 invoke(Fp const &f, A1 a1)
1270 {
1271 return f(a1);
1272 }
1273 template <class Ret, class Fp, class A1, class A2>
1274 inline
1275 typename enable_if_c
1276 <
1277 ! is_member_function_pointer<Fp>::value,
1278 Ret
1279 >::type
1280 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1281 {
1282 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1283 }
1284 template <class Ret, class Fp, class A1, class A2>
1285 inline
1286 typename enable_if_c
1287 <
1288 ! is_member_function_pointer<Fp>::value,
1289 Ret
1290 >::type
1291 invoke(Fp const &f, A1 a1, A2 a2)
1292 {
1293 return f(a1, a2);
1294 }
1295 template <class Ret, class Fp, class A1, class A2, class A3>
1296 inline
1297 typename enable_if_c
1298 <
1299 ! is_member_function_pointer<Fp>::value,
1300 Ret
1301 >::type
1302 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1303 {
1304 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1305 }
1306 template <class Ret, class Fp, class A1, class A2, class A3>
1307 inline
1308 typename enable_if_c
1309 <
1310 ! is_member_function_pointer<Fp>::value,
1311 Ret
1312 >::type
1313 invoke(Fp const &f, A1 a1, A2 a2, A3 a3)
1314 {
1315 return f(a1, a2, a3);
1316 }
1317 ///
1318
1319 template <class Ret>
1320 inline Ret
1321 invoke(Ret(*f)())
1322 {
1323 return f();
1324 }
1325 template <class Ret, class A1>
1326 inline Ret
1327 invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1)
1328 {
1329 return f(boost::forward<A1>(a1));
1330 }
1331 template <class Ret, class A1, class A2>
1332 inline Ret
1333 invoke(Ret(*f)(A1, A2),
1334 BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1335 {
1336 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1337 }
1338 template <class Ret, class A1, class A2, class A3>
1339 inline Ret
1340 invoke(Ret(*f)(A1, A2, A3),
1341 BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1342 {
1343 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1344 }
1345 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
1346
1347 #endif // all
1348 }
1349 }
1350
1351 #endif // header