Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
1 // Copyright (C) 2012-2013 Vicente J. Botet Escriba | |
2 // | |
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | |
6 // 2013/04 Vicente J. Botet Escriba | |
7 // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined. | |
8 // Make use of Boost.Move | |
9 // Make use of Boost.Tuple (movable) | |
10 // 2012 Vicente J. Botet Escriba | |
11 // Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined | |
12 // 2012 Vicente J. Botet Escriba | |
13 // Adapt to boost libc++ implementation | |
14 | |
15 //===----------------------------------------------------------------------===// | |
16 // | |
17 // The LLVM Compiler Infrastructure | |
18 // | |
19 // This file is dual licensed under the MIT and the University of Illinois Open | |
20 // Source Licenses. See LICENSE.TXT for details. | |
21 // | |
22 // The invoke code is based on the one from libcxx. | |
23 //===----------------------------------------------------------------------===// | |
24 | |
25 #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP | |
26 #define BOOST_THREAD_DETAIL_INVOKE_HPP | |
27 | |
28 #include <boost/config.hpp> | |
29 #include <boost/static_assert.hpp> | |
30 #include <boost/thread/detail/move.hpp> | |
31 #include <boost/type_traits/is_base_of.hpp> | |
32 #include <boost/type_traits/remove_reference.hpp> | |
33 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | |
34 #include <functional> | |
35 #endif | |
36 | |
37 namespace boost | |
38 { | |
39 namespace detail | |
40 { | |
41 | |
42 | |
43 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \ | |
44 ! defined(BOOST_NO_SFINAE_EXPR) && \ | |
45 ! defined(BOOST_NO_CXX11_DECLTYPE) && \ | |
46 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \ | |
47 ! defined(BOOST_NO_CXX11_AUTO) | |
48 | |
49 #define BOOST_THREAD_PROVIDES_INVOKE | |
50 | |
51 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) | |
52 // bullets 1 and 2 | |
53 | |
54 template <class Fp, class A0, class ...Args> | |
55 inline auto | |
56 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
57 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...)) | |
58 { | |
59 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); | |
60 } | |
61 | |
62 template <class Fp, class A0, class ...Args> | |
63 inline auto | |
64 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
65 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...)) | |
66 { | |
67 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); | |
68 } | |
69 | |
70 // bullets 3 and 4 | |
71 | |
72 template <class Fp, class A0> | |
73 inline auto | |
74 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
75 -> decltype(boost::forward<A0>(a0).*f) | |
76 { | |
77 return boost::forward<A0>(a0).*f; | |
78 } | |
79 | |
80 template <class Fp, class A0> | |
81 inline auto | |
82 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
83 -> decltype((*boost::forward<A0>(a0)).*f) | |
84 { | |
85 return (*boost::forward<A0>(a0)).*f; | |
86 } | |
87 | |
88 // bullet 5 | |
89 | |
90 template <class Fp, class ...Args> | |
91 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) | |
92 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...)) | |
93 { | |
94 return boost::forward<Fp>(f)(boost::forward<Args>(args)...); | |
95 } | |
96 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES | |
97 | |
98 // bullets 1 and 2 | |
99 | |
100 template <class Fp, class A0> | |
101 inline | |
102 auto | |
103 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
104 -> decltype((boost::forward<A0>(a0).*f)()) | |
105 { | |
106 return (boost::forward<A0>(a0).*f)(); | |
107 } | |
108 template <class Fp, class A0, class A1> | |
109 inline | |
110 auto | |
111 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
112 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1))) | |
113 { | |
114 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)); | |
115 } | |
116 template <class Fp, class A0, class A1, class A2> | |
117 inline | |
118 auto | |
119 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) | |
120 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2))) | |
121 { | |
122 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); | |
123 } | |
124 | |
125 template <class Fp, class A0> | |
126 inline | |
127 auto | |
128 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
129 -> decltype(((*boost::forward<A0>(a0)).*f)()) | |
130 { | |
131 return ((*boost::forward<A0>(a0)).*f)(); | |
132 } | |
133 template <class Fp, class A0, class A1> | |
134 inline | |
135 auto | |
136 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
137 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1))) | |
138 { | |
139 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)); | |
140 } | |
141 template <class Fp, class A0, class A1> | |
142 inline | |
143 auto | |
144 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) | |
145 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2))) | |
146 { | |
147 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); | |
148 } | |
149 | |
150 // bullets 3 and 4 | |
151 | |
152 template <class Fp, class A0> | |
153 inline | |
154 auto | |
155 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
156 -> decltype(boost::forward<A0>(a0).*f) | |
157 { | |
158 return boost::forward<A0>(a0).*f; | |
159 } | |
160 | |
161 template <class Fp, class A0> | |
162 inline | |
163 auto | |
164 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) | |
165 -> decltype((*boost::forward<A0>(a0)).*f) | |
166 { | |
167 return (*boost::forward<A0>(a0)).*f; | |
168 } | |
169 | |
170 // bullet 5 | |
171 | |
172 template <class Fp> | |
173 inline | |
174 auto invoke(BOOST_THREAD_RV_REF(Fp) f) | |
175 -> decltype(boost::forward<Fp>(f)()) | |
176 { | |
177 return boost::forward<Fp>(f)(); | |
178 } | |
179 template <class Fp, class A1> | |
180 inline | |
181 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1) | |
182 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) | |
183 { | |
184 return boost::forward<Fp>(f)(boost::forward<A1>(a1)); | |
185 } template <class Fp, class A1, class A2> | |
186 inline | |
187 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
188 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) | |
189 { | |
190 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
191 } | |
192 template <class Fp, class A1, class A2, class A3> | |
193 inline | |
194 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) | |
195 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))) | |
196 { | |
197 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
198 } | |
199 | |
200 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES | |
201 | |
202 #elif ! defined(BOOST_NO_SFINAE_EXPR) && \ | |
203 ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \ | |
204 defined BOOST_MSVC | |
205 | |
206 template <class Ret, class Fp> | |
207 inline | |
208 Ret invoke(BOOST_THREAD_RV_REF(Fp) f) | |
209 { | |
210 return f(); | |
211 } | |
212 template <class Ret, class Fp, class A1> | |
213 inline | |
214 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) | |
215 { | |
216 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))(); | |
217 } | |
218 template <class Ret, class Fp, class A1, class A2> | |
219 inline | |
220 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
221 { | |
222 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))(); | |
223 } | |
224 template <class Ret, class Fp, class A1, class A2, class A3> | |
225 inline | |
226 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) | |
227 { | |
228 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))(); | |
229 } | |
230 | |
231 #define BOOST_THREAD_PROVIDES_INVOKE_RET | |
232 | |
233 #elif ! defined BOOST_MSVC | |
234 //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET | |
235 #define BOOST_THREAD_PROVIDES_INVOKE_RET | |
236 | |
237 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) | |
238 | |
239 // bullet 1 | |
240 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of | |
241 // type T or a reference to an object of type T or a reference to an object of a type derived from T | |
242 template <class Ret, class A, class A0, class ...Args> | |
243 inline | |
244 typename enable_if_c | |
245 < | |
246 is_base_of<A, typename remove_reference<A0>::type>::value, | |
247 Ret | |
248 >::type | |
249 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
250 { | |
251 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); | |
252 } | |
253 | |
254 template <class Ret, class A, class A0, class ...Args> | |
255 inline | |
256 typename enable_if_c | |
257 < | |
258 is_base_of<A, typename remove_reference<A0>::type>::value, | |
259 Ret | |
260 >::type | |
261 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
262 { | |
263 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); | |
264 } | |
265 | |
266 template <class Ret, class A, class A0, class ...Args> | |
267 inline | |
268 typename enable_if_c | |
269 < | |
270 is_base_of<A, typename remove_reference<A0>::type>::value, | |
271 Ret | |
272 >::type | |
273 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
274 { | |
275 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); | |
276 } | |
277 | |
278 template <class Ret, class A, class A0, class ...Args> | |
279 inline | |
280 typename enable_if_c | |
281 < | |
282 is_base_of<A, typename remove_reference<A0>::type>::value, | |
283 Ret | |
284 >::type | |
285 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
286 { | |
287 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); | |
288 } | |
289 | |
290 // bullet 2 | |
291 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of | |
292 // the types described in the previous item; | |
293 template <class Ret, class A, class A0, class ...Args> | |
294 inline | |
295 typename enable_if_c | |
296 < | |
297 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
298 Ret | |
299 >::type | |
300 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
301 { | |
302 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); | |
303 } | |
304 | |
305 template <class Ret, class A, class A0, class ...Args> | |
306 inline | |
307 typename enable_if_c | |
308 < | |
309 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
310 Ret | |
311 >::type | |
312 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
313 { | |
314 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); | |
315 } | |
316 | |
317 template <class Ret, class A, class A0, class ...Args> | |
318 inline | |
319 typename enable_if_c | |
320 < | |
321 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
322 Ret | |
323 >::type | |
324 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
325 { | |
326 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); | |
327 } | |
328 | |
329 template <class Ret, class A, class A0, class ...Args> | |
330 inline | |
331 typename enable_if_c | |
332 < | |
333 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
334 Ret | |
335 >::type | |
336 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) | |
337 { | |
338 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); | |
339 } | |
340 | |
341 // bullet 3 | |
342 // 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 | |
343 // reference to an object of type T or a reference to an object of a type derived from T; | |
344 // template <class Ret, class A, class A0> | |
345 // inline | |
346 // typename enable_if_c | |
347 // < | |
348 // is_base_of<A, typename remove_reference<A0>::type>::value, | |
349 // typename detail::apply_cv<A0, A>::type& | |
350 // >::type | |
351 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
352 // { | |
353 // return boost::forward<A0>(a0).*f; | |
354 // } | |
355 | |
356 // bullet 4 | |
357 // (*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 | |
358 //described in the previous item; | |
359 | |
360 // template <class A0, class Ret, bool> | |
361 // struct d4th_helper | |
362 // { | |
363 // }; | |
364 // | |
365 // template <class A0, class Ret> | |
366 // struct d4th_helper<A0, Ret, true> | |
367 // { | |
368 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type; | |
369 // }; | |
370 // | |
371 // template <class Ret, class A, class A0> | |
372 // inline | |
373 // typename detail::4th_helper<A, Ret, | |
374 // !is_base_of<A, | |
375 // typename remove_reference<A0>::type | |
376 // >::value | |
377 // >::type& | |
378 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
379 // { | |
380 // return (*boost::forward<A0>(a0)).*f; | |
381 // } | |
382 | |
383 // template <class Ret, class A, class A0> | |
384 // inline | |
385 // typename enable_if_c | |
386 // < | |
387 // !is_base_of<A, typename remove_reference<A0>::type>::value, | |
388 // typename detail::ref_return1<Ret A::*, A0>::type | |
389 // >::type | |
390 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
391 // { | |
392 // return (*boost::forward<A0>(a0)).*f; | |
393 // } | |
394 | |
395 // bullet 5 | |
396 // f(t1, t2, ..., tN) in all other cases. | |
397 | |
398 template <class Ret, class Fp, class ...Args> | |
399 inline | |
400 typename enable_if_c | |
401 < | |
402 ! is_member_function_pointer<Fp>::value, | |
403 Ret | |
404 >::type | |
405 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) | |
406 { | |
407 return boost::forward<Fp>(f)(boost::forward<Args>(args)...); | |
408 } | |
409 template <class Ret, class ...Args> | |
410 inline Ret | |
411 invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args) | |
412 { | |
413 return f(boost::forward<Args>(args)...); | |
414 } | |
415 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES | |
416 // bullet 1 | |
417 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of | |
418 // type T or a reference to an object of type T or a reference to an object of a type derived from T | |
419 | |
420 template <class Ret, class A, class A0> | |
421 inline | |
422 typename enable_if_c | |
423 < | |
424 is_base_of<A, typename remove_reference<A0>::type>::value, | |
425 Ret | |
426 >::type | |
427 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) | |
428 { | |
429 return (boost::forward<A0>(a0).*f)(); | |
430 } | |
431 template <class Ret, class A, class A0, class A1> | |
432 inline | |
433 typename enable_if_c | |
434 < | |
435 is_base_of<A, typename remove_reference<A0>::type>::value, | |
436 Ret | |
437 >::type | |
438 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
439 { | |
440 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); | |
441 } | |
442 template <class Ret, class A, class A0, class A1> | |
443 inline | |
444 typename enable_if_c | |
445 < | |
446 is_base_of<A, typename remove_reference<A0>::type>::value, | |
447 Ret | |
448 >::type | |
449 invoke(Ret (A::*f)(A1), A0 a0, A1 a1) | |
450 { | |
451 return (a0.*f)(a1); | |
452 } | |
453 template <class Ret, class A, class A0, class A1, class A2> | |
454 inline | |
455 typename enable_if_c | |
456 < | |
457 is_base_of<A, typename remove_reference<A0>::type>::value, | |
458 Ret | |
459 >::type | |
460 invoke(Ret (A::*f)(A1, A2), | |
461 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 | |
462 ) | |
463 { | |
464 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
465 } | |
466 template <class Ret, class A, class A0, class A1, class A2> | |
467 inline | |
468 typename enable_if_c | |
469 < | |
470 is_base_of<A, typename remove_reference<A0>::type>::value, | |
471 Ret | |
472 >::type | |
473 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) | |
474 { | |
475 return (a0.*f)(a1, a2); | |
476 } | |
477 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
478 inline | |
479 typename enable_if_c | |
480 < | |
481 is_base_of<A, typename remove_reference<A0>::type>::value, | |
482 Ret | |
483 >::type | |
484 invoke(Ret (A::*f)(A1, A2, A3), | |
485 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
486 { | |
487 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
488 } | |
489 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
490 inline | |
491 typename enable_if_c | |
492 < | |
493 is_base_of<A, typename remove_reference<A0>::type>::value, | |
494 Ret | |
495 >::type | |
496 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) | |
497 { | |
498 return (a0.*f)(a1, a2, a3); | |
499 } | |
500 | |
501 /// | |
502 template <class Ret, class A, class A0> | |
503 inline | |
504 typename enable_if_c | |
505 < | |
506 is_base_of<A, typename remove_reference<A0>::type>::value, | |
507 Ret | |
508 >::type | |
509 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) | |
510 { | |
511 return (boost::forward<A0>(a0).*f)(); | |
512 } | |
513 template <class Ret, class A, class A0, class A1> | |
514 inline | |
515 typename enable_if_c | |
516 < | |
517 is_base_of<A, typename remove_reference<A0>::type>::value, | |
518 Ret | |
519 >::type | |
520 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
521 { | |
522 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); | |
523 } | |
524 template <class Ret, class A, class A0, class A1> | |
525 inline | |
526 typename enable_if_c | |
527 < | |
528 is_base_of<A, typename remove_reference<A0>::type>::value, | |
529 Ret | |
530 >::type | |
531 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) | |
532 { | |
533 return (a0.*f)(a1); | |
534 } | |
535 template <class Ret, class A, class A0, class A1, class A2> | |
536 inline | |
537 typename enable_if_c | |
538 < | |
539 is_base_of<A, typename remove_reference<A0>::type>::value, | |
540 Ret | |
541 >::type | |
542 invoke(Ret (A::*f)(A1, A2) const, | |
543 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 | |
544 ) | |
545 { | |
546 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2) | |
547 ); | |
548 } | |
549 template <class Ret, class A, class A0, class A1, class A2> | |
550 inline | |
551 typename enable_if_c | |
552 < | |
553 is_base_of<A, typename remove_reference<A0>::type>::value, | |
554 Ret | |
555 >::type | |
556 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) | |
557 { | |
558 return (a0.*f)(a1, a2); | |
559 } | |
560 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
561 inline | |
562 typename enable_if_c | |
563 < | |
564 is_base_of<A, typename remove_reference<A0>::type>::value, | |
565 Ret | |
566 >::type | |
567 invoke(Ret (A::*f)(A1, A2, A3) const, | |
568 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 | |
569 ) | |
570 { | |
571 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
572 } | |
573 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
574 inline | |
575 typename enable_if_c | |
576 < | |
577 is_base_of<A, typename remove_reference<A0>::type>::value, | |
578 Ret | |
579 >::type | |
580 invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3) | |
581 { | |
582 return (a0.*f)(a1, a2, a3); | |
583 } | |
584 /// | |
585 template <class Ret, class A, class A0> | |
586 inline | |
587 typename enable_if_c | |
588 < | |
589 is_base_of<A, typename remove_reference<A0>::type>::value, | |
590 Ret | |
591 >::type | |
592 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) | |
593 { | |
594 return (boost::forward<A0>(a0).*f)(); | |
595 } | |
596 template <class Ret, class A, class A0, class A1> | |
597 inline | |
598 typename enable_if_c | |
599 < | |
600 is_base_of<A, typename remove_reference<A0>::type>::value, | |
601 Ret | |
602 >::type | |
603 invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
604 { | |
605 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); | |
606 } | |
607 template <class Ret, class A, class A0, class A1> | |
608 inline | |
609 typename enable_if_c | |
610 < | |
611 is_base_of<A, typename remove_reference<A0>::type>::value, | |
612 Ret | |
613 >::type | |
614 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) | |
615 { | |
616 return (a0.*f)(a1); | |
617 } | |
618 template <class Ret, class A, class A0, class A1, class A2> | |
619 inline | |
620 typename enable_if_c | |
621 < | |
622 is_base_of<A, typename remove_reference<A0>::type>::value, | |
623 Ret | |
624 >::type | |
625 invoke(Ret (A::*f)(A1, A2) volatile, | |
626 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
627 { | |
628 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
629 } | |
630 template <class Ret, class A, class A0, class A1, class A2> | |
631 inline | |
632 typename enable_if_c | |
633 < | |
634 is_base_of<A, typename remove_reference<A0>::type>::value, | |
635 Ret | |
636 >::type | |
637 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 ) | |
638 { | |
639 return (a0.*f)(a1, a2); | |
640 } | |
641 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
642 inline | |
643 typename enable_if_c | |
644 < | |
645 is_base_of<A, typename remove_reference<A0>::type>::value, | |
646 Ret | |
647 >::type | |
648 invoke(Ret (A::*f)(A1, A2, A3) volatile, | |
649 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 | |
650 ) | |
651 { | |
652 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
653 } | |
654 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
655 inline | |
656 typename enable_if_c | |
657 < | |
658 is_base_of<A, typename remove_reference<A0>::type>::value, | |
659 Ret | |
660 >::type | |
661 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) | |
662 { | |
663 return (a0.*f)(a1, a2, a3); | |
664 } | |
665 /// | |
666 template <class Ret, class A, class A0> | |
667 inline | |
668 typename enable_if_c | |
669 < | |
670 is_base_of<A, typename remove_reference<A0>::type>::value, | |
671 Ret | |
672 >::type | |
673 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) | |
674 { | |
675 return (boost::forward<A0>(a0).*f)(); | |
676 } | |
677 template <class Ret, class A, class A0, class A1> | |
678 inline | |
679 typename enable_if_c | |
680 < | |
681 is_base_of<A, typename remove_reference<A0>::type>::value, | |
682 Ret | |
683 >::type | |
684 invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
685 { | |
686 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); | |
687 } | |
688 template <class Ret, class A, class A0, class A1> | |
689 inline | |
690 typename enable_if_c | |
691 < | |
692 is_base_of<A, typename remove_reference<A0>::type>::value, | |
693 Ret | |
694 >::type | |
695 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) | |
696 { | |
697 return (a0.*f)(a1); | |
698 } | |
699 template <class Ret, class A, class A0, class A1, class A2> | |
700 inline | |
701 typename enable_if_c | |
702 < | |
703 is_base_of<A, typename remove_reference<A0>::type>::value, | |
704 Ret | |
705 >::type | |
706 invoke(Ret (A::*f)(A1, A2) const volatile, | |
707 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 | |
708 ) | |
709 { | |
710 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
711 } | |
712 template <class Ret, class A, class A0, class A1, class A2> | |
713 inline | |
714 typename enable_if_c | |
715 < | |
716 is_base_of<A, typename remove_reference<A0>::type>::value, | |
717 Ret | |
718 >::type | |
719 invoke(Ret (A::*f)(A1, A2) const volatile, | |
720 A0 a0, A1 a1, A2 a2 | |
721 ) | |
722 { | |
723 return (a0.*f)(a1, a2); | |
724 } | |
725 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
726 inline | |
727 typename enable_if_c | |
728 < | |
729 is_base_of<A, typename remove_reference<A0>::type>::value, | |
730 Ret | |
731 >::type | |
732 invoke(Ret (A::*f)(A1, A2, A3) const volatile, | |
733 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 | |
734 ) | |
735 { | |
736 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
737 } | |
738 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
739 inline | |
740 typename enable_if_c | |
741 < | |
742 is_base_of<A, typename remove_reference<A0>::type>::value, | |
743 Ret | |
744 >::type | |
745 invoke(Ret (A::*f)(A1, A2, A3) const volatile, | |
746 A0 a0, A1 a1, A2 a2, A3 a3 | |
747 ) | |
748 { | |
749 return (a0.*f)(a1, a2, a3); | |
750 } | |
751 | |
752 // bullet 2 | |
753 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of | |
754 // the types described in the previous item; | |
755 template <class Ret, class A, class A0> | |
756 inline | |
757 typename enable_if_c | |
758 < | |
759 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
760 Ret | |
761 >::type | |
762 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) | |
763 { | |
764 return ((*boost::forward<A0>(a0)).*f)(); | |
765 } | |
766 template <class Ret, class A, class A0, class A1> | |
767 inline | |
768 typename enable_if_c | |
769 < | |
770 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
771 Ret | |
772 >::type | |
773 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
774 { | |
775 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); | |
776 } | |
777 template <class Ret, class A, class A0, class A1> | |
778 inline | |
779 typename enable_if_c | |
780 < | |
781 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
782 Ret | |
783 >::type | |
784 invoke(Ret (A::*f)(A1), A0 a0, A1 a1) | |
785 { | |
786 return ((*a0).*f)(a1); | |
787 } | |
788 template <class Ret, class A, class A0, class A1, class A2> | |
789 inline | |
790 typename enable_if_c | |
791 < | |
792 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
793 Ret | |
794 >::type | |
795 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)), | |
796 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
797 { | |
798 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
799 } | |
800 template <class Ret, class A, class A0, class A1, class A2> | |
801 inline | |
802 typename enable_if_c | |
803 < | |
804 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
805 Ret | |
806 >::type | |
807 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) | |
808 { | |
809 return ((*a0).*f)(a1, a2); | |
810 } | |
811 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
812 inline | |
813 typename enable_if_c | |
814 < | |
815 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
816 Ret | |
817 >::type | |
818 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)), | |
819 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
820 { | |
821 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3) | |
822 ); | |
823 } | |
824 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
825 inline | |
826 typename enable_if_c | |
827 < | |
828 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
829 Ret | |
830 >::type | |
831 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) | |
832 { | |
833 return ((*a0).*f)(a1, a2, a3); | |
834 } | |
835 | |
836 /// | |
837 template <class Ret, class A, class A0> | |
838 inline | |
839 typename enable_if_c | |
840 < | |
841 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
842 Ret | |
843 >::type | |
844 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) | |
845 { | |
846 return ((*boost::forward<A0>(a0)).*f)(); | |
847 } | |
848 template <class Ret, class A, class A0, class A1> | |
849 inline | |
850 typename enable_if_c | |
851 < | |
852 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
853 Ret | |
854 >::type | |
855 invoke(Ret (A::*f)(A1) const, | |
856 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
857 { | |
858 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); | |
859 } | |
860 template <class Ret, class A, class A0, class A1> | |
861 inline | |
862 typename enable_if_c | |
863 < | |
864 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
865 Ret | |
866 >::type | |
867 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1) | |
868 { | |
869 return ((*boost::forward<A0>(a0)).*f)(a1); | |
870 } | |
871 template <class Ret, class A, class A0, class A1> | |
872 inline | |
873 typename enable_if_c | |
874 < | |
875 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
876 Ret | |
877 >::type | |
878 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) | |
879 { | |
880 return ((*a0).*f)(a1); | |
881 } | |
882 template <class Ret, class A, class A0, class A1, class A2> | |
883 inline | |
884 typename enable_if_c | |
885 < | |
886 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
887 Ret | |
888 >::type | |
889 invoke(Ret (A::*f)(A1, A2) const, | |
890 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
891 { | |
892 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
893 } | |
894 template <class Ret, class A, class A0, class A1, class A2> | |
895 inline | |
896 typename enable_if_c | |
897 < | |
898 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
899 Ret | |
900 >::type | |
901 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) | |
902 { | |
903 return ((*a0).*f)(a1, a2); | |
904 } | |
905 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
906 inline | |
907 typename enable_if_c | |
908 < | |
909 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
910 Ret | |
911 >::type | |
912 invoke(Ret (A::*f)(A1, A2, A3) const, | |
913 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
914 { | |
915 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
916 } | |
917 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
918 inline | |
919 typename enable_if_c | |
920 < | |
921 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
922 Ret | |
923 >::type | |
924 invoke(Ret (A::*f)(A1, A2, A3) const, | |
925 A0 a0, A1 a1, A2 a2, A3 a3) | |
926 { | |
927 return ((*a0).*f)(a1, a2, a3); | |
928 } | |
929 /// | |
930 template <class Ret, class A, class A0> | |
931 inline | |
932 typename enable_if_c | |
933 < | |
934 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
935 Ret | |
936 >::type | |
937 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) | |
938 { | |
939 return ((*boost::forward<A0>(a0)).*f)(); | |
940 } | |
941 template <class Ret, class A, class A0, class A1> | |
942 inline | |
943 typename enable_if_c | |
944 < | |
945 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
946 Ret | |
947 >::type | |
948 invoke(Ret (A::*f)(A1) volatile, | |
949 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
950 { | |
951 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); | |
952 } | |
953 template <class Ret, class A, class A0, class A1> | |
954 inline | |
955 typename enable_if_c | |
956 < | |
957 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
958 Ret | |
959 >::type | |
960 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) | |
961 { | |
962 return ((*a0).*f)(a1); | |
963 } | |
964 template <class Ret, class A, class A0, class A1, class A2> | |
965 inline | |
966 typename enable_if_c | |
967 < | |
968 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
969 Ret | |
970 >::type | |
971 invoke(Ret (A::*f)(A1, A2) volatile, | |
972 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
973 { | |
974 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
975 } | |
976 template <class Ret, class A, class A0, class A1, class A2> | |
977 inline | |
978 typename enable_if_c | |
979 < | |
980 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
981 Ret | |
982 >::type | |
983 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2) | |
984 { | |
985 return ((*a0).*f)(a1, a2); | |
986 } | |
987 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
988 inline | |
989 typename enable_if_c | |
990 < | |
991 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
992 Ret | |
993 >::type | |
994 invoke(Ret (A::*f)(A1, A2, A3) volatile, | |
995 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
996 { | |
997 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
998 } | |
999 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
1000 inline | |
1001 typename enable_if_c | |
1002 < | |
1003 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1004 Ret | |
1005 >::type | |
1006 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) | |
1007 { | |
1008 return ((*a0).*f)(a1, a2, a3); | |
1009 } | |
1010 /// | |
1011 template <class Ret, class A, class A0> | |
1012 inline | |
1013 typename enable_if_c | |
1014 < | |
1015 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1016 Ret | |
1017 >::type | |
1018 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) | |
1019 { | |
1020 return ((*boost::forward<A0>(a0)).*f)(); | |
1021 } | |
1022 template <class Ret, class A, class A0> | |
1023 inline | |
1024 typename enable_if_c | |
1025 < | |
1026 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1027 Ret | |
1028 >::type | |
1029 invoke(Ret (A::*f)() const volatile, A0 a0) | |
1030 { | |
1031 return ((*a0).*f)(); | |
1032 } | |
1033 template <class Ret, class A, class A0, class A1> | |
1034 inline | |
1035 typename enable_if_c | |
1036 < | |
1037 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1038 Ret | |
1039 >::type | |
1040 invoke(Ret (A::*f)(A1) const volatile, | |
1041 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) | |
1042 { | |
1043 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); | |
1044 } | |
1045 template <class Ret, class A, class A0, class A1> | |
1046 inline | |
1047 typename enable_if_c | |
1048 < | |
1049 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1050 Ret | |
1051 >::type | |
1052 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) | |
1053 { | |
1054 return ((*a0).*f)(a1); | |
1055 } | |
1056 template <class Ret, class A, class A0, class A1, class A2> | |
1057 inline | |
1058 typename enable_if_c | |
1059 < | |
1060 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1061 Ret | |
1062 >::type | |
1063 invoke(Ret (A::*f)(A1, A2) const volatile, | |
1064 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
1065 { | |
1066 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
1067 } | |
1068 template <class Ret, class A, class A0, class A1, class A2> | |
1069 inline | |
1070 typename enable_if_c | |
1071 < | |
1072 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1073 Ret | |
1074 >::type | |
1075 invoke(Ret (A::*f)(A1, A2) const volatile, | |
1076 A0 a0, A1 a1, A2 a2) | |
1077 { | |
1078 return ((*a0).*f)(a1, a2); | |
1079 } | |
1080 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
1081 inline | |
1082 typename enable_if_c | |
1083 < | |
1084 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1085 Ret | |
1086 >::type | |
1087 invoke(Ret (A::*f)(A1, A2, A3) const volatile, | |
1088 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
1089 { | |
1090 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
1091 } | |
1092 template <class Ret, class A, class A0, class A1, class A2, class A3> | |
1093 inline | |
1094 typename enable_if_c | |
1095 < | |
1096 ! is_base_of<A, typename remove_reference<A0>::type>::value, | |
1097 Ret | |
1098 >::type | |
1099 invoke(Ret (A::*f)(A1, A2, A3) const volatile, | |
1100 A0 a0, A1 a1, A2 a2, A3 a3) | |
1101 { | |
1102 return ((*a0).*f)(a1, a2, a3); | |
1103 } | |
1104 // bullet 3 | |
1105 // 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 | |
1106 // reference to an object of type T or a reference to an object of a type derived from T; | |
1107 // template <class Ret, class A, class A0> | |
1108 // inline | |
1109 // typename enable_if_c | |
1110 // < | |
1111 // is_base_of<A, typename remove_reference<A0>::type>::value, | |
1112 // typename detail::apply_cv<A0, A>::type& | |
1113 // >::type | |
1114 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
1115 // { | |
1116 // return boost::forward<A0>(a0).*f; | |
1117 // } | |
1118 | |
1119 // bullet 4 | |
1120 // (*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 | |
1121 //described in the previous item; | |
1122 | |
1123 // template <class A0, class Ret, bool> | |
1124 // struct d4th_helper | |
1125 // { | |
1126 // }; | |
1127 // | |
1128 // template <class A0, class Ret> | |
1129 // struct d4th_helper<A0, Ret, true> | |
1130 // { | |
1131 // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type; | |
1132 // }; | |
1133 // | |
1134 // template <class Ret, class A, class A0> | |
1135 // inline | |
1136 // typename detail::4th_helper<A, Ret, | |
1137 // !is_base_of<A, | |
1138 // typename remove_reference<A0>::type | |
1139 // >::value | |
1140 // >::type& | |
1141 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
1142 // { | |
1143 // return (*boost::forward<A0>(a0)).*f; | |
1144 // } | |
1145 | |
1146 // template <class Ret, class A, class A0> | |
1147 // inline | |
1148 // typename enable_if_c | |
1149 // < | |
1150 // !is_base_of<A, typename remove_reference<A0>::type>::value, | |
1151 // typename detail::ref_return1<Ret A::*, A0>::type | |
1152 // >::type | |
1153 // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) | |
1154 // { | |
1155 // return (*boost::forward<A0>(a0)).*f; | |
1156 // } | |
1157 | |
1158 // bullet 5 | |
1159 // f(t1, t2, ..., tN) in all other cases. | |
1160 | |
1161 template <class Ret, class Fp> | |
1162 inline | |
1163 typename enable_if_c | |
1164 < | |
1165 ! is_member_function_pointer<Fp>::value, | |
1166 Ret | |
1167 >::type | |
1168 invoke(BOOST_THREAD_RV_REF(Fp) f) | |
1169 { | |
1170 return boost::forward<Fp>(f)(); | |
1171 } | |
1172 template <class Ret, class Fp, class A1> | |
1173 inline | |
1174 typename enable_if_c | |
1175 < | |
1176 ! is_member_function_pointer<Fp>::value, | |
1177 Ret | |
1178 >::type | |
1179 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) | |
1180 { | |
1181 return boost::forward<Fp>(f)(boost::forward<A1>(a1)); | |
1182 } | |
1183 template <class Ret, class Fp, class A1> | |
1184 inline | |
1185 typename enable_if_c | |
1186 < | |
1187 ! is_member_function_pointer<Fp>::value, | |
1188 Ret | |
1189 >::type | |
1190 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1) | |
1191 { | |
1192 return boost::forward<Fp>(f)(a1); | |
1193 } | |
1194 template <class Ret, class Fp, class A1, class A2> | |
1195 inline | |
1196 typename enable_if_c | |
1197 < | |
1198 ! is_member_function_pointer<Fp>::value, | |
1199 Ret | |
1200 >::type | |
1201 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
1202 { | |
1203 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
1204 } | |
1205 template <class Ret, class Fp, class A1, class A2> | |
1206 inline | |
1207 typename enable_if_c | |
1208 < | |
1209 ! is_member_function_pointer<Fp>::value, | |
1210 Ret | |
1211 >::type | |
1212 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2) | |
1213 { | |
1214 return boost::forward<Fp>(f)(a1, a2); | |
1215 } | |
1216 template <class Ret, class Fp, class A1, class A2, class A3> | |
1217 inline | |
1218 typename enable_if_c | |
1219 < | |
1220 ! is_member_function_pointer<Fp>::value, | |
1221 Ret | |
1222 >::type | |
1223 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) | |
1224 { | |
1225 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
1226 } | |
1227 template <class Ret, class Fp, class A1, class A2, class A3> | |
1228 inline | |
1229 typename enable_if_c | |
1230 < | |
1231 ! is_member_function_pointer<Fp>::value, | |
1232 Ret | |
1233 >::type | |
1234 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3) | |
1235 { | |
1236 return boost::forward<Fp>(f)(a1, a2, a3); | |
1237 } | |
1238 | |
1239 /// | |
1240 template <class Ret, class Fp> | |
1241 inline | |
1242 typename enable_if_c | |
1243 < | |
1244 ! is_member_function_pointer<Fp>::value, | |
1245 Ret | |
1246 >::type | |
1247 invoke(Fp const &f) | |
1248 { | |
1249 return f(); | |
1250 } | |
1251 template <class Ret, class Fp, class A1> | |
1252 inline | |
1253 typename enable_if_c | |
1254 < | |
1255 ! is_member_function_pointer<Fp>::value, | |
1256 Ret | |
1257 >::type | |
1258 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1) | |
1259 { | |
1260 return f(boost::forward<A1>(a1)); | |
1261 } | |
1262 template <class Ret, class Fp, class A1> | |
1263 inline | |
1264 typename enable_if_c | |
1265 < | |
1266 ! is_member_function_pointer<Fp>::value, | |
1267 Ret | |
1268 >::type | |
1269 invoke(Fp const &f, A1 a1) | |
1270 { | |
1271 return f(a1); | |
1272 } | |
1273 template <class Ret, class Fp, class A1, class A2> | |
1274 inline | |
1275 typename enable_if_c | |
1276 < | |
1277 ! is_member_function_pointer<Fp>::value, | |
1278 Ret | |
1279 >::type | |
1280 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
1281 { | |
1282 return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
1283 } | |
1284 template <class Ret, class Fp, class A1, class A2> | |
1285 inline | |
1286 typename enable_if_c | |
1287 < | |
1288 ! is_member_function_pointer<Fp>::value, | |
1289 Ret | |
1290 >::type | |
1291 invoke(Fp const &f, A1 a1, A2 a2) | |
1292 { | |
1293 return f(a1, a2); | |
1294 } | |
1295 template <class Ret, class Fp, class A1, class A2, class A3> | |
1296 inline | |
1297 typename enable_if_c | |
1298 < | |
1299 ! is_member_function_pointer<Fp>::value, | |
1300 Ret | |
1301 >::type | |
1302 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
1303 { | |
1304 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
1305 } | |
1306 template <class Ret, class Fp, class A1, class A2, class A3> | |
1307 inline | |
1308 typename enable_if_c | |
1309 < | |
1310 ! is_member_function_pointer<Fp>::value, | |
1311 Ret | |
1312 >::type | |
1313 invoke(Fp const &f, A1 a1, A2 a2, A3 a3) | |
1314 { | |
1315 return f(a1, a2, a3); | |
1316 } | |
1317 /// | |
1318 | |
1319 template <class Ret> | |
1320 inline Ret | |
1321 invoke(Ret(*f)()) | |
1322 { | |
1323 return f(); | |
1324 } | |
1325 template <class Ret, class A1> | |
1326 inline Ret | |
1327 invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1) | |
1328 { | |
1329 return f(boost::forward<A1>(a1)); | |
1330 } | |
1331 template <class Ret, class A1, class A2> | |
1332 inline Ret | |
1333 invoke(Ret(*f)(A1, A2), | |
1334 BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) | |
1335 { | |
1336 return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); | |
1337 } | |
1338 template <class Ret, class A1, class A2, class A3> | |
1339 inline Ret | |
1340 invoke(Ret(*f)(A1, A2, A3), | |
1341 BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) | |
1342 { | |
1343 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); | |
1344 } | |
1345 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES | |
1346 | |
1347 #endif // all | |
1348 } | |
1349 } | |
1350 | |
1351 #endif // header |