annotate DEPENDENCIES/generic/include/boost/thread/detail/invoker.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 // Copyright (C) 2012 Vicente J. Botet Escriba
Chris@102 2 //
Chris@102 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@102 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 5
Chris@102 6 // 2013/04 Vicente J. Botet Escriba
Chris@102 7 // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
Chris@102 8 // Make use of Boost.Move
Chris@102 9 // Make use of Boost.Tuple (movable)
Chris@102 10 // 2012/11 Vicente J. Botet Escriba
Chris@102 11 // Adapt to boost libc++ implementation
Chris@102 12
Chris@102 13 //===----------------------------------------------------------------------===//
Chris@102 14 //
Chris@102 15 // The LLVM Compiler Infrastructure
Chris@102 16 //
Chris@102 17 // This file is dual licensed under the MIT and the University of Illinois Open
Chris@102 18 // Source Licenses. See LICENSE.TXT for details.
Chris@102 19 //
Chris@102 20 // The invoker code is based on the one from libcxx.
Chris@102 21 //===----------------------------------------------------------------------===//
Chris@102 22
Chris@102 23 #ifndef BOOST_THREAD_DETAIL_INVOKER_HPP
Chris@102 24 #define BOOST_THREAD_DETAIL_INVOKER_HPP
Chris@102 25
Chris@102 26 #include <boost/config.hpp>
Chris@102 27
Chris@102 28 #include <boost/utility/result_of.hpp>
Chris@102 29 #include <boost/thread/detail/move.hpp>
Chris@102 30 #include <boost/thread/detail/invoke.hpp>
Chris@102 31 #include <boost/thread/detail/make_tuple_indices.hpp>
Chris@102 32 #include <boost/thread/csbl/tuple.hpp>
Chris@102 33 #include <boost/tuple/tuple.hpp>
Chris@102 34
Chris@102 35 #include <boost/thread/detail/variadic_header.hpp>
Chris@102 36
Chris@102 37 namespace boost
Chris@102 38 {
Chris@102 39 namespace detail
Chris@102 40 {
Chris@102 41
Chris@102 42 #if defined(BOOST_THREAD_PROVIDES_INVOKE) && ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && ! defined(BOOST_NO_CXX11_HDR_TUPLE)
Chris@102 43
Chris@102 44 template <class Fp, class ... Args>
Chris@102 45 class invoker
Chris@102 46 {
Chris@102 47 //typedef typename decay<Fp>::type Fpd;
Chris@102 48 //typedef tuple<typename decay<Args>::type...> Argsd;
Chris@102 49
Chris@102 50 //csbl::tuple<Fpd, Argsd...> f_;
Chris@102 51 csbl::tuple<Fp, Args...> f_;
Chris@102 52
Chris@102 53 public:
Chris@102 54 BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker)
Chris@102 55 //typedef typename invoke_of<_Fp, _Args...>::type Rp;
Chris@102 56 typedef typename result_of<Fp(Args...)>::type result_type;
Chris@102 57
Chris@102 58 template <class F, class ... As>
Chris@102 59 BOOST_SYMBOL_VISIBLE
Chris@102 60 explicit invoker(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args)
Chris@102 61 : f_(boost::forward<F>(f), boost::forward<As>(args)...)
Chris@102 62 {}
Chris@102 63
Chris@102 64 BOOST_SYMBOL_VISIBLE
Chris@102 65 invoker(BOOST_THREAD_RV_REF(invoker) f) : f_(boost::move(BOOST_THREAD_RV(f).f_))
Chris@102 66 {}
Chris@102 67
Chris@102 68 BOOST_SYMBOL_VISIBLE
Chris@102 69 invoker( const invoker& f) : f_(f.f_)
Chris@102 70 {}
Chris@102 71
Chris@102 72 BOOST_SYMBOL_VISIBLE
Chris@102 73 invoker& operator=(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 74 {
Chris@102 75 f_ = boost::move(BOOST_THREAD_RV(f).f_);
Chris@102 76 }
Chris@102 77
Chris@102 78 BOOST_SYMBOL_VISIBLE
Chris@102 79 invoker& operator=( BOOST_THREAD_COPY_ASSIGN_REF(invoker) f)
Chris@102 80 {
Chris@102 81 f_ = f.f_;
Chris@102 82 }
Chris@102 83
Chris@102 84 result_type operator()()
Chris@102 85 {
Chris@102 86 typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
Chris@102 87 return execute(Index());
Chris@102 88 }
Chris@102 89 private:
Chris@102 90 template <size_t ...Indices>
Chris@102 91 result_type
Chris@102 92 execute(tuple_indices<Indices...>)
Chris@102 93 {
Chris@102 94 return invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
Chris@102 95 }
Chris@102 96 };
Chris@102 97
Chris@102 98 template <class R, class Fp, class ... Args>
Chris@102 99 class invoker_ret
Chris@102 100 {
Chris@102 101 //typedef typename decay<Fp>::type Fpd;
Chris@102 102 //typedef tuple<typename decay<Args>::type...> Argsd;
Chris@102 103
Chris@102 104 //csbl::tuple<Fpd, Argsd...> f_;
Chris@102 105 csbl::tuple<Fp, Args...> f_;
Chris@102 106
Chris@102 107 public:
Chris@102 108 BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker_ret)
Chris@102 109 typedef R result_type;
Chris@102 110
Chris@102 111 template <class F, class ... As>
Chris@102 112 BOOST_SYMBOL_VISIBLE
Chris@102 113 explicit invoker_ret(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args)
Chris@102 114 : f_(boost::forward<F>(f), boost::forward<As>(args)...)
Chris@102 115 {}
Chris@102 116
Chris@102 117 BOOST_SYMBOL_VISIBLE
Chris@102 118 invoker_ret(BOOST_THREAD_RV_REF(invoker_ret) f) : f_(boost::move(BOOST_THREAD_RV(f).f_))
Chris@102 119 {}
Chris@102 120
Chris@102 121 result_type operator()()
Chris@102 122 {
Chris@102 123 typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
Chris@102 124 return execute(Index());
Chris@102 125 }
Chris@102 126 private:
Chris@102 127 template <size_t ...Indices>
Chris@102 128 result_type
Chris@102 129 execute(tuple_indices<Indices...>)
Chris@102 130 {
Chris@102 131 return invoke<R>(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
Chris@102 132 }
Chris@102 133 };
Chris@102 134 //BOOST_THREAD_DCL_MOVABLE_BEG(X) invoker<Fp> BOOST_THREAD_DCL_MOVABLE_END
Chris@102 135 #else
Chris@102 136
Chris@102 137 #if ! defined BOOST_MSVC && defined(BOOST_THREAD_PROVIDES_INVOKE)
Chris@102 138
Chris@102 139 #define BOOST_THREAD_RV_REF_ARG_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(Arg##n)
Chris@102 140 #define BOOST_THREAD_RV_REF_A_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(A##n)
Chris@102 141 #define BOOST_THREAD_RV_REF_ARG(z, n, unused) , BOOST_THREAD_RV_REF(Arg##n) arg##n
Chris@102 142 #define BOOST_THREAD_FWD_REF_A(z, n, unused) , BOOST_THREAD_FWD_REF(A##n) arg##n
Chris@102 143 #define BOOST_THREAD_FWD_REF_ARG(z, n, unused) , BOOST_THREAD_FWD_REF(Arg##n) arg##n
Chris@102 144 #define BOOST_THREAD_FWD_PARAM(z, n, unused) , boost::forward<Arg##n>(arg##n)
Chris@102 145 #define BOOST_THREAD_FWD_PARAM_A(z, n, unused) , boost::forward<A##n>(arg##n)
Chris@102 146 #define BOOST_THREAD_DCL(z, n, unused) Arg##n v##n;
Chris@102 147 #define BOOST_THREAD_MOVE_PARAM(z, n, unused) , v##n(boost::move(arg##n))
Chris@102 148 #define BOOST_THREAD_FORWARD_PARAM_A(z, n, unused) , v##n(boost::forward<A##n>(arg##n))
Chris@102 149 #define BOOST_THREAD_MOVE_RHS_PARAM(z, n, unused) , v##n(boost::move(x.v##n))
Chris@102 150 #define BOOST_THREAD_MOVE_DCL(z, n, unused) , boost::move(v##n)
Chris@102 151 #define BOOST_THREAD_MOVE_DCL_T(z, n, unused) BOOST_PP_COMMA_IF(n) boost::move(v##n)
Chris@102 152 #define BOOST_THREAD_ARG_DEF(z, n, unused) , class Arg##n = tuples::null_type
Chris@102 153
Chris@102 154 template <class Fp, class Arg = tuples::null_type
Chris@102 155 BOOST_PP_REPEAT(BOOST_THREAD_MAX_ARGS, BOOST_THREAD_ARG_DEF, ~)
Chris@102 156 >
Chris@102 157 class invoker;
Chris@102 158
Chris@102 159 #define BOOST_THREAD_ASYNC_FUNCT(z, n, unused) \
Chris@102 160 template <class Fp BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class Arg) > \
Chris@102 161 class invoker<Fp BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Arg)> \
Chris@102 162 { \
Chris@102 163 Fp fp_; \
Chris@102 164 BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \
Chris@102 165 public: \
Chris@102 166 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \
Chris@102 167 typedef typename result_of<Fp(BOOST_PP_ENUM_PARAMS(n, Arg))>::type result_type; \
Chris@102 168 \
Chris@102 169 template <class F BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class A) > \
Chris@102 170 BOOST_SYMBOL_VISIBLE \
Chris@102 171 explicit invoker(BOOST_THREAD_FWD_REF(F) f \
Chris@102 172 BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \
Chris@102 173 ) \
Chris@102 174 : fp_(boost::forward<F>(f)) \
Chris@102 175 BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \
Chris@102 176 {} \
Chris@102 177 \
Chris@102 178 BOOST_SYMBOL_VISIBLE \
Chris@102 179 invoker(BOOST_THREAD_RV_REF(invoker) x) \
Chris@102 180 : fp_(boost::move(x.fp_)) \
Chris@102 181 BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \
Chris@102 182 {} \
Chris@102 183 \
Chris@102 184 result_type operator()() { \
Chris@102 185 return invoke(boost::move(fp_) \
Chris@102 186 BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL, ~) \
Chris@102 187 ); \
Chris@102 188 } \
Chris@102 189 }; \
Chris@102 190 \
Chris@102 191 template <class R BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class Arg) > \
Chris@102 192 class invoker<R(*)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_ARG_T, ~)) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Arg)> \
Chris@102 193 { \
Chris@102 194 typedef R(*Fp)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_ARG_T, ~)); \
Chris@102 195 Fp fp_; \
Chris@102 196 BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \
Chris@102 197 public: \
Chris@102 198 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \
Chris@102 199 typedef typename result_of<Fp(BOOST_PP_ENUM_PARAMS(n, Arg))>::type result_type; \
Chris@102 200 \
Chris@102 201 template <class R2 BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class A) > \
Chris@102 202 BOOST_SYMBOL_VISIBLE \
Chris@102 203 explicit invoker(R2(*f)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_A_T, ~)) \
Chris@102 204 BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \
Chris@102 205 ) \
Chris@102 206 : fp_(f) \
Chris@102 207 BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \
Chris@102 208 {} \
Chris@102 209 \
Chris@102 210 BOOST_SYMBOL_VISIBLE \
Chris@102 211 invoker(BOOST_THREAD_RV_REF(invoker) x) \
Chris@102 212 : fp_(x.fp_) \
Chris@102 213 BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \
Chris@102 214 {} \
Chris@102 215 \
Chris@102 216 result_type operator()() { \
Chris@102 217 return fp_( \
Chris@102 218 BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL_T, ~) \
Chris@102 219 ); \
Chris@102 220 } \
Chris@102 221 };
Chris@102 222
Chris@102 223 BOOST_PP_REPEAT(BOOST_THREAD_MAX_ARGS, BOOST_THREAD_ASYNC_FUNCT, ~)
Chris@102 224
Chris@102 225 #undef BOOST_THREAD_RV_REF_ARG_T
Chris@102 226 #undef BOOST_THREAD_RV_REF_ARG
Chris@102 227 #undef BOOST_THREAD_FWD_REF_ARG
Chris@102 228 #undef BOOST_THREAD_FWD_REF_A
Chris@102 229 #undef BOOST_THREAD_FWD_PARAM
Chris@102 230 #undef BOOST_THREAD_FWD_PARAM_A
Chris@102 231 #undef BOOST_THREAD_DCL
Chris@102 232 #undef BOOST_THREAD_MOVE_PARAM
Chris@102 233 #undef BOOST_THREAD_MOVE_RHS_PARAM
Chris@102 234 #undef BOOST_THREAD_MOVE_DCL
Chris@102 235 #undef BOOST_THREAD_ARG_DEF
Chris@102 236 #undef BOOST_THREAD_ASYNC_FUNCT
Chris@102 237
Chris@102 238 #else
Chris@102 239
Chris@102 240 template <class Fp,
Chris@102 241 class T0 = tuples::null_type, class T1 = tuples::null_type, class T2 = tuples::null_type,
Chris@102 242 class T3 = tuples::null_type, class T4 = tuples::null_type, class T5 = tuples::null_type,
Chris@102 243 class T6 = tuples::null_type, class T7 = tuples::null_type, class T8 = tuples::null_type
Chris@102 244 , class T9 = tuples::null_type
Chris@102 245 >
Chris@102 246 class invoker;
Chris@102 247
Chris@102 248 template <class Fp,
Chris@102 249 class T0 , class T1 , class T2 ,
Chris@102 250 class T3 , class T4 , class T5 ,
Chris@102 251 class T6 , class T7 , class T8 >
Chris@102 252 class invoker<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8>
Chris@102 253 {
Chris@102 254 Fp fp_;
Chris@102 255 T0 v0_;
Chris@102 256 T1 v1_;
Chris@102 257 T2 v2_;
Chris@102 258 T3 v3_;
Chris@102 259 T4 v4_;
Chris@102 260 T5 v5_;
Chris@102 261 T6 v6_;
Chris@102 262 T7 v7_;
Chris@102 263 T8 v8_;
Chris@102 264 //::boost::tuple<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8> f_;
Chris@102 265
Chris@102 266 public:
Chris@102 267 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 268 typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7, T8)>::type result_type;
Chris@102 269
Chris@102 270 BOOST_SYMBOL_VISIBLE
Chris@102 271 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 272 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 273 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 274 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 275 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 276 , BOOST_THREAD_RV_REF(T4) a4
Chris@102 277 , BOOST_THREAD_RV_REF(T5) a5
Chris@102 278 , BOOST_THREAD_RV_REF(T6) a6
Chris@102 279 , BOOST_THREAD_RV_REF(T7) a7
Chris@102 280 , BOOST_THREAD_RV_REF(T8) a8
Chris@102 281 )
Chris@102 282 : fp_(boost::move(f))
Chris@102 283 , v0_(boost::move(a0))
Chris@102 284 , v1_(boost::move(a1))
Chris@102 285 , v2_(boost::move(a2))
Chris@102 286 , v3_(boost::move(a3))
Chris@102 287 , v4_(boost::move(a4))
Chris@102 288 , v5_(boost::move(a5))
Chris@102 289 , v6_(boost::move(a6))
Chris@102 290 , v7_(boost::move(a7))
Chris@102 291 , v8_(boost::move(a8))
Chris@102 292 {}
Chris@102 293
Chris@102 294 BOOST_SYMBOL_VISIBLE
Chris@102 295 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 296 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 297 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 298 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 299 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 300 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 301 , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
Chris@102 302 , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
Chris@102 303 , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
Chris@102 304 , v7_(boost::move(BOOST_THREAD_RV(f).v7_))
Chris@102 305 , v8_(boost::move(BOOST_THREAD_RV(f).v8_))
Chris@102 306 {}
Chris@102 307
Chris@102 308 result_type operator()()
Chris@102 309 {
Chris@102 310 return invoke(boost::move(fp_)
Chris@102 311 , boost::move(v0_)
Chris@102 312 , boost::move(v1_)
Chris@102 313 , boost::move(v2_)
Chris@102 314 , boost::move(v3_)
Chris@102 315 , boost::move(v4_)
Chris@102 316 , boost::move(v5_)
Chris@102 317 , boost::move(v6_)
Chris@102 318 , boost::move(v7_)
Chris@102 319 , boost::move(v8_)
Chris@102 320 );
Chris@102 321 }
Chris@102 322 };
Chris@102 323 template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
Chris@102 324 class invoker<Fp, T0, T1, T2, T3, T4, T5, T6, T7>
Chris@102 325 {
Chris@102 326 Fp fp_;
Chris@102 327 T0 v0_;
Chris@102 328 T1 v1_;
Chris@102 329 T2 v2_;
Chris@102 330 T3 v3_;
Chris@102 331 T4 v4_;
Chris@102 332 T5 v5_;
Chris@102 333 T6 v6_;
Chris@102 334 T7 v7_;
Chris@102 335 public:
Chris@102 336 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 337 typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7)>::type result_type;
Chris@102 338
Chris@102 339 BOOST_SYMBOL_VISIBLE
Chris@102 340 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 341 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 342 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 343 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 344 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 345 , BOOST_THREAD_RV_REF(T4) a4
Chris@102 346 , BOOST_THREAD_RV_REF(T5) a5
Chris@102 347 , BOOST_THREAD_RV_REF(T6) a6
Chris@102 348 , BOOST_THREAD_RV_REF(T7) a7
Chris@102 349 )
Chris@102 350 : fp_(boost::move(f))
Chris@102 351 , v0_(boost::move(a0))
Chris@102 352 , v1_(boost::move(a1))
Chris@102 353 , v2_(boost::move(a2))
Chris@102 354 , v3_(boost::move(a3))
Chris@102 355 , v4_(boost::move(a4))
Chris@102 356 , v5_(boost::move(a5))
Chris@102 357 , v6_(boost::move(a6))
Chris@102 358 , v7_(boost::move(a7))
Chris@102 359 {}
Chris@102 360
Chris@102 361 BOOST_SYMBOL_VISIBLE
Chris@102 362 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 363 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 364 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 365 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 366 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 367 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 368 , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
Chris@102 369 , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
Chris@102 370 , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
Chris@102 371 , v7_(boost::move(BOOST_THREAD_RV(f).v7_))
Chris@102 372 {}
Chris@102 373
Chris@102 374 result_type operator()()
Chris@102 375 {
Chris@102 376 return invoke(boost::move(fp_)
Chris@102 377 , boost::move(v0_)
Chris@102 378 , boost::move(v1_)
Chris@102 379 , boost::move(v2_)
Chris@102 380 , boost::move(v3_)
Chris@102 381 , boost::move(v4_)
Chris@102 382 , boost::move(v5_)
Chris@102 383 , boost::move(v6_)
Chris@102 384 , boost::move(v7_)
Chris@102 385 );
Chris@102 386 }
Chris@102 387 };
Chris@102 388 template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6>
Chris@102 389 class invoker<Fp, T0, T1, T2, T3, T4, T5, T6>
Chris@102 390 {
Chris@102 391 Fp fp_;
Chris@102 392 T0 v0_;
Chris@102 393 T1 v1_;
Chris@102 394 T2 v2_;
Chris@102 395 T3 v3_;
Chris@102 396 T4 v4_;
Chris@102 397 T5 v5_;
Chris@102 398 T6 v6_;
Chris@102 399 public:
Chris@102 400 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 401 typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6)>::type result_type;
Chris@102 402
Chris@102 403 BOOST_SYMBOL_VISIBLE
Chris@102 404 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 405 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 406 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 407 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 408 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 409 , BOOST_THREAD_RV_REF(T4) a4
Chris@102 410 , BOOST_THREAD_RV_REF(T5) a5
Chris@102 411 , BOOST_THREAD_RV_REF(T6) a6
Chris@102 412 )
Chris@102 413 : fp_(boost::move(f))
Chris@102 414 , v0_(boost::move(a0))
Chris@102 415 , v1_(boost::move(a1))
Chris@102 416 , v2_(boost::move(a2))
Chris@102 417 , v3_(boost::move(a3))
Chris@102 418 , v4_(boost::move(a4))
Chris@102 419 , v5_(boost::move(a5))
Chris@102 420 , v6_(boost::move(a6))
Chris@102 421 {}
Chris@102 422
Chris@102 423 BOOST_SYMBOL_VISIBLE
Chris@102 424 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 425 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 426 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 427 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 428 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 429 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 430 , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
Chris@102 431 , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
Chris@102 432 , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
Chris@102 433 {}
Chris@102 434
Chris@102 435 result_type operator()()
Chris@102 436 {
Chris@102 437 return invoke(boost::move(fp_)
Chris@102 438 , boost::move(v0_)
Chris@102 439 , boost::move(v1_)
Chris@102 440 , boost::move(v2_)
Chris@102 441 , boost::move(v3_)
Chris@102 442 , boost::move(v4_)
Chris@102 443 , boost::move(v5_)
Chris@102 444 , boost::move(v6_)
Chris@102 445 );
Chris@102 446 }
Chris@102 447 };
Chris@102 448 template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5>
Chris@102 449 class invoker<Fp, T0, T1, T2, T3, T4, T5>
Chris@102 450 {
Chris@102 451 Fp fp_;
Chris@102 452 T0 v0_;
Chris@102 453 T1 v1_;
Chris@102 454 T2 v2_;
Chris@102 455 T3 v3_;
Chris@102 456 T4 v4_;
Chris@102 457 T5 v5_;
Chris@102 458 public:
Chris@102 459 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 460 typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5)>::type result_type;
Chris@102 461
Chris@102 462 BOOST_SYMBOL_VISIBLE
Chris@102 463 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 464 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 465 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 466 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 467 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 468 , BOOST_THREAD_RV_REF(T4) a4
Chris@102 469 , BOOST_THREAD_RV_REF(T5) a5
Chris@102 470 )
Chris@102 471 : fp_(boost::move(f))
Chris@102 472 , v0_(boost::move(a0))
Chris@102 473 , v1_(boost::move(a1))
Chris@102 474 , v2_(boost::move(a2))
Chris@102 475 , v3_(boost::move(a3))
Chris@102 476 , v4_(boost::move(a4))
Chris@102 477 , v5_(boost::move(a5))
Chris@102 478 {}
Chris@102 479
Chris@102 480 BOOST_SYMBOL_VISIBLE
Chris@102 481 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 482 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 483 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 484 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 485 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 486 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 487 , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
Chris@102 488 , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
Chris@102 489 {}
Chris@102 490
Chris@102 491 result_type operator()()
Chris@102 492 {
Chris@102 493 return invoke(boost::move(fp_)
Chris@102 494 , boost::move(v0_)
Chris@102 495 , boost::move(v1_)
Chris@102 496 , boost::move(v2_)
Chris@102 497 , boost::move(v3_)
Chris@102 498 , boost::move(v4_)
Chris@102 499 , boost::move(v5_)
Chris@102 500 );
Chris@102 501 }
Chris@102 502 };
Chris@102 503 template <class Fp, class T0, class T1, class T2, class T3, class T4>
Chris@102 504 class invoker<Fp, T0, T1, T2, T3, T4>
Chris@102 505 {
Chris@102 506 Fp fp_;
Chris@102 507 T0 v0_;
Chris@102 508 T1 v1_;
Chris@102 509 T2 v2_;
Chris@102 510 T3 v3_;
Chris@102 511 T4 v4_;
Chris@102 512 public:
Chris@102 513 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 514 typedef typename result_of<Fp(T0, T1, T2, T3, T4)>::type result_type;
Chris@102 515
Chris@102 516 BOOST_SYMBOL_VISIBLE
Chris@102 517 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 518 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 519 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 520 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 521 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 522 , BOOST_THREAD_RV_REF(T4) a4
Chris@102 523 )
Chris@102 524 : fp_(boost::move(f))
Chris@102 525 , v0_(boost::move(a0))
Chris@102 526 , v1_(boost::move(a1))
Chris@102 527 , v2_(boost::move(a2))
Chris@102 528 , v3_(boost::move(a3))
Chris@102 529 , v4_(boost::move(a4))
Chris@102 530 {}
Chris@102 531
Chris@102 532 BOOST_SYMBOL_VISIBLE
Chris@102 533 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 534 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 535 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 536 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 537 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 538 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 539 , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
Chris@102 540 {}
Chris@102 541
Chris@102 542 result_type operator()()
Chris@102 543 {
Chris@102 544 return invoke(boost::move(fp_)
Chris@102 545 , boost::move(v0_)
Chris@102 546 , boost::move(v1_)
Chris@102 547 , boost::move(v2_)
Chris@102 548 , boost::move(v3_)
Chris@102 549 , boost::move(v4_)
Chris@102 550 );
Chris@102 551 }
Chris@102 552 };
Chris@102 553 template <class Fp, class T0, class T1, class T2, class T3>
Chris@102 554 class invoker<Fp, T0, T1, T2, T3>
Chris@102 555 {
Chris@102 556 Fp fp_;
Chris@102 557 T0 v0_;
Chris@102 558 T1 v1_;
Chris@102 559 T2 v2_;
Chris@102 560 T3 v3_;
Chris@102 561 public:
Chris@102 562 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 563 typedef typename result_of<Fp(T0, T1, T2, T3)>::type result_type;
Chris@102 564
Chris@102 565 BOOST_SYMBOL_VISIBLE
Chris@102 566 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 567 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 568 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 569 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 570 , BOOST_THREAD_RV_REF(T3) a3
Chris@102 571 )
Chris@102 572 : fp_(boost::move(f))
Chris@102 573 , v0_(boost::move(a0))
Chris@102 574 , v1_(boost::move(a1))
Chris@102 575 , v2_(boost::move(a2))
Chris@102 576 , v3_(boost::move(a3))
Chris@102 577 {}
Chris@102 578
Chris@102 579 BOOST_SYMBOL_VISIBLE
Chris@102 580 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 581 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 582 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 583 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 584 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 585 , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
Chris@102 586 {}
Chris@102 587
Chris@102 588 result_type operator()()
Chris@102 589 {
Chris@102 590 return invoke(boost::move(fp_)
Chris@102 591 , boost::move(v0_)
Chris@102 592 , boost::move(v1_)
Chris@102 593 , boost::move(v2_)
Chris@102 594 , boost::move(v3_)
Chris@102 595 );
Chris@102 596 }
Chris@102 597 };
Chris@102 598 template <class Fp, class T0, class T1, class T2>
Chris@102 599 class invoker<Fp, T0, T1, T2>
Chris@102 600 {
Chris@102 601 Fp fp_;
Chris@102 602 T0 v0_;
Chris@102 603 T1 v1_;
Chris@102 604 T2 v2_;
Chris@102 605 public:
Chris@102 606 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 607 typedef typename result_of<Fp(T0, T1, T2)>::type result_type;
Chris@102 608
Chris@102 609 BOOST_SYMBOL_VISIBLE
Chris@102 610 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 611 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 612 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 613 , BOOST_THREAD_RV_REF(T2) a2
Chris@102 614 )
Chris@102 615 : fp_(boost::move(f))
Chris@102 616 , v0_(boost::move(a0))
Chris@102 617 , v1_(boost::move(a1))
Chris@102 618 , v2_(boost::move(a2))
Chris@102 619 {}
Chris@102 620
Chris@102 621 BOOST_SYMBOL_VISIBLE
Chris@102 622 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 623 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 624 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 625 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 626 , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
Chris@102 627 {}
Chris@102 628
Chris@102 629 result_type operator()()
Chris@102 630 {
Chris@102 631 return invoke(boost::move(fp_)
Chris@102 632 , boost::move(v0_)
Chris@102 633 , boost::move(v1_)
Chris@102 634 , boost::move(v2_)
Chris@102 635 );
Chris@102 636 }
Chris@102 637 };
Chris@102 638 template <class Fp, class T0, class T1>
Chris@102 639 class invoker<Fp, T0, T1>
Chris@102 640 {
Chris@102 641 Fp fp_;
Chris@102 642 T0 v0_;
Chris@102 643 T1 v1_;
Chris@102 644 public:
Chris@102 645 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 646 typedef typename result_of<Fp(T0, T1)>::type result_type;
Chris@102 647
Chris@102 648 BOOST_SYMBOL_VISIBLE
Chris@102 649 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 650 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 651 , BOOST_THREAD_RV_REF(T1) a1
Chris@102 652 )
Chris@102 653 : fp_(boost::move(f))
Chris@102 654 , v0_(boost::move(a0))
Chris@102 655 , v1_(boost::move(a1))
Chris@102 656 {}
Chris@102 657
Chris@102 658 BOOST_SYMBOL_VISIBLE
Chris@102 659 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 660 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 661 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 662 , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
Chris@102 663 {}
Chris@102 664
Chris@102 665 result_type operator()()
Chris@102 666 {
Chris@102 667 return invoke(boost::move(fp_)
Chris@102 668 , boost::move(v0_)
Chris@102 669 , boost::move(v1_)
Chris@102 670 );
Chris@102 671 }
Chris@102 672 };
Chris@102 673 template <class Fp, class T0>
Chris@102 674 class invoker<Fp, T0>
Chris@102 675 {
Chris@102 676 Fp fp_;
Chris@102 677 T0 v0_;
Chris@102 678 public:
Chris@102 679 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 680 typedef typename result_of<Fp(T0)>::type result_type;
Chris@102 681
Chris@102 682 BOOST_SYMBOL_VISIBLE
Chris@102 683 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
Chris@102 684 , BOOST_THREAD_RV_REF(T0) a0
Chris@102 685 )
Chris@102 686 : fp_(boost::move(f))
Chris@102 687 , v0_(boost::move(a0))
Chris@102 688 {}
Chris@102 689
Chris@102 690 BOOST_SYMBOL_VISIBLE
Chris@102 691 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 692 : fp_(boost::move(BOOST_THREAD_RV(f).fp))
Chris@102 693 , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
Chris@102 694 {}
Chris@102 695
Chris@102 696 result_type operator()()
Chris@102 697 {
Chris@102 698 return invoke(boost::move(fp_)
Chris@102 699 , boost::move(v0_)
Chris@102 700 );
Chris@102 701 }
Chris@102 702 };
Chris@102 703 template <class Fp>
Chris@102 704 class invoker<Fp>
Chris@102 705 {
Chris@102 706 Fp fp_;
Chris@102 707 public:
Chris@102 708 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 709 typedef typename result_of<Fp()>::type result_type;
Chris@102 710 BOOST_SYMBOL_VISIBLE
Chris@102 711 explicit invoker(BOOST_THREAD_FWD_REF(Fp) f)
Chris@102 712 : fp_(boost::move(f))
Chris@102 713 {}
Chris@102 714
Chris@102 715 BOOST_SYMBOL_VISIBLE
Chris@102 716 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 717 : fp_(boost::move(f.fp_))
Chris@102 718 {}
Chris@102 719 result_type operator()()
Chris@102 720 {
Chris@102 721 return fp_();
Chris@102 722 }
Chris@102 723 };
Chris@102 724 template <class R>
Chris@102 725 class invoker<R(*)()>
Chris@102 726 {
Chris@102 727 typedef R(*Fp)();
Chris@102 728 Fp fp_;
Chris@102 729 public:
Chris@102 730 BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
Chris@102 731 typedef typename result_of<Fp()>::type result_type;
Chris@102 732 BOOST_SYMBOL_VISIBLE
Chris@102 733 explicit invoker(Fp f)
Chris@102 734 : fp_(f)
Chris@102 735 {}
Chris@102 736
Chris@102 737 BOOST_SYMBOL_VISIBLE
Chris@102 738 invoker(BOOST_THREAD_RV_REF(invoker) f)
Chris@102 739 : fp_(f.fp_)
Chris@102 740 {}
Chris@102 741 result_type operator()()
Chris@102 742 {
Chris@102 743 return fp_();
Chris@102 744 }
Chris@102 745 };
Chris@102 746 #endif
Chris@102 747 #endif
Chris@102 748
Chris@102 749 }
Chris@102 750 }
Chris@102 751
Chris@102 752 #include <boost/thread/detail/variadic_footer.hpp>
Chris@102 753
Chris@102 754 #endif // header