Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp Fri Sep 04 12:01:02 2015 +0100 +++ b/DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp Mon Sep 07 11:12:49 2015 +0100 @@ -28,7 +28,11 @@ #include <boost/config.hpp> #include <boost/static_assert.hpp> #include <boost/thread/detail/move.hpp> +#include <boost/core/enable_if.hpp> +#include <boost/mpl/bool.hpp> #include <boost/type_traits/is_base_of.hpp> +#include <boost/type_traits/is_pointer.hpp> +#include <boost/type_traits/is_member_function_pointer.hpp> #include <boost/type_traits/remove_reference.hpp> #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL #include <functional> @@ -40,11 +44,10 @@ { -#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \ - ! defined(BOOST_NO_SFINAE_EXPR) && \ +#if ! defined(BOOST_NO_SFINAE_EXPR) && \ ! defined(BOOST_NO_CXX11_DECLTYPE) && \ ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \ - ! defined(BOOST_NO_CXX11_AUTO) + ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES) #define BOOST_THREAD_PROVIDES_INVOKE @@ -58,6 +61,13 @@ { return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); } + template <class R, class Fp, class A0, class ...Args> + inline auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) + -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...)) + { + return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); + } template <class Fp, class A0, class ...Args> inline auto @@ -66,6 +76,13 @@ { return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); } + template <class R, class Fp, class A0, class ...Args> + inline auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) + -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...)) + { + return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); + } // bullets 3 and 4 @@ -85,14 +102,38 @@ return (*boost::forward<A0>(a0)).*f; } + template <class R, class Fp, class A0> + inline auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype(boost::forward<A0>(a0).*f) + { + return boost::forward<A0>(a0).*f; + } + + template <class R, class Fp, class A0> + inline auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype((*boost::forward<A0>(a0)).*f) + { + return (*boost::forward<A0>(a0)).*f; + } + + // bullet 5 + template <class R, class Fp, class ...Args> + inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) + -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...)) + { + return boost::forward<Fp>(f)(boost::forward<Args>(args)...); + } template <class Fp, class ...Args> inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...)) { return boost::forward<Fp>(f)(boost::forward<Args>(args)...); } + #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES // bullets 1 and 2 @@ -105,21 +146,45 @@ { return (boost::forward<A0>(a0).*f)(); } + template <class R, class Fp, class A0> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype((boost::forward<A0>(a0).*f)()) + { + return (boost::forward<A0>(a0).*f)(); + } template <class Fp, class A0, class A1> inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1))) + -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1))) { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)); + return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); + } + template <class R, class Fp, class A0, class A1> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) + -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1))) + { + return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); } template <class Fp, class A0, class A1, class A2> inline auto 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) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2))) + -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); + return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); + } + template <class R, class Fp, class A0, class A1, class A2> + inline + auto + 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) + -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) + { + return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); } template <class Fp, class A0> @@ -130,21 +195,45 @@ { return ((*boost::forward<A0>(a0)).*f)(); } + template <class R, class Fp, class A0> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype(((*boost::forward<A0>(a0)).*f)()) + { + return ((*boost::forward<A0>(a0)).*f)(); + } template <class Fp, class A0, class A1> inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1))) + -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1))) { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)); + return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); } - template <class Fp, class A0, class A1> + template <class R, class Fp, class A0, class A1> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) + -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1))) + { + return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); + } + template <class Fp, class A0, class A1, class A2> inline auto 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) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2))) + -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); + return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); + } + template <class R, class Fp, class A0, class A1, class A2> + inline + auto + 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) + -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) + { + return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); } // bullets 3 and 4 @@ -157,6 +246,14 @@ { return boost::forward<A0>(a0).*f; } + template <class R, class Fp, class A0> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype(boost::forward<A0>(a0).*f) + { + return boost::forward<A0>(a0).*f; + } template <class Fp, class A0> inline @@ -166,6 +263,14 @@ { return (*boost::forward<A0>(a0)).*f; } + template <class R, class Fp, class A0> + inline + auto + invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) + -> decltype((*boost::forward<A0>(a0)).*f) + { + return (*boost::forward<A0>(a0)).*f; + } // bullet 5 @@ -178,7 +283,7 @@ } template <class Fp, class A1> inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1) + auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) { return boost::forward<Fp>(f)(boost::forward<A1>(a1)); @@ -197,6 +302,36 @@ return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); } + + template <class R, class Fp> + inline + auto invoke(BOOST_THREAD_RV_REF(Fp) f) + -> decltype(boost::forward<Fp>(f)()) + { + return boost::forward<Fp>(f)(); + } + template <class R, class Fp, class A1> + inline + auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) + -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) + { + return boost::forward<Fp>(f)(boost::forward<A1>(a1)); + } + template <class R, class Fp, class A1, class A2> + inline + auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) + { + return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); + } + template <class R, class Fp, class A1, class A2, class A3> + inline + 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) + -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))) + { + return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); + } + #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES #elif ! defined(BOOST_NO_SFINAE_EXPR) && \ @@ -396,21 +531,27 @@ // f(t1, t2, ..., tN) in all other cases. template <class Ret, class Fp, class ...Args> + inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) + { + return boost::forward<Fp>(f)(boost::forward<Args>(args)...); + } + + template <class Ret, class Fp, class ...Args> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) + { + return f(boost::forward<Args>(args)...); + } + + template <class Ret, class Fp, class ...Args> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) { - return boost::forward<Fp>(f)(boost::forward<Args>(args)...); - } - template <class Ret, class ...Args> - inline Ret - invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args) - { - return f(boost::forward<Args>(args)...); + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<Args>(args)...); } #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES // bullet 1 @@ -424,9 +565,34 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) + invoke(Ret (A::*f)(), A0& a0) { - return (boost::forward<A0>(a0).*f)(); + return (a0.*f)(); + } + template <class Ret, class A, class A0> + inline + typename enable_if_c + < + is_base_of<A, typename remove_reference<A0>::type>::value, + Ret + >::type + invoke(Ret (A::*f)(), A0* a0) + { + return ((*a0).*f)(); + } + + template <class Ret, class A, class A0, class A1> + inline + typename enable_if_c + < + is_base_of<A, typename remove_reference<A0>::type>::value, + Ret + >::type + invoke(Ret (A::*f)(A1), + A0& a0, BOOST_THREAD_RV_REF(A1) a1 + ) + { + return (a0.*f)(boost::forward<A1>(a1)); } template <class Ret, class A, class A0, class A1> inline @@ -435,9 +601,9 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) + invoke(Ret (A::*f)(A1), A0& a0, A1 a1) { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); + return (a0.*f)(a1); } template <class Ret, class A, class A0, class A1> inline @@ -446,9 +612,21 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1), A0 a0, A1 a1) + invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1 + ) { - return (a0.*f)(a1); + return (*(a0).*f)(boost::forward<A1>(a1)); + } + template <class Ret, class A, class A0, class A1> + inline + typename enable_if_c + < + is_base_of<A, typename remove_reference<A0>::type>::value, + Ret + >::type + invoke(Ret (A::*f)(A1), A0* a0, A1 a1) + { + return (*a0.*f)(a1); } template <class Ret, class A, class A0, class A1, class A2> inline @@ -458,10 +636,10 @@ Ret >::type invoke(Ret (A::*f)(A1, A2), - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 + A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 ) { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); + return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); } template <class Ret, class A, class A0, class A1, class A2> inline @@ -470,9 +648,9 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) + invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2) { - return (a0.*f)(a1, a2); + return ((*a0).*f)(a1, a2); } template <class Ret, class A, class A0, class A1, class A2, class A3> inline @@ -482,9 +660,9 @@ Ret >::type invoke(Ret (A::*f)(A1, A2, A3), - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) + A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); + return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); } template <class Ret, class A, class A0, class A1, class A2, class A3> inline @@ -493,9 +671,9 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) + invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3) { - return (a0.*f)(a1, a2, a3); + return ((*a0).*f)(a1, a2, a3); } /// @@ -506,9 +684,20 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) + invoke(Ret (A::*f)() const, A0 const& a0) { - return (boost::forward<A0>(a0).*f)(); + return (a0.*f)(); + } + template <class Ret, class A, class A0> + inline + typename enable_if_c + < + is_base_of<A, typename remove_reference<A0>::type>::value, + Ret + >::type + invoke(Ret (A::*f)() const, A0 const* a0) + { + return ((*a0).*f)(); } template <class Ret, class A, class A0, class A1> inline @@ -517,9 +706,9 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) + invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1) { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); + return (a0.*f)(boost::forward<A1>(a1)); } template <class Ret, class A, class A0, class A1> inline @@ -528,7 +717,19 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) + invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1) + { + return ((*a0).*f)(boost::forward<A1>(a1)); + } + + template <class Ret, class A, class A0, class A1> + inline + typename enable_if_c + < + is_base_of<A, typename remove_reference<A0>::type>::value, + Ret + >::type + invoke(Ret (A::*f)(A1) const, A0 const& a0, A1 a1) { return (a0.*f)(a1); } @@ -540,7 +741,7 @@ Ret >::type invoke(Ret (A::*f)(A1, A2) const, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 + A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 ) { return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2) @@ -553,7 +754,7 @@ is_base_of<A, typename remove_reference<A0>::type>::value, Ret >::type - invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) + invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2) { return (a0.*f)(a1, a2); } @@ -1159,189 +1360,241 @@ // f(t1, t2, ..., tN) in all other cases. template <class Ret, class Fp> - inline - typename enable_if_c - < - ! is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f) + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f) { return boost::forward<Fp>(f)(); } - template <class Ret, class Fp, class A1> + template <class Ret, class Fp> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f) + { + return f(); + } + template <class Ret, class Fp> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) + invoke(BOOST_THREAD_FWD_REF(Fp) f) + { + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f)); + } + + template <class Ret, class Fp, class A1> + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) { return boost::forward<Fp>(f)(boost::forward<A1>(a1)); } template <class Ret, class Fp, class A1> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) + { + return f(boost::forward<A1>(a1)); + } + template <class Ret, class Fp, class A1> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1) + invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) { - return boost::forward<Fp>(f)(a1); + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1)); } + template <class Ret, class Fp, class A1, class A2> - inline - typename enable_if_c - < - ! is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) { return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); } template <class Ret, class Fp, class A1, class A2> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + { + return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); + } + template <class Ret, class Fp, class A1, class A2> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2) + invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) { - return boost::forward<Fp>(f)(a1, a2); + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)); } + template <class Ret, class Fp, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_member_function_pointer<Fp>::value, - Ret - >::type - 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) + 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) { return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); } template <class Ret, class Fp, class A1, class A2, class A3> + 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) + { + return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); + } + template <class Ret, class Fp, class A1, class A2, class A3> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3) + 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) + { + 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)); + } + + + template <class Ret, class Fp, class A1> + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return boost::forward<Fp>(f)(a1); + } + template <class Ret, class Fp, class A1> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return f(a1); + } + template <class Ret, class Fp, class A1> + inline + typename disable_if_c + < + is_member_function_pointer<Fp>::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1); + } + + template <class Ret, class Fp, class A1, class A2> + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return boost::forward<Fp>(f)(a1, a2); + } + template <class Ret, class Fp, class A1, class A2> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return f(a1, a2); + } + template <class Ret, class Fp, class A1, class A2> + inline + typename disable_if_c + < + is_member_function_pointer<Fp>::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2); + } + + template <class Ret, class Fp, class A1, class A2, class A3> + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) { return boost::forward<Fp>(f)(a1, a2, a3); } + template <class Ret, class Fp, class A1, class A2, class A3> + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) + { + return f(a1, a2, a3); + } + template <class Ret, class Fp, class A1, class A2, class A3> + inline + typename disable_if_c + < + is_member_function_pointer<Fp>::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) + { + return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2, a3); + } + /// template <class Ret, class Fp> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f) + invoke(Fp &f) { return f(); } template <class Ret, class Fp, class A1> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1) + invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1) { return f(boost::forward<A1>(a1)); } template <class Ret, class Fp, class A1> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, A1 a1) + invoke(Fp &f, A1 a1) { return f(a1); } template <class Ret, class Fp, class A1, class A2> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) { return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); } template <class Ret, class Fp, class A1, class A2> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, A1 a1, A2 a2) + invoke(Fp &f, A1 a1, A2 a2) { return f(a1, a2); } template <class Ret, class Fp, class A1, class A2, class A3> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) + invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) { return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); } template <class Ret, class Fp, class A1, class A2, class A3> inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer<Fp>::value, + is_member_function_pointer<Fp>::value, Ret >::type - invoke(Fp const &f, A1 a1, A2 a2, A3 a3) + invoke(Fp &f, A1 a1, A2 a2, A3 a3) { return f(a1, a2, a3); } /// - template <class Ret> - inline Ret - invoke(Ret(*f)()) - { - return f(); - } - template <class Ret, class A1> - inline Ret - invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1) - { - return f(boost::forward<A1>(a1)); - } - template <class Ret, class A1, class A2> - inline Ret - invoke(Ret(*f)(A1, A2), - BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A1, class A2, class A3> - inline Ret - invoke(Ret(*f)(A1, A2, A3), - BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES #endif // all