Chris@16: // Copyright (C) 2012-2013 Vicente J. Botet Escriba Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // 2013/04 Vicente J. Botet Escriba Chris@16: // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined. Chris@16: // Make use of Boost.Move Chris@16: // Make use of Boost.Tuple (movable) Chris@16: // 2012 Vicente J. Botet Escriba Chris@16: // Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined Chris@16: // 2012 Vicente J. Botet Escriba Chris@16: // Adapt to boost libc++ implementation Chris@16: Chris@16: //===----------------------------------------------------------------------===// Chris@16: // Chris@16: // The LLVM Compiler Infrastructure Chris@16: // Chris@16: // This file is dual licensed under the MIT and the University of Illinois Open Chris@16: // Source Licenses. See LICENSE.TXT for details. Chris@16: // Chris@16: // The invoke code is based on the one from libcxx. Chris@16: //===----------------------------------------------------------------------===// Chris@16: Chris@16: #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP Chris@16: #define BOOST_THREAD_DETAIL_INVOKE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: #include Chris@16: #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL Chris@16: #include Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@101: #if ! defined(BOOST_NO_SFINAE_EXPR) && \ Chris@16: ! defined(BOOST_NO_CXX11_DECLTYPE) && \ Chris@16: ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \ Chris@101: ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES) Chris@16: Chris@16: #define BOOST_THREAD_PROVIDES_INVOKE Chris@16: Chris@16: #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: // bullets 1 and 2 Chris@16: Chris@16: template Chris@16: inline auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: -> decltype((boost::forward(a0).*f)(boost::forward(args)...)) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@16: } Chris@101: template Chris@101: inline auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@101: -> decltype((boost::forward(a0).*f)(boost::forward(args)...)) Chris@101: { Chris@101: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@101: } Chris@16: Chris@16: template Chris@16: inline auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: -> decltype(((*boost::forward(a0)).*f)(boost::forward(args)...)) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@16: } Chris@101: template Chris@101: inline auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@101: -> decltype(((*boost::forward(a0)).*f)(boost::forward(args)...)) Chris@101: { Chris@101: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@101: } Chris@16: Chris@16: // bullets 3 and 4 Chris@16: Chris@16: template Chris@16: inline auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype(boost::forward(a0).*f) Chris@16: { Chris@16: return boost::forward(a0).*f; Chris@16: } Chris@16: Chris@16: template Chris@16: inline auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype((*boost::forward(a0)).*f) Chris@16: { Chris@16: return (*boost::forward(a0)).*f; Chris@16: } Chris@16: Chris@101: template Chris@101: inline auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype(boost::forward(a0).*f) Chris@101: { Chris@101: return boost::forward(a0).*f; Chris@101: } Chris@101: Chris@101: template Chris@101: inline auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype((*boost::forward(a0)).*f) Chris@101: { Chris@101: return (*boost::forward(a0)).*f; Chris@101: } Chris@101: Chris@101: Chris@16: // bullet 5 Chris@16: Chris@101: template Chris@101: inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) Chris@101: -> decltype(boost::forward(f)(boost::forward(args)...)) Chris@101: { Chris@101: return boost::forward(f)(boost::forward(args)...); Chris@101: } Chris@16: template Chris@16: inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: -> decltype(boost::forward(f)(boost::forward(args)...)) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(args)...); Chris@16: } Chris@101: Chris@16: #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: // bullets 1 and 2 Chris@16: Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype((boost::forward(a0).*f)()) Chris@16: { Chris@16: return (boost::forward(a0).*f)(); Chris@16: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype((boost::forward(a0).*f)()) Chris@101: { Chris@101: return (boost::forward(a0).*f)(); Chris@101: } Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@101: -> decltype((boost::forward(a0).*f)(boost::forward(a1))) Chris@16: { Chris@101: return (boost::forward(a0).*f)(boost::forward(a1)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@101: -> decltype((boost::forward(a0).*f)(boost::forward(a1))) Chris@101: { Chris@101: return (boost::forward(a0).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: auto Chris@16: 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) Chris@101: -> decltype((boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2))) Chris@16: { Chris@101: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: 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) Chris@101: -> decltype((boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2))) Chris@101: { Chris@101: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype(((*boost::forward(a0)).*f)()) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(); Chris@16: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype(((*boost::forward(a0)).*f)()) Chris@101: { Chris@101: return ((*boost::forward(a0)).*f)(); Chris@101: } Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@101: -> decltype(((*boost::forward(a0)).*f)(boost::forward(a1))) Chris@16: { Chris@101: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@16: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@101: -> decltype(((*boost::forward(a0)).*f)(boost::forward(a1))) Chris@101: { Chris@101: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@101: } Chris@101: template Chris@16: inline Chris@16: auto Chris@16: 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) Chris@101: -> decltype(((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2))) Chris@16: { Chris@101: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: 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) Chris@101: -> decltype(((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2))) Chris@101: { Chris@101: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: Chris@16: // bullets 3 and 4 Chris@16: Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype(boost::forward(a0).*f) Chris@16: { Chris@16: return boost::forward(a0).*f; Chris@16: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype(boost::forward(a0).*f) Chris@101: { Chris@101: return boost::forward(a0).*f; Chris@101: } Chris@16: Chris@16: template Chris@16: inline Chris@16: auto Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: -> decltype((*boost::forward(a0)).*f) Chris@16: { Chris@16: return (*boost::forward(a0)).*f; Chris@16: } Chris@101: template Chris@101: inline Chris@101: auto Chris@101: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) Chris@101: -> decltype((*boost::forward(a0)).*f) Chris@101: { Chris@101: return (*boost::forward(a0)).*f; Chris@101: } Chris@16: Chris@16: // bullet 5 Chris@16: Chris@16: template Chris@16: inline Chris@16: auto invoke(BOOST_THREAD_RV_REF(Fp) f) Chris@16: -> decltype(boost::forward(f)()) Chris@16: { Chris@16: return boost::forward(f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@101: auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@16: -> decltype(boost::forward(f)(boost::forward(a1))) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1)); Chris@16: } template Chris@16: inline Chris@16: auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: -> decltype(boost::forward(f)(boost::forward(a1), boost::forward(a2))) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: 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) Chris@16: -> decltype(boost::forward(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3))) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: Chris@101: Chris@101: template Chris@101: inline Chris@101: auto invoke(BOOST_THREAD_RV_REF(Fp) f) Chris@101: -> decltype(boost::forward(f)()) Chris@101: { Chris@101: return boost::forward(f)(); Chris@101: } Chris@101: template Chris@101: inline Chris@101: auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@101: -> decltype(boost::forward(f)(boost::forward(a1))) Chris@101: { Chris@101: return boost::forward(f)(boost::forward(a1)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@101: -> decltype(boost::forward(f)(boost::forward(a1), boost::forward(a2))) Chris@101: { Chris@101: return boost::forward(f)(boost::forward(a1), boost::forward(a2)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: 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) Chris@101: -> decltype(boost::forward(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3))) Chris@101: { Chris@101: return boost::forward(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@101: } Chris@101: Chris@16: #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: #elif ! defined(BOOST_NO_SFINAE_EXPR) && \ Chris@16: ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \ Chris@16: defined BOOST_MSVC Chris@16: Chris@16: template Chris@16: inline Chris@16: Ret invoke(BOOST_THREAD_RV_REF(Fp) f) Chris@16: { Chris@16: return f(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return std::bind(boost::forward(f), boost::forward(a1))(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return std::bind(boost::forward(f), boost::forward(a1), boost::forward(a2))(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: 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) Chris@16: { Chris@16: return std::bind(boost::forward(f), boost::forward(a1), boost::forward(a2), boost::forward(a3))(); Chris@16: } Chris@16: Chris@16: #define BOOST_THREAD_PROVIDES_INVOKE_RET Chris@16: Chris@16: #elif ! defined BOOST_MSVC Chris@16: //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET Chris@16: #define BOOST_THREAD_PROVIDES_INVOKE_RET Chris@16: Chris@16: #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@16: // bullet 1 Chris@16: // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of Chris@16: // type T or a reference to an object of type T or a reference to an object of a type derived from T Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: // bullet 2 Chris@16: // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of Chris@16: // the types described in the previous item; Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: // bullet 3 Chris@16: // 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 Chris@16: // reference to an object of type T or a reference to an object of a type derived from T; Chris@16: // template Chris@16: // inline Chris@16: // typename enable_if_c Chris@16: // < Chris@16: // is_base_of::type>::value, Chris@16: // typename detail::apply_cv::type& Chris@16: // >::type Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return boost::forward(a0).*f; Chris@16: // } Chris@16: Chris@16: // bullet 4 Chris@16: // (*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 Chris@16: //described in the previous item; Chris@16: Chris@16: // template Chris@16: // struct d4th_helper Chris@16: // { Chris@16: // }; Chris@16: // Chris@16: // template Chris@16: // struct d4th_helper Chris@16: // { Chris@16: // typedef typename apply_cv()), Ret>::type type; Chris@16: // }; Chris@16: // Chris@16: // template Chris@16: // inline Chris@16: // typename detail::4th_helper::type Chris@16: // >::value Chris@16: // >::type& Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return (*boost::forward(a0)).*f; Chris@16: // } Chris@16: Chris@16: // template Chris@16: // inline Chris@16: // typename enable_if_c Chris@16: // < Chris@16: // !is_base_of::type>::value, Chris@16: // typename detail::ref_return1::type Chris@16: // >::type Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return (*boost::forward(a0)).*f; Chris@16: // } Chris@16: Chris@16: // bullet 5 Chris@16: // f(t1, t2, ..., tN) in all other cases. Chris@16: Chris@16: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) Chris@101: { Chris@101: return boost::forward(f)(boost::forward(args)...); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) Chris@101: { Chris@101: return f(boost::forward(args)...); Chris@101: } Chris@101: Chris@101: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) Chris@16: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(args)...); Chris@16: } Chris@16: #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: // bullet 1 Chris@16: // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of Chris@16: // type T or a reference to an object of type T or a reference to an object of a type derived from T Chris@16: Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(), A0& a0) Chris@16: { Chris@101: return (a0.*f)(); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename enable_if_c Chris@101: < Chris@101: is_base_of::type>::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(Ret (A::*f)(), A0* a0) Chris@101: { Chris@101: return ((*a0).*f)(); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Chris@101: typename enable_if_c Chris@101: < Chris@101: is_base_of::type>::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(Ret (A::*f)(A1), Chris@101: A0& a0, BOOST_THREAD_RV_REF(A1) a1 Chris@101: ) Chris@101: { Chris@101: return (a0.*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1), A0& a0, A1 a1) Chris@16: { Chris@101: return (a0.*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1 Chris@101: ) Chris@16: { Chris@101: return (*(a0).*f)(boost::forward(a1)); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename enable_if_c Chris@101: < Chris@101: is_base_of::type>::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(Ret (A::*f)(A1), A0* a0, A1 a1) Chris@101: { Chris@101: return (*a0.*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2), Chris@101: A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 Chris@16: ) Chris@16: { Chris@101: return (a0.*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2) Chris@16: { Chris@101: return ((*a0).*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3), Chris@101: A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@101: return (a0.*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@101: return ((*a0).*f)(a1, a2, a3); Chris@16: } Chris@16: Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)() const, A0 const& a0) Chris@16: { Chris@101: return (a0.*f)(); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename enable_if_c Chris@101: < Chris@101: is_base_of::type>::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(Ret (A::*f)() const, A0 const* a0) Chris@101: { Chris@101: return ((*a0).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@101: return (a0.*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1) Chris@101: { Chris@101: return ((*a0).*f)(boost::forward(a1)); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Chris@101: typename enable_if_c Chris@101: < Chris@101: is_base_of::type>::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(Ret (A::*f)(A1) const, A0 const& a0, A1 a1) Chris@16: { Chris@16: return (a0.*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const, Chris@101: A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 Chris@16: ) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2) Chris@16: ); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2) Chris@16: { Chris@16: return (a0.*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 Chris@16: ) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return (a0.*f)(a1, a2, a3); Chris@16: } Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return (boost::forward(a0).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) Chris@16: { Chris@16: return (a0.*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 ) Chris@16: { Chris@16: return (a0.*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 Chris@16: ) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return (a0.*f)(a1, a2, a3); Chris@16: } Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return (boost::forward(a0).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) Chris@16: { Chris@16: return (a0.*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 Chris@16: ) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const volatile, Chris@16: A0 a0, A1 a1, A2 a2 Chris@16: ) Chris@16: { Chris@16: return (a0.*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 Chris@16: ) Chris@16: { Chris@16: return (boost::forward(a0).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const volatile, Chris@16: A0 a0, A1 a1, A2 a2, A3 a3 Chris@16: ) Chris@16: { Chris@16: return (a0.*f)(a1, a2, a3); Chris@16: } Chris@16: Chris@16: // bullet 2 Chris@16: // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of Chris@16: // the types described in the previous item; Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1), A0 a0, A1 a1) Chris@16: { Chris@16: return ((*a0).*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)), Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)), Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3) Chris@16: ); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2, a3); Chris@16: } Chris@16: Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) Chris@16: { Chris@16: return ((*a0).*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const, Chris@16: A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2, a3); Chris@16: } Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) Chris@16: { Chris@16: return ((*a0).*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2, a3); Chris@16: } Chris@16: /// Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)() const volatile, A0 a0) Chris@16: { Chris@16: return ((*a0).*f)(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) Chris@16: { Chris@16: return ((*a0).*f)(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2) const volatile, Chris@16: A0 a0, A1 a1, A2 a2) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const volatile, Chris@16: BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@16: return ((*boost::forward(a0)).*f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@16: typename enable_if_c Chris@16: < Chris@16: ! is_base_of::type>::value, Chris@16: Ret Chris@16: >::type Chris@16: invoke(Ret (A::*f)(A1, A2, A3) const volatile, Chris@16: A0 a0, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return ((*a0).*f)(a1, a2, a3); Chris@16: } Chris@16: // bullet 3 Chris@16: // 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 Chris@16: // reference to an object of type T or a reference to an object of a type derived from T; Chris@16: // template Chris@16: // inline Chris@16: // typename enable_if_c Chris@16: // < Chris@16: // is_base_of::type>::value, Chris@16: // typename detail::apply_cv::type& Chris@16: // >::type Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return boost::forward(a0).*f; Chris@16: // } Chris@16: Chris@16: // bullet 4 Chris@16: // (*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 Chris@16: //described in the previous item; Chris@16: Chris@16: // template Chris@16: // struct d4th_helper Chris@16: // { Chris@16: // }; Chris@16: // Chris@16: // template Chris@16: // struct d4th_helper Chris@16: // { Chris@16: // typedef typename apply_cv()), Ret>::type type; Chris@16: // }; Chris@16: // Chris@16: // template Chris@16: // inline Chris@16: // typename detail::4th_helper::type Chris@16: // >::value Chris@16: // >::type& Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return (*boost::forward(a0)).*f; Chris@16: // } Chris@16: Chris@16: // template Chris@16: // inline Chris@16: // typename enable_if_c Chris@16: // < Chris@16: // !is_base_of::type>::value, Chris@16: // typename detail::ref_return1::type Chris@16: // >::type Chris@16: // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) Chris@16: // { Chris@16: // return (*boost::forward(a0)).*f; Chris@16: // } Chris@16: Chris@16: // bullet 5 Chris@16: // f(t1, t2, ..., tN) in all other cases. Chris@16: Chris@16: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f) Chris@16: { Chris@16: return boost::forward(f)(); Chris@16: } Chris@101: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f) Chris@101: { Chris@101: return f(); Chris@101: } Chris@101: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f) Chris@101: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f)); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1)); Chris@16: } Chris@16: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@101: { Chris@101: return f(boost::forward(a1)); Chris@101: } Chris@101: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(a1)); Chris@16: } Chris@101: Chris@16: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@101: { Chris@101: return f(boost::forward(a1), boost::forward(a2)); Chris@101: } Chris@101: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@101: Chris@16: template Chris@101: 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) Chris@16: { Chris@16: return boost::forward(f)(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@101: 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) Chris@101: { Chris@101: return f(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@101: } Chris@101: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: 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) Chris@101: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@101: } Chris@101: Chris@101: Chris@101: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) Chris@101: { Chris@101: return boost::forward(f)(a1); Chris@101: } Chris@101: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) Chris@101: { Chris@101: return f(a1); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename disable_if_c Chris@101: < Chris@101: is_member_function_pointer::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1) Chris@101: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) Chris@101: { Chris@101: return boost::forward(f)(a1, a2); Chris@101: } Chris@101: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) Chris@101: { Chris@101: return f(a1, a2); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename disable_if_c Chris@101: < Chris@101: is_member_function_pointer::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) Chris@101: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1, a2); Chris@101: } Chris@101: Chris@101: template Chris@101: inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return boost::forward(f)(a1, a2, a3); Chris@16: } Chris@101: template Chris@101: inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) Chris@101: { Chris@101: return f(a1, a2, a3); Chris@101: } Chris@101: template Chris@101: inline Chris@101: typename disable_if_c Chris@101: < Chris@101: is_member_function_pointer::value, Chris@101: Ret Chris@101: >::type Chris@101: invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) Chris@101: { Chris@101: return boost::detail::do_invoke(boost::is_pointer(), boost::forward(f), a1, a2, a3); Chris@101: } Chris@101: Chris@16: Chris@16: /// Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f) Chris@16: { Chris@16: return f(); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1) Chris@16: { Chris@16: return f(boost::forward(a1)); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, A1 a1) Chris@16: { Chris@16: return f(a1); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) Chris@16: { Chris@16: return f(boost::forward(a1), boost::forward(a2)); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, A1 a1, A2 a2) Chris@16: { Chris@16: return f(a1, a2); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) Chris@16: { Chris@16: return f(boost::forward(a1), boost::forward(a2), boost::forward(a3)); Chris@16: } Chris@16: template Chris@16: inline Chris@101: typename disable_if_c Chris@16: < Chris@101: is_member_function_pointer::value, Chris@16: Ret Chris@16: >::type Chris@101: invoke(Fp &f, A1 a1, A2 a2, A3 a3) Chris@16: { Chris@16: return f(a1, a2, a3); Chris@16: } Chris@16: /// Chris@16: Chris@16: #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES Chris@16: Chris@16: #endif // all Chris@16: } Chris@16: } Chris@16: Chris@16: #endif // header