1 // Copyright (C) 2012-2013 Vicente J. Botet Escriba
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)
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
15 //===----------------------------------------------------------------------===//
17 // The LLVM Compiler Infrastructure
19 // This file is dual licensed under the MIT and the University of Illinois Open
20 // Source Licenses. See LICENSE.TXT for details.
22 // The invoke code is based on the one from libcxx.
23 //===----------------------------------------------------------------------===//
25 #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
26 #define BOOST_THREAD_DETAIL_INVOKE_HPP
28 #include <boost/config.hpp>
29 #include <boost/static_assert.hpp>
30 #include <boost/thread/detail/move.hpp>
31 #include <boost/core/enable_if.hpp>
32 #include <boost/mpl/bool.hpp>
33 #include <boost/type_traits/is_base_of.hpp>
34 #include <boost/type_traits/is_pointer.hpp>
35 #include <boost/type_traits/is_member_function_pointer.hpp>
36 #include <boost/type_traits/remove_reference.hpp>
37 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
47 #if ! defined(BOOST_NO_SFINAE_EXPR) && \
48 ! defined(BOOST_NO_CXX11_DECLTYPE) && \
49 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
50 ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
52 #define BOOST_THREAD_PROVIDES_INVOKE
54 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
57 template <class Fp, class A0, class ...Args>
59 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
60 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
62 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
64 template <class R, class Fp, class A0, class ...Args>
66 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
67 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
69 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
72 template <class Fp, class A0, class ...Args>
74 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
75 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
77 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
79 template <class R, class Fp, class A0, class ...Args>
81 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
82 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
84 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
89 template <class Fp, class A0>
91 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
92 -> decltype(boost::forward<A0>(a0).*f)
94 return boost::forward<A0>(a0).*f;
97 template <class Fp, class A0>
99 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
100 -> decltype((*boost::forward<A0>(a0)).*f)
102 return (*boost::forward<A0>(a0)).*f;
105 template <class R, class Fp, class A0>
107 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
108 -> decltype(boost::forward<A0>(a0).*f)
110 return boost::forward<A0>(a0).*f;
113 template <class R, class Fp, class A0>
115 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
116 -> decltype((*boost::forward<A0>(a0)).*f)
118 return (*boost::forward<A0>(a0)).*f;
124 template <class R, class Fp, class ...Args>
125 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
126 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
128 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
130 template <class Fp, class ...Args>
131 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
132 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
134 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
137 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
141 template <class Fp, class A0>
144 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
145 -> decltype((boost::forward<A0>(a0).*f)())
147 return (boost::forward<A0>(a0).*f)();
149 template <class R, class Fp, class A0>
152 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
153 -> decltype((boost::forward<A0>(a0).*f)())
155 return (boost::forward<A0>(a0).*f)();
157 template <class Fp, class A0, class A1>
160 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
161 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
163 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
165 template <class R, class Fp, class A0, class A1>
168 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
169 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
171 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
173 template <class Fp, class A0, class A1, class A2>
176 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)
177 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
179 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
181 template <class R, class Fp, class A0, class A1, class A2>
184 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)
185 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
187 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
190 template <class Fp, class A0>
193 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
194 -> decltype(((*boost::forward<A0>(a0)).*f)())
196 return ((*boost::forward<A0>(a0)).*f)();
198 template <class R, class Fp, class A0>
201 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
202 -> decltype(((*boost::forward<A0>(a0)).*f)())
204 return ((*boost::forward<A0>(a0)).*f)();
206 template <class Fp, class A0, class A1>
209 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
210 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
212 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
214 template <class R, class Fp, class A0, class A1>
217 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
218 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
220 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
222 template <class Fp, class A0, class A1, class A2>
225 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)
226 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
228 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
230 template <class R, class Fp, class A0, class A1, class A2>
233 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)
234 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
236 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
241 template <class Fp, class A0>
244 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
245 -> decltype(boost::forward<A0>(a0).*f)
247 return boost::forward<A0>(a0).*f;
249 template <class R, class Fp, class A0>
252 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
253 -> decltype(boost::forward<A0>(a0).*f)
255 return boost::forward<A0>(a0).*f;
258 template <class Fp, class A0>
261 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
262 -> decltype((*boost::forward<A0>(a0)).*f)
264 return (*boost::forward<A0>(a0)).*f;
266 template <class R, class Fp, class A0>
269 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
270 -> decltype((*boost::forward<A0>(a0)).*f)
272 return (*boost::forward<A0>(a0)).*f;
279 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
280 -> decltype(boost::forward<Fp>(f)())
282 return boost::forward<Fp>(f)();
284 template <class Fp, class A1>
286 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
287 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
289 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
290 } template <class Fp, class A1, class A2>
292 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
293 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
295 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
297 template <class Fp, class A1, class A2, class A3>
299 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)
300 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
302 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
306 template <class R, class Fp>
308 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
309 -> decltype(boost::forward<Fp>(f)())
311 return boost::forward<Fp>(f)();
313 template <class R, class Fp, class A1>
315 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
316 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
318 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
320 template <class R, class Fp, class A1, class A2>
322 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
323 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
325 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
327 template <class R, class Fp, class A1, class A2, class A3>
329 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)
330 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
332 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
335 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
337 #elif ! defined(BOOST_NO_SFINAE_EXPR) && \
338 ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
341 template <class Ret, class Fp>
343 Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
347 template <class Ret, class Fp, class A1>
349 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
351 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
353 template <class Ret, class Fp, class A1, class A2>
355 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
357 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
359 template <class Ret, class Fp, class A1, class A2, class A3>
361 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)
363 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
366 #define BOOST_THREAD_PROVIDES_INVOKE_RET
368 #elif ! defined BOOST_MSVC
369 //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET
370 #define BOOST_THREAD_PROVIDES_INVOKE_RET
372 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
375 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
376 // type T or a reference to an object of type T or a reference to an object of a type derived from T
377 template <class Ret, class A, class A0, class ...Args>
381 is_base_of<A, typename remove_reference<A0>::type>::value,
384 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
386 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
389 template <class Ret, class A, class A0, class ...Args>
393 is_base_of<A, typename remove_reference<A0>::type>::value,
396 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
398 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
401 template <class Ret, class A, class A0, class ...Args>
405 is_base_of<A, typename remove_reference<A0>::type>::value,
408 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
410 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
413 template <class Ret, class A, class A0, class ...Args>
417 is_base_of<A, typename remove_reference<A0>::type>::value,
420 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
422 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
426 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
427 // the types described in the previous item;
428 template <class Ret, class A, class A0, class ...Args>
432 ! is_base_of<A, typename remove_reference<A0>::type>::value,
435 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
437 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
440 template <class Ret, class A, class A0, class ...Args>
444 ! is_base_of<A, typename remove_reference<A0>::type>::value,
447 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
449 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
452 template <class Ret, class A, class A0, class ...Args>
456 ! is_base_of<A, typename remove_reference<A0>::type>::value,
459 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
461 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
464 template <class Ret, class A, class A0, class ...Args>
468 ! is_base_of<A, typename remove_reference<A0>::type>::value,
471 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
473 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
477 // 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
478 // reference to an object of type T or a reference to an object of a type derived from T;
479 // template <class Ret, class A, class A0>
481 // typename enable_if_c
483 // is_base_of<A, typename remove_reference<A0>::type>::value,
484 // typename detail::apply_cv<A0, A>::type&
486 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
488 // return boost::forward<A0>(a0).*f;
492 // (*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
493 //described in the previous item;
495 // template <class A0, class Ret, bool>
496 // struct d4th_helper
500 // template <class A0, class Ret>
501 // struct d4th_helper<A0, Ret, true>
503 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
506 // template <class Ret, class A, class A0>
508 // typename detail::4th_helper<A, Ret,
510 // typename remove_reference<A0>::type
513 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
515 // return (*boost::forward<A0>(a0)).*f;
518 // template <class Ret, class A, class A0>
520 // typename enable_if_c
522 // !is_base_of<A, typename remove_reference<A0>::type>::value,
523 // typename detail::ref_return1<Ret A::*, A0>::type
525 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
527 // return (*boost::forward<A0>(a0)).*f;
531 // f(t1, t2, ..., tN) in all other cases.
533 template <class Ret, class Fp, class ...Args>
534 inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
536 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
539 template <class Ret, class Fp, class ...Args>
540 inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
542 return f(boost::forward<Args>(args)...);
545 template <class Ret, class Fp, class ...Args>
547 typename disable_if_c
549 is_member_function_pointer<Fp>::value,
552 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
554 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<Args>(args)...);
556 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
558 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
559 // type T or a reference to an object of type T or a reference to an object of a type derived from T
561 template <class Ret, class A, class A0>
565 is_base_of<A, typename remove_reference<A0>::type>::value,
568 invoke(Ret (A::*f)(), A0& a0)
572 template <class Ret, class A, class A0>
576 is_base_of<A, typename remove_reference<A0>::type>::value,
579 invoke(Ret (A::*f)(), A0* a0)
584 template <class Ret, class A, class A0, class A1>
588 is_base_of<A, typename remove_reference<A0>::type>::value,
591 invoke(Ret (A::*f)(A1),
592 A0& a0, BOOST_THREAD_RV_REF(A1) a1
595 return (a0.*f)(boost::forward<A1>(a1));
597 template <class Ret, class A, class A0, class A1>
601 is_base_of<A, typename remove_reference<A0>::type>::value,
604 invoke(Ret (A::*f)(A1), A0& a0, A1 a1)
608 template <class Ret, class A, class A0, class A1>
612 is_base_of<A, typename remove_reference<A0>::type>::value,
615 invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1
618 return (*(a0).*f)(boost::forward<A1>(a1));
620 template <class Ret, class A, class A0, class A1>
624 is_base_of<A, typename remove_reference<A0>::type>::value,
627 invoke(Ret (A::*f)(A1), A0* a0, A1 a1)
631 template <class Ret, class A, class A0, class A1, class A2>
635 is_base_of<A, typename remove_reference<A0>::type>::value,
638 invoke(Ret (A::*f)(A1, A2),
639 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
642 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
644 template <class Ret, class A, class A0, class A1, class A2>
648 is_base_of<A, typename remove_reference<A0>::type>::value,
651 invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2)
653 return ((*a0).*f)(a1, a2);
655 template <class Ret, class A, class A0, class A1, class A2, class A3>
659 is_base_of<A, typename remove_reference<A0>::type>::value,
662 invoke(Ret (A::*f)(A1, A2, A3),
663 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
665 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
667 template <class Ret, class A, class A0, class A1, class A2, class A3>
671 is_base_of<A, typename remove_reference<A0>::type>::value,
674 invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3)
676 return ((*a0).*f)(a1, a2, a3);
680 template <class Ret, class A, class A0>
684 is_base_of<A, typename remove_reference<A0>::type>::value,
687 invoke(Ret (A::*f)() const, A0 const& a0)
691 template <class Ret, class A, class A0>
695 is_base_of<A, typename remove_reference<A0>::type>::value,
698 invoke(Ret (A::*f)() const, A0 const* a0)
702 template <class Ret, class A, class A0, class A1>
706 is_base_of<A, typename remove_reference<A0>::type>::value,
709 invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1)
711 return (a0.*f)(boost::forward<A1>(a1));
713 template <class Ret, class A, class A0, class A1>
717 is_base_of<A, typename remove_reference<A0>::type>::value,
720 invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1)
722 return ((*a0).*f)(boost::forward<A1>(a1));
725 template <class Ret, class A, class A0, class A1>
729 is_base_of<A, typename remove_reference<A0>::type>::value,
732 invoke(Ret (A::*f)(A1) const, A0 const& a0, A1 a1)
736 template <class Ret, class A, class A0, class A1, class A2>
740 is_base_of<A, typename remove_reference<A0>::type>::value,
743 invoke(Ret (A::*f)(A1, A2) const,
744 A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
747 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
750 template <class Ret, class A, class A0, class A1, class A2>
754 is_base_of<A, typename remove_reference<A0>::type>::value,
757 invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2)
759 return (a0.*f)(a1, a2);
761 template <class Ret, class A, class A0, class A1, class A2, class A3>
765 is_base_of<A, typename remove_reference<A0>::type>::value,
768 invoke(Ret (A::*f)(A1, A2, A3) const,
769 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
772 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
774 template <class Ret, class A, class A0, class A1, class A2, class A3>
778 is_base_of<A, typename remove_reference<A0>::type>::value,
781 invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
783 return (a0.*f)(a1, a2, a3);
786 template <class Ret, class A, class A0>
790 is_base_of<A, typename remove_reference<A0>::type>::value,
793 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
795 return (boost::forward<A0>(a0).*f)();
797 template <class Ret, class A, class A0, class A1>
801 is_base_of<A, typename remove_reference<A0>::type>::value,
804 invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
806 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
808 template <class Ret, class A, class A0, class A1>
812 is_base_of<A, typename remove_reference<A0>::type>::value,
815 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
819 template <class Ret, class A, class A0, class A1, class A2>
823 is_base_of<A, typename remove_reference<A0>::type>::value,
826 invoke(Ret (A::*f)(A1, A2) volatile,
827 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
829 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
831 template <class Ret, class A, class A0, class A1, class A2>
835 is_base_of<A, typename remove_reference<A0>::type>::value,
838 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
840 return (a0.*f)(a1, a2);
842 template <class Ret, class A, class A0, class A1, class A2, class A3>
846 is_base_of<A, typename remove_reference<A0>::type>::value,
849 invoke(Ret (A::*f)(A1, A2, A3) volatile,
850 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
853 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
855 template <class Ret, class A, class A0, class A1, class A2, class A3>
859 is_base_of<A, typename remove_reference<A0>::type>::value,
862 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
864 return (a0.*f)(a1, a2, a3);
867 template <class Ret, class A, class A0>
871 is_base_of<A, typename remove_reference<A0>::type>::value,
874 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
876 return (boost::forward<A0>(a0).*f)();
878 template <class Ret, class A, class A0, class A1>
882 is_base_of<A, typename remove_reference<A0>::type>::value,
885 invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
887 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
889 template <class Ret, class A, class A0, class A1>
893 is_base_of<A, typename remove_reference<A0>::type>::value,
896 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
900 template <class Ret, class A, class A0, class A1, class A2>
904 is_base_of<A, typename remove_reference<A0>::type>::value,
907 invoke(Ret (A::*f)(A1, A2) const volatile,
908 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
911 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
913 template <class Ret, class A, class A0, class A1, class A2>
917 is_base_of<A, typename remove_reference<A0>::type>::value,
920 invoke(Ret (A::*f)(A1, A2) const volatile,
924 return (a0.*f)(a1, a2);
926 template <class Ret, class A, class A0, class A1, class A2, class A3>
930 is_base_of<A, typename remove_reference<A0>::type>::value,
933 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
934 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
937 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
939 template <class Ret, class A, class A0, class A1, class A2, class A3>
943 is_base_of<A, typename remove_reference<A0>::type>::value,
946 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
947 A0 a0, A1 a1, A2 a2, A3 a3
950 return (a0.*f)(a1, a2, a3);
954 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
955 // the types described in the previous item;
956 template <class Ret, class A, class A0>
960 ! is_base_of<A, typename remove_reference<A0>::type>::value,
963 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
965 return ((*boost::forward<A0>(a0)).*f)();
967 template <class Ret, class A, class A0, class A1>
971 ! is_base_of<A, typename remove_reference<A0>::type>::value,
974 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
976 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
978 template <class Ret, class A, class A0, class A1>
982 ! is_base_of<A, typename remove_reference<A0>::type>::value,
985 invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
987 return ((*a0).*f)(a1);
989 template <class Ret, class A, class A0, class A1, class A2>
993 ! is_base_of<A, typename remove_reference<A0>::type>::value,
996 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
997 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
999 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1001 template <class Ret, class A, class A0, class A1, class A2>
1003 typename enable_if_c
1005 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1008 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
1010 return ((*a0).*f)(a1, a2);
1012 template <class Ret, class A, class A0, class A1, class A2, class A3>
1014 typename enable_if_c
1016 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1019 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
1020 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1022 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
1025 template <class Ret, class A, class A0, class A1, class A2, class A3>
1027 typename enable_if_c
1029 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1032 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
1034 return ((*a0).*f)(a1, a2, a3);
1038 template <class Ret, class A, class A0>
1040 typename enable_if_c
1042 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1045 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
1047 return ((*boost::forward<A0>(a0)).*f)();
1049 template <class Ret, class A, class A0, class A1>
1051 typename enable_if_c
1053 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1056 invoke(Ret (A::*f)(A1) const,
1057 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1059 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1061 template <class Ret, class A, class A0, class A1>
1063 typename enable_if_c
1065 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1068 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
1070 return ((*boost::forward<A0>(a0)).*f)(a1);
1072 template <class Ret, class A, class A0, class A1>
1074 typename enable_if_c
1076 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1079 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
1081 return ((*a0).*f)(a1);
1083 template <class Ret, class A, class A0, class A1, class A2>
1085 typename enable_if_c
1087 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1090 invoke(Ret (A::*f)(A1, A2) const,
1091 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1093 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1095 template <class Ret, class A, class A0, class A1, class A2>
1097 typename enable_if_c
1099 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1102 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
1104 return ((*a0).*f)(a1, a2);
1106 template <class Ret, class A, class A0, class A1, class A2, class A3>
1108 typename enable_if_c
1110 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1113 invoke(Ret (A::*f)(A1, A2, A3) const,
1114 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1116 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1118 template <class Ret, class A, class A0, class A1, class A2, class A3>
1120 typename enable_if_c
1122 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1125 invoke(Ret (A::*f)(A1, A2, A3) const,
1126 A0 a0, A1 a1, A2 a2, A3 a3)
1128 return ((*a0).*f)(a1, a2, a3);
1131 template <class Ret, class A, class A0>
1133 typename enable_if_c
1135 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1138 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
1140 return ((*boost::forward<A0>(a0)).*f)();
1142 template <class Ret, class A, class A0, class A1>
1144 typename enable_if_c
1146 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1149 invoke(Ret (A::*f)(A1) volatile,
1150 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1152 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1154 template <class Ret, class A, class A0, class A1>
1156 typename enable_if_c
1158 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1161 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
1163 return ((*a0).*f)(a1);
1165 template <class Ret, class A, class A0, class A1, class A2>
1167 typename enable_if_c
1169 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1172 invoke(Ret (A::*f)(A1, A2) volatile,
1173 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1175 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1177 template <class Ret, class A, class A0, class A1, class A2>
1179 typename enable_if_c
1181 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1184 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
1186 return ((*a0).*f)(a1, a2);
1188 template <class Ret, class A, class A0, class A1, class A2, class A3>
1190 typename enable_if_c
1192 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1195 invoke(Ret (A::*f)(A1, A2, A3) volatile,
1196 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1198 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1200 template <class Ret, class A, class A0, class A1, class A2, class A3>
1202 typename enable_if_c
1204 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1207 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
1209 return ((*a0).*f)(a1, a2, a3);
1212 template <class Ret, class A, class A0>
1214 typename enable_if_c
1216 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1219 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
1221 return ((*boost::forward<A0>(a0)).*f)();
1223 template <class Ret, class A, class A0>
1225 typename enable_if_c
1227 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1230 invoke(Ret (A::*f)() const volatile, A0 a0)
1232 return ((*a0).*f)();
1234 template <class Ret, class A, class A0, class A1>
1236 typename enable_if_c
1238 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1241 invoke(Ret (A::*f)(A1) const volatile,
1242 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1244 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1246 template <class Ret, class A, class A0, class A1>
1248 typename enable_if_c
1250 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1253 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
1255 return ((*a0).*f)(a1);
1257 template <class Ret, class A, class A0, class A1, class A2>
1259 typename enable_if_c
1261 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1264 invoke(Ret (A::*f)(A1, A2) const volatile,
1265 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1267 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1269 template <class Ret, class A, class A0, class A1, class A2>
1271 typename enable_if_c
1273 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1276 invoke(Ret (A::*f)(A1, A2) const volatile,
1277 A0 a0, A1 a1, A2 a2)
1279 return ((*a0).*f)(a1, a2);
1281 template <class Ret, class A, class A0, class A1, class A2, class A3>
1283 typename enable_if_c
1285 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1288 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1289 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1291 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1293 template <class Ret, class A, class A0, class A1, class A2, class A3>
1295 typename enable_if_c
1297 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1300 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1301 A0 a0, A1 a1, A2 a2, A3 a3)
1303 return ((*a0).*f)(a1, a2, a3);
1306 // 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
1307 // reference to an object of type T or a reference to an object of a type derived from T;
1308 // template <class Ret, class A, class A0>
1310 // typename enable_if_c
1312 // is_base_of<A, typename remove_reference<A0>::type>::value,
1313 // typename detail::apply_cv<A0, A>::type&
1315 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1317 // return boost::forward<A0>(a0).*f;
1321 // (*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
1322 //described in the previous item;
1324 // template <class A0, class Ret, bool>
1325 // struct d4th_helper
1329 // template <class A0, class Ret>
1330 // struct d4th_helper<A0, Ret, true>
1332 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
1335 // template <class Ret, class A, class A0>
1337 // typename detail::4th_helper<A, Ret,
1339 // typename remove_reference<A0>::type
1342 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1344 // return (*boost::forward<A0>(a0)).*f;
1347 // template <class Ret, class A, class A0>
1349 // typename enable_if_c
1351 // !is_base_of<A, typename remove_reference<A0>::type>::value,
1352 // typename detail::ref_return1<Ret A::*, A0>::type
1354 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1356 // return (*boost::forward<A0>(a0)).*f;
1360 // f(t1, t2, ..., tN) in all other cases.
1362 template <class Ret, class Fp>
1363 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f)
1365 return boost::forward<Fp>(f)();
1367 template <class Ret, class Fp>
1368 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f)
1372 template <class Ret, class Fp>
1374 typename disable_if_c
1376 is_member_function_pointer<Fp>::value,
1379 invoke(BOOST_THREAD_FWD_REF(Fp) f)
1381 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f));
1384 template <class Ret, class Fp, class A1>
1385 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1387 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
1389 template <class Ret, class Fp, class A1>
1390 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1392 return f(boost::forward<A1>(a1));
1394 template <class Ret, class Fp, class A1>
1396 typename disable_if_c
1398 is_member_function_pointer<Fp>::value,
1401 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1403 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1));
1406 template <class Ret, class Fp, class A1, class A2>
1407 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1409 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1411 template <class Ret, class Fp, class A1, class A2>
1412 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1414 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1416 template <class Ret, class Fp, class A1, class A2>
1418 typename disable_if_c
1420 is_member_function_pointer<Fp>::value,
1423 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1425 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2));
1428 template <class Ret, class Fp, class A1, class A2, class A3>
1429 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1431 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1433 template <class Ret, class Fp, class A1, class A2, class A3>
1434 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1436 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1438 template <class Ret, class Fp, class A1, class A2, class A3>
1440 typename disable_if_c
1442 is_member_function_pointer<Fp>::value,
1445 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1447 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1451 template <class Ret, class Fp, class A1>
1452 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1454 return boost::forward<Fp>(f)(a1);
1456 template <class Ret, class Fp, class A1>
1457 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1461 template <class Ret, class Fp, class A1>
1463 typename disable_if_c
1465 is_member_function_pointer<Fp>::value,
1468 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1470 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1);
1473 template <class Ret, class Fp, class A1, class A2>
1474 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1476 return boost::forward<Fp>(f)(a1, a2);
1478 template <class Ret, class Fp, class A1, class A2>
1479 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1483 template <class Ret, class Fp, class A1, class A2>
1485 typename disable_if_c
1487 is_member_function_pointer<Fp>::value,
1490 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1492 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2);
1495 template <class Ret, class Fp, class A1, class A2, class A3>
1496 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1498 return boost::forward<Fp>(f)(a1, a2, a3);
1500 template <class Ret, class Fp, class A1, class A2, class A3>
1501 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1503 return f(a1, a2, a3);
1505 template <class Ret, class Fp, class A1, class A2, class A3>
1507 typename disable_if_c
1509 is_member_function_pointer<Fp>::value,
1512 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1514 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2, a3);
1519 template <class Ret, class Fp>
1521 typename disable_if_c
1523 is_member_function_pointer<Fp>::value,
1530 template <class Ret, class Fp, class A1>
1532 typename disable_if_c
1534 is_member_function_pointer<Fp>::value,
1537 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1)
1539 return f(boost::forward<A1>(a1));
1541 template <class Ret, class Fp, class A1>
1543 typename disable_if_c
1545 is_member_function_pointer<Fp>::value,
1548 invoke(Fp &f, A1 a1)
1552 template <class Ret, class Fp, class A1, class A2>
1554 typename disable_if_c
1556 is_member_function_pointer<Fp>::value,
1559 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1561 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1563 template <class Ret, class Fp, class A1, class A2>
1565 typename disable_if_c
1567 is_member_function_pointer<Fp>::value,
1570 invoke(Fp &f, A1 a1, A2 a2)
1574 template <class Ret, class Fp, class A1, class A2, class A3>
1576 typename disable_if_c
1578 is_member_function_pointer<Fp>::value,
1581 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1583 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1585 template <class Ret, class Fp, class A1, class A2, class A3>
1587 typename disable_if_c
1589 is_member_function_pointer<Fp>::value,
1592 invoke(Fp &f, A1 a1, A2 a2, A3 a3)
1594 return f(a1, a2, a3);
1598 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES