diff --git a/include/boost/thread/detail/invoke.hpp b/include/boost/thread/detail/invoke.hpp index 257c1eb3..c81f50fb 100644 --- a/include/boost/thread/detail/invoke.hpp +++ b/include/boost/thread/detail/invoke.hpp @@ -28,7 +28,11 @@ #include #include #include +#include +#include #include +#include +#include #include #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL #include @@ -528,22 +532,28 @@ namespace boost // bullet 5 // f(t1, t2, ..., tN) in all other cases. + template + inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) + { + return boost::forward(f)(boost::forward(args)...); + } + + template + inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) + { + return f(boost::forward(args)...); + } + template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) { - return boost::forward(f)(boost::forward(args)...); - } - template - inline Ret - invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args) - { - return f(boost::forward(args)...); + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(args)...); } #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES // bullet 1 @@ -1351,90 +1361,168 @@ namespace boost // bullet 5 // f(t1, t2, ..., tN) in all other cases. + template + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f) + { + return boost::forward(f)(); + } + template + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f) + { + return f(); + } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type invoke(BOOST_THREAD_FWD_REF(Fp) f) { - return boost::forward(f)(); + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f)); } + template - inline - typename enable_if_c - < - ! is_member_function_pointer::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) { return boost::forward(f)(boost::forward(a1)); } template - inline - typename enable_if_c - < - ! is_member_function_pointer::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1) + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) { - return boost::forward(f)(a1); + return f(boost::forward(a1)); } - template + template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) + { + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(a1)); + } + + template + 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(f)(boost::forward(a1), boost::forward(a2)); } template - inline - typename enable_if_c - < - ! is_member_function_pointer::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 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 boost::forward(f)(a1, a2); + return f(boost::forward(a1), boost::forward(a2)); } - template + template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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) + invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) + { + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(a1), boost::forward(a2)); + } + + template + 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(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); } template + 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), boost::forward(a2), boost::forward(a3)); + } + template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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(boost::is_pointer(), boost::forward(f), boost::forward(a1), boost::forward(a2), boost::forward(a3)); + } + + + template + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return boost::forward(f)(a1); + } + template + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return f(a1); + } + template + inline + typename disable_if_c + < + is_member_function_pointer::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1) + { + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1); + } + + template + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return boost::forward(f)(a1, a2); + } + template + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return f(a1, a2); + } + template + inline + typename disable_if_c + < + is_member_function_pointer::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) + { + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1, a2); + } + + template + inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) { return boost::forward(f)(a1, a2, a3); } + template + inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) + { + return f(a1, a2, a3); + } + template + inline + typename disable_if_c + < + is_member_function_pointer::value, + Ret + >::type + invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) + { + return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1, a2, a3); + } + /// template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type invoke(Fp &f) @@ -1443,20 +1531,20 @@ namespace boost } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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)); } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type invoke(Fp &f, A1 a1) @@ -1465,96 +1553,50 @@ namespace boost } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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), boost::forward(a2)); } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::value, Ret >::type - invoke(Fp const &f, A1 a1, A2 a2) + invoke(Fp &f, A1 a1, A2 a2) { return f(a1, a2); } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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), boost::forward(a2), boost::forward(a3)); } template inline - typename enable_if_c + typename disable_if_c < - ! is_member_function_pointer::value, + is_member_function_pointer::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 - inline Ret - invoke(Ret(*f)()) - { - return f(); - } - template - inline Ret - invoke(Ret(*f)(A1), A1 a1 ) - { - return f(a1); - } - template - inline Ret - invoke(Ret(*f)(BOOST_THREAD_RV_REF(A1)), BOOST_THREAD_RV_REF(A1) a1) - { - return f(boost::forward(a1)); - } - template - inline Ret - invoke(Ret(*f)(A1, A2), - A1 a1, A2 a2) - { - return f(boost::forward(a1), boost::forward(a2)); - } - template - inline Ret - invoke(Ret(*f)(BOOST_THREAD_RV_REF(A1), BOOST_THREAD_RV_REF(A2)), - BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return f(boost::forward(a1), boost::forward(a2)); - } - template - inline Ret - invoke(Ret(*f)(A1, A2, A3), - A1 a1, A2 a2, A3 a3) - { - return f(boost::forward(a1), boost::forward(a2), boost::forward(a3)); - } - template - inline Ret - invoke(Ret(*f)(BOOST_THREAD_RV_REF(A1), BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)), - BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return f(boost::forward(a1), boost::forward(a2), boost::forward(a3)); - } #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES #endif // all