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
|