Chris@102: // Copyright (C) 2012 Vicente J. Botet Escriba Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: Chris@102: // 2013/04 Vicente J. Botet Escriba Chris@102: // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined. Chris@102: // Make use of Boost.Move Chris@102: // Make use of Boost.Tuple (movable) Chris@102: // 2012/11 Vicente J. Botet Escriba Chris@102: // Adapt to boost libc++ implementation Chris@102: Chris@102: //===----------------------------------------------------------------------===// Chris@102: // Chris@102: // The LLVM Compiler Infrastructure Chris@102: // Chris@102: // This file is dual licensed under the MIT and the University of Illinois Open Chris@102: // Source Licenses. See LICENSE.TXT for details. Chris@102: // Chris@102: // The invoker code is based on the one from libcxx. Chris@102: //===----------------------------------------------------------------------===// Chris@102: Chris@102: #ifndef BOOST_THREAD_DETAIL_INVOKER_HPP Chris@102: #define BOOST_THREAD_DETAIL_INVOKER_HPP Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: namespace detail Chris@102: { Chris@102: Chris@102: #if defined(BOOST_THREAD_PROVIDES_INVOKE) && ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && ! defined(BOOST_NO_CXX11_HDR_TUPLE) Chris@102: Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: //typedef typename decay::type Fpd; Chris@102: //typedef tuple::type...> Argsd; Chris@102: Chris@102: //csbl::tuple f_; Chris@102: csbl::tuple f_; Chris@102: Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker) Chris@102: //typedef typename invoke_of<_Fp, _Args...>::type Rp; Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: template Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args) Chris@102: : f_(boost::forward(f), boost::forward(args)...) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) : f_(boost::move(BOOST_THREAD_RV(f).f_)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker( const invoker& f) : f_(f.f_) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker& operator=(BOOST_THREAD_RV_REF(invoker) f) Chris@102: { Chris@102: f_ = boost::move(BOOST_THREAD_RV(f).f_); Chris@102: } Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker& operator=( BOOST_THREAD_COPY_ASSIGN_REF(invoker) f) Chris@102: { Chris@102: f_ = f.f_; Chris@102: } Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index; Chris@102: return execute(Index()); Chris@102: } Chris@102: private: Chris@102: template Chris@102: result_type Chris@102: execute(tuple_indices) Chris@102: { Chris@102: return invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get(f_))...); Chris@102: } Chris@102: }; Chris@102: Chris@102: template Chris@102: class invoker_ret Chris@102: { Chris@102: //typedef typename decay::type Fpd; Chris@102: //typedef tuple::type...> Argsd; Chris@102: Chris@102: //csbl::tuple f_; Chris@102: csbl::tuple f_; Chris@102: Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker_ret) Chris@102: typedef R result_type; Chris@102: Chris@102: template Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker_ret(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args) Chris@102: : f_(boost::forward(f), boost::forward(args)...) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker_ret(BOOST_THREAD_RV_REF(invoker_ret) f) : f_(boost::move(BOOST_THREAD_RV(f).f_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index; Chris@102: return execute(Index()); Chris@102: } Chris@102: private: Chris@102: template Chris@102: result_type Chris@102: execute(tuple_indices) Chris@102: { Chris@102: return invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get(f_))...); Chris@102: } Chris@102: }; Chris@102: //BOOST_THREAD_DCL_MOVABLE_BEG(X) invoker BOOST_THREAD_DCL_MOVABLE_END Chris@102: #else Chris@102: Chris@102: #if ! defined BOOST_MSVC && defined(BOOST_THREAD_PROVIDES_INVOKE) Chris@102: Chris@102: #define BOOST_THREAD_RV_REF_ARG_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(Arg##n) Chris@102: #define BOOST_THREAD_RV_REF_A_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(A##n) Chris@102: #define BOOST_THREAD_RV_REF_ARG(z, n, unused) , BOOST_THREAD_RV_REF(Arg##n) arg##n Chris@102: #define BOOST_THREAD_FWD_REF_A(z, n, unused) , BOOST_THREAD_FWD_REF(A##n) arg##n Chris@102: #define BOOST_THREAD_FWD_REF_ARG(z, n, unused) , BOOST_THREAD_FWD_REF(Arg##n) arg##n Chris@102: #define BOOST_THREAD_FWD_PARAM(z, n, unused) , boost::forward(arg##n) Chris@102: #define BOOST_THREAD_FWD_PARAM_A(z, n, unused) , boost::forward(arg##n) Chris@102: #define BOOST_THREAD_DCL(z, n, unused) Arg##n v##n; Chris@102: #define BOOST_THREAD_MOVE_PARAM(z, n, unused) , v##n(boost::move(arg##n)) Chris@102: #define BOOST_THREAD_FORWARD_PARAM_A(z, n, unused) , v##n(boost::forward(arg##n)) Chris@102: #define BOOST_THREAD_MOVE_RHS_PARAM(z, n, unused) , v##n(boost::move(x.v##n)) Chris@102: #define BOOST_THREAD_MOVE_DCL(z, n, unused) , boost::move(v##n) Chris@102: #define BOOST_THREAD_MOVE_DCL_T(z, n, unused) BOOST_PP_COMMA_IF(n) boost::move(v##n) Chris@102: #define BOOST_THREAD_ARG_DEF(z, n, unused) , class Arg##n = tuples::null_type Chris@102: Chris@102: template Chris@102: class invoker; Chris@102: Chris@102: #define BOOST_THREAD_ASYNC_FUNCT(z, n, unused) \ Chris@102: template \ Chris@102: class invoker \ Chris@102: { \ Chris@102: Fp fp_; \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \ Chris@102: public: \ Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \ Chris@102: typedef typename result_of::type result_type; \ Chris@102: \ Chris@102: template \ Chris@102: BOOST_SYMBOL_VISIBLE \ Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(F) f \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \ Chris@102: ) \ Chris@102: : fp_(boost::forward(f)) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \ Chris@102: {} \ Chris@102: \ Chris@102: BOOST_SYMBOL_VISIBLE \ Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) x) \ Chris@102: : fp_(boost::move(x.fp_)) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \ Chris@102: {} \ Chris@102: \ Chris@102: result_type operator()() { \ Chris@102: return invoke(boost::move(fp_) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL, ~) \ Chris@102: ); \ Chris@102: } \ Chris@102: }; \ Chris@102: \ Chris@102: template \ Chris@102: class invoker \ Chris@102: { \ Chris@102: typedef R(*Fp)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_ARG_T, ~)); \ Chris@102: Fp fp_; \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \ Chris@102: public: \ Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \ Chris@102: typedef typename result_of::type result_type; \ Chris@102: \ Chris@102: template \ Chris@102: BOOST_SYMBOL_VISIBLE \ Chris@102: explicit invoker(R2(*f)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_A_T, ~)) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \ Chris@102: ) \ Chris@102: : fp_(f) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \ Chris@102: {} \ Chris@102: \ Chris@102: BOOST_SYMBOL_VISIBLE \ Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) x) \ Chris@102: : fp_(x.fp_) \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \ Chris@102: {} \ Chris@102: \ Chris@102: result_type operator()() { \ Chris@102: return fp_( \ Chris@102: BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL_T, ~) \ Chris@102: ); \ Chris@102: } \ Chris@102: }; Chris@102: Chris@102: BOOST_PP_REPEAT(BOOST_THREAD_MAX_ARGS, BOOST_THREAD_ASYNC_FUNCT, ~) Chris@102: Chris@102: #undef BOOST_THREAD_RV_REF_ARG_T Chris@102: #undef BOOST_THREAD_RV_REF_ARG Chris@102: #undef BOOST_THREAD_FWD_REF_ARG Chris@102: #undef BOOST_THREAD_FWD_REF_A Chris@102: #undef BOOST_THREAD_FWD_PARAM Chris@102: #undef BOOST_THREAD_FWD_PARAM_A Chris@102: #undef BOOST_THREAD_DCL Chris@102: #undef BOOST_THREAD_MOVE_PARAM Chris@102: #undef BOOST_THREAD_MOVE_RHS_PARAM Chris@102: #undef BOOST_THREAD_MOVE_DCL Chris@102: #undef BOOST_THREAD_ARG_DEF Chris@102: #undef BOOST_THREAD_ASYNC_FUNCT Chris@102: Chris@102: #else Chris@102: Chris@102: template Chris@102: class invoker; Chris@102: Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: T4 v4_; Chris@102: T5 v5_; Chris@102: T6 v6_; Chris@102: T7 v7_; Chris@102: T8 v8_; Chris@102: //::boost::tuple f_; Chris@102: Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: , BOOST_THREAD_RV_REF(T4) a4 Chris@102: , BOOST_THREAD_RV_REF(T5) a5 Chris@102: , BOOST_THREAD_RV_REF(T6) a6 Chris@102: , BOOST_THREAD_RV_REF(T7) a7 Chris@102: , BOOST_THREAD_RV_REF(T8) a8 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: , v4_(boost::move(a4)) Chris@102: , v5_(boost::move(a5)) Chris@102: , v6_(boost::move(a6)) Chris@102: , v7_(boost::move(a7)) Chris@102: , v8_(boost::move(a8)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: , v4_(boost::move(BOOST_THREAD_RV(f).v4_)) Chris@102: , v5_(boost::move(BOOST_THREAD_RV(f).v5_)) Chris@102: , v6_(boost::move(BOOST_THREAD_RV(f).v6_)) Chris@102: , v7_(boost::move(BOOST_THREAD_RV(f).v7_)) Chris@102: , v8_(boost::move(BOOST_THREAD_RV(f).v8_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: , boost::move(v4_) Chris@102: , boost::move(v5_) Chris@102: , boost::move(v6_) Chris@102: , boost::move(v7_) Chris@102: , boost::move(v8_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: T4 v4_; Chris@102: T5 v5_; Chris@102: T6 v6_; Chris@102: T7 v7_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: , BOOST_THREAD_RV_REF(T4) a4 Chris@102: , BOOST_THREAD_RV_REF(T5) a5 Chris@102: , BOOST_THREAD_RV_REF(T6) a6 Chris@102: , BOOST_THREAD_RV_REF(T7) a7 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: , v4_(boost::move(a4)) Chris@102: , v5_(boost::move(a5)) Chris@102: , v6_(boost::move(a6)) Chris@102: , v7_(boost::move(a7)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: , v4_(boost::move(BOOST_THREAD_RV(f).v4_)) Chris@102: , v5_(boost::move(BOOST_THREAD_RV(f).v5_)) Chris@102: , v6_(boost::move(BOOST_THREAD_RV(f).v6_)) Chris@102: , v7_(boost::move(BOOST_THREAD_RV(f).v7_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: , boost::move(v4_) Chris@102: , boost::move(v5_) Chris@102: , boost::move(v6_) Chris@102: , boost::move(v7_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: T4 v4_; Chris@102: T5 v5_; Chris@102: T6 v6_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: , BOOST_THREAD_RV_REF(T4) a4 Chris@102: , BOOST_THREAD_RV_REF(T5) a5 Chris@102: , BOOST_THREAD_RV_REF(T6) a6 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: , v4_(boost::move(a4)) Chris@102: , v5_(boost::move(a5)) Chris@102: , v6_(boost::move(a6)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: , v4_(boost::move(BOOST_THREAD_RV(f).v4_)) Chris@102: , v5_(boost::move(BOOST_THREAD_RV(f).v5_)) Chris@102: , v6_(boost::move(BOOST_THREAD_RV(f).v6_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: , boost::move(v4_) Chris@102: , boost::move(v5_) Chris@102: , boost::move(v6_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: T4 v4_; Chris@102: T5 v5_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: , BOOST_THREAD_RV_REF(T4) a4 Chris@102: , BOOST_THREAD_RV_REF(T5) a5 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: , v4_(boost::move(a4)) Chris@102: , v5_(boost::move(a5)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: , v4_(boost::move(BOOST_THREAD_RV(f).v4_)) Chris@102: , v5_(boost::move(BOOST_THREAD_RV(f).v5_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: , boost::move(v4_) Chris@102: , boost::move(v5_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: T4 v4_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: , BOOST_THREAD_RV_REF(T4) a4 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: , v4_(boost::move(a4)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: , v4_(boost::move(BOOST_THREAD_RV(f).v4_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: , boost::move(v4_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: T3 v3_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: , BOOST_THREAD_RV_REF(T3) a3 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: , v3_(boost::move(a3)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: , v3_(boost::move(BOOST_THREAD_RV(f).v3_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: , boost::move(v3_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: T2 v2_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: , BOOST_THREAD_RV_REF(T2) a2 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: , v2_(boost::move(a2)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: , v2_(boost::move(BOOST_THREAD_RV(f).v2_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: , boost::move(v2_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: T1 v1_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: , BOOST_THREAD_RV_REF(T1) a1 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: , v1_(boost::move(a1)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: , v1_(boost::move(BOOST_THREAD_RV(f).v1_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: , boost::move(v1_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: T0 v0_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f Chris@102: , BOOST_THREAD_RV_REF(T0) a0 Chris@102: ) Chris@102: : fp_(boost::move(f)) Chris@102: , v0_(boost::move(a0)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(BOOST_THREAD_RV(f).fp)) Chris@102: , v0_(boost::move(BOOST_THREAD_RV(f).v0_)) Chris@102: {} Chris@102: Chris@102: result_type operator()() Chris@102: { Chris@102: return invoke(boost::move(fp_) Chris@102: , boost::move(v0_) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: Fp fp_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(BOOST_THREAD_FWD_REF(Fp) f) Chris@102: : fp_(boost::move(f)) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(boost::move(f.fp_)) Chris@102: {} Chris@102: result_type operator()() Chris@102: { Chris@102: return fp_(); Chris@102: } Chris@102: }; Chris@102: template Chris@102: class invoker Chris@102: { Chris@102: typedef R(*Fp)(); Chris@102: Fp fp_; Chris@102: public: Chris@102: BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) Chris@102: typedef typename result_of::type result_type; Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: explicit invoker(Fp f) Chris@102: : fp_(f) Chris@102: {} Chris@102: Chris@102: BOOST_SYMBOL_VISIBLE Chris@102: invoker(BOOST_THREAD_RV_REF(invoker) f) Chris@102: : fp_(f.fp_) Chris@102: {} Chris@102: result_type operator()() Chris@102: { Chris@102: return fp_(); Chris@102: } Chris@102: }; Chris@102: #endif Chris@102: #endif Chris@102: Chris@102: } Chris@102: } Chris@102: Chris@102: #include Chris@102: Chris@102: #endif // header