comparison DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 101:c530137014c0

Update Boost headers (1.58.0)
author Chris Cannam
date Mon, 07 Sep 2015 11:12:49 +0100
parents 2665513ce2d3
children
comparison
equal deleted inserted replaced
100:793467b5e61c 101:c530137014c0
26 #define BOOST_THREAD_DETAIL_INVOKE_HPP 26 #define BOOST_THREAD_DETAIL_INVOKE_HPP
27 27
28 #include <boost/config.hpp> 28 #include <boost/config.hpp>
29 #include <boost/static_assert.hpp> 29 #include <boost/static_assert.hpp>
30 #include <boost/thread/detail/move.hpp> 30 #include <boost/thread/detail/move.hpp>
31 #include <boost/core/enable_if.hpp>
32 #include <boost/mpl/bool.hpp>
31 #include <boost/type_traits/is_base_of.hpp> 33 #include <boost/type_traits/is_base_of.hpp>
34 #include <boost/type_traits/is_pointer.hpp>
35 #include <boost/type_traits/is_member_function_pointer.hpp>
32 #include <boost/type_traits/remove_reference.hpp> 36 #include <boost/type_traits/remove_reference.hpp>
33 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL 37 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
34 #include <functional> 38 #include <functional>
35 #endif 39 #endif
36 40
38 { 42 {
39 namespace detail 43 namespace detail
40 { 44 {
41 45
42 46
43 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \ 47 #if ! defined(BOOST_NO_SFINAE_EXPR) && \
44 ! defined(BOOST_NO_SFINAE_EXPR) && \
45 ! defined(BOOST_NO_CXX11_DECLTYPE) && \ 48 ! defined(BOOST_NO_CXX11_DECLTYPE) && \
46 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \ 49 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
47 ! defined(BOOST_NO_CXX11_AUTO) 50 ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
48 51
49 #define BOOST_THREAD_PROVIDES_INVOKE 52 #define BOOST_THREAD_PROVIDES_INVOKE
50 53
51 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 54 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
52 // bullets 1 and 2 55 // bullets 1 and 2
56 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) 59 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)...)) 60 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
58 { 61 {
59 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); 62 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
60 } 63 }
64 template <class R, class Fp, class A0, class ...Args>
65 inline auto
66 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
67 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
68 {
69 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
70 }
61 71
62 template <class Fp, class A0, class ...Args> 72 template <class Fp, class A0, class ...Args>
63 inline auto 73 inline auto
64 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) 74 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)...)) 75 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
66 { 76 {
67 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); 77 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
68 } 78 }
79 template <class R, class Fp, class A0, class ...Args>
80 inline auto
81 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
82 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
83 {
84 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
85 }
69 86
70 // bullets 3 and 4 87 // bullets 3 and 4
71 88
72 template <class Fp, class A0> 89 template <class Fp, class A0>
73 inline auto 90 inline auto
83 -> decltype((*boost::forward<A0>(a0)).*f) 100 -> decltype((*boost::forward<A0>(a0)).*f)
84 { 101 {
85 return (*boost::forward<A0>(a0)).*f; 102 return (*boost::forward<A0>(a0)).*f;
86 } 103 }
87 104
105 template <class R, class Fp, class A0>
106 inline auto
107 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
108 -> decltype(boost::forward<A0>(a0).*f)
109 {
110 return boost::forward<A0>(a0).*f;
111 }
112
113 template <class R, class Fp, class A0>
114 inline auto
115 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
116 -> decltype((*boost::forward<A0>(a0)).*f)
117 {
118 return (*boost::forward<A0>(a0)).*f;
119 }
120
121
88 // bullet 5 122 // bullet 5
89 123
124 template <class R, class Fp, class ...Args>
125 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
126 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
127 {
128 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
129 }
90 template <class Fp, class ...Args> 130 template <class Fp, class ...Args>
91 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) 131 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)...)) 132 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
93 { 133 {
94 return boost::forward<Fp>(f)(boost::forward<Args>(args)...); 134 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
95 } 135 }
136
96 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES 137 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
97 138
98 // bullets 1 and 2 139 // bullets 1 and 2
99 140
100 template <class Fp, class A0> 141 template <class Fp, class A0>
103 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) 144 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
104 -> decltype((boost::forward<A0>(a0).*f)()) 145 -> decltype((boost::forward<A0>(a0).*f)())
105 { 146 {
106 return (boost::forward<A0>(a0).*f)(); 147 return (boost::forward<A0>(a0).*f)();
107 } 148 }
149 template <class R, class Fp, class A0>
150 inline
151 auto
152 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
153 -> decltype((boost::forward<A0>(a0).*f)())
154 {
155 return (boost::forward<A0>(a0).*f)();
156 }
108 template <class Fp, class A0, class A1> 157 template <class Fp, class A0, class A1>
109 inline 158 inline
110 auto 159 auto
111 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) 160 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))) 161 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
113 { 162 {
114 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)); 163 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
164 }
165 template <class R, class Fp, class A0, class A1>
166 inline
167 auto
168 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
169 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
170 {
171 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
115 } 172 }
116 template <class Fp, class A0, class A1, class A2> 173 template <class Fp, class A0, class A1, class A2>
117 inline 174 inline
118 auto 175 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) 176 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))) 177 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
121 { 178 {
122 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); 179 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
180 }
181 template <class R, class Fp, class A0, class A1, class A2>
182 inline
183 auto
184 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)
185 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
186 {
187 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
123 } 188 }
124 189
125 template <class Fp, class A0> 190 template <class Fp, class A0>
126 inline 191 inline
127 auto 192 auto
128 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) 193 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
129 -> decltype(((*boost::forward<A0>(a0)).*f)()) 194 -> decltype(((*boost::forward<A0>(a0)).*f)())
130 { 195 {
131 return ((*boost::forward<A0>(a0)).*f)(); 196 return ((*boost::forward<A0>(a0)).*f)();
132 } 197 }
198 template <class R, class Fp, class A0>
199 inline
200 auto
201 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
202 -> decltype(((*boost::forward<A0>(a0)).*f)())
203 {
204 return ((*boost::forward<A0>(a0)).*f)();
205 }
133 template <class Fp, class A0, class A1> 206 template <class Fp, class A0, class A1>
134 inline 207 inline
135 auto 208 auto
136 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) 209 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))) 210 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
138 { 211 {
139 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)); 212 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
140 } 213 }
141 template <class Fp, class A0, class A1> 214 template <class R, class Fp, class A0, class A1>
215 inline
216 auto
217 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
218 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
219 {
220 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
221 }
222 template <class Fp, class A0, class A1, class A2>
142 inline 223 inline
143 auto 224 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) 225 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))) 226 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
146 { 227 {
147 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)); 228 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
229 }
230 template <class R, class Fp, class A0, class A1, class A2>
231 inline
232 auto
233 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)
234 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
235 {
236 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
148 } 237 }
149 238
150 // bullets 3 and 4 239 // bullets 3 and 4
151 240
152 template <class Fp, class A0> 241 template <class Fp, class A0>
155 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) 244 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
156 -> decltype(boost::forward<A0>(a0).*f) 245 -> decltype(boost::forward<A0>(a0).*f)
157 { 246 {
158 return boost::forward<A0>(a0).*f; 247 return boost::forward<A0>(a0).*f;
159 } 248 }
249 template <class R, class Fp, class A0>
250 inline
251 auto
252 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
253 -> decltype(boost::forward<A0>(a0).*f)
254 {
255 return boost::forward<A0>(a0).*f;
256 }
160 257
161 template <class Fp, class A0> 258 template <class Fp, class A0>
162 inline 259 inline
163 auto 260 auto
164 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) 261 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
165 -> decltype((*boost::forward<A0>(a0)).*f) 262 -> decltype((*boost::forward<A0>(a0)).*f)
166 { 263 {
167 return (*boost::forward<A0>(a0)).*f; 264 return (*boost::forward<A0>(a0)).*f;
168 } 265 }
266 template <class R, class Fp, class A0>
267 inline
268 auto
269 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
270 -> decltype((*boost::forward<A0>(a0)).*f)
271 {
272 return (*boost::forward<A0>(a0)).*f;
273 }
169 274
170 // bullet 5 275 // bullet 5
171 276
172 template <class Fp> 277 template <class Fp>
173 inline 278 inline
176 { 281 {
177 return boost::forward<Fp>(f)(); 282 return boost::forward<Fp>(f)();
178 } 283 }
179 template <class Fp, class A1> 284 template <class Fp, class A1>
180 inline 285 inline
181 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1) 286 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
182 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) 287 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
183 { 288 {
184 return boost::forward<Fp>(f)(boost::forward<A1>(a1)); 289 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
185 } template <class Fp, class A1, class A2> 290 } template <class Fp, class A1, class A2>
186 inline 291 inline
188 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) 293 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
189 { 294 {
190 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); 295 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
191 } 296 }
192 template <class Fp, class A1, class A2, class A3> 297 template <class Fp, class A1, class A2, class A3>
298 inline
299 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)
300 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
301 {
302 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
303 }
304
305
306 template <class R, class Fp>
307 inline
308 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
309 -> decltype(boost::forward<Fp>(f)())
310 {
311 return boost::forward<Fp>(f)();
312 }
313 template <class R, class Fp, class A1>
314 inline
315 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
316 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
317 {
318 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
319 }
320 template <class R, class Fp, class A1, class A2>
321 inline
322 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
323 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
324 {
325 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
326 }
327 template <class R, class Fp, class A1, class A2, class A3>
193 inline 328 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) 329 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))) 330 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
196 { 331 {
197 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); 332 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
394 529
395 // bullet 5 530 // bullet 5
396 // f(t1, t2, ..., tN) in all other cases. 531 // f(t1, t2, ..., tN) in all other cases.
397 532
398 template <class Ret, class Fp, class ...Args> 533 template <class Ret, class Fp, class ...Args>
399 inline 534 inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
400 typename enable_if_c 535 {
401 < 536 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
402 ! is_member_function_pointer<Fp>::value, 537 }
538
539 template <class Ret, class Fp, class ...Args>
540 inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
541 {
542 return f(boost::forward<Args>(args)...);
543 }
544
545 template <class Ret, class Fp, class ...Args>
546 inline
547 typename disable_if_c
548 <
549 is_member_function_pointer<Fp>::value,
403 Ret 550 Ret
404 >::type 551 >::type
405 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) 552 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
406 { 553 {
407 return boost::forward<Fp>(f)(boost::forward<Args>(args)...); 554 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), 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 } 555 }
415 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES 556 #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
416 // bullet 1 557 // 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 558 // (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 559 // type T or a reference to an object of type T or a reference to an object of a type derived from T
422 typename enable_if_c 563 typename enable_if_c
423 < 564 <
424 is_base_of<A, typename remove_reference<A0>::type>::value, 565 is_base_of<A, typename remove_reference<A0>::type>::value,
425 Ret 566 Ret
426 >::type 567 >::type
427 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) 568 invoke(Ret (A::*f)(), A0& a0)
428 { 569 {
429 return (boost::forward<A0>(a0).*f)(); 570 return (a0.*f)();
430 } 571 }
431 template <class Ret, class A, class A0, class A1> 572 template <class Ret, class A, class A0>
432 inline 573 inline
433 typename enable_if_c 574 typename enable_if_c
434 < 575 <
435 is_base_of<A, typename remove_reference<A0>::type>::value, 576 is_base_of<A, typename remove_reference<A0>::type>::value,
436 Ret 577 Ret
437 >::type 578 >::type
438 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) 579 invoke(Ret (A::*f)(), A0* a0)
439 { 580 {
440 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); 581 return ((*a0).*f)();
441 } 582 }
442 template <class Ret, class A, class A0, class A1> 583
443 inline 584 template <class Ret, class A, class A0, class A1>
444 typename enable_if_c 585 inline
445 < 586 typename enable_if_c
446 is_base_of<A, typename remove_reference<A0>::type>::value, 587 <
447 Ret 588 is_base_of<A, typename remove_reference<A0>::type>::value,
448 >::type 589 Ret
449 invoke(Ret (A::*f)(A1), A0 a0, A1 a1) 590 >::type
591 invoke(Ret (A::*f)(A1),
592 A0& a0, BOOST_THREAD_RV_REF(A1) a1
593 )
594 {
595 return (a0.*f)(boost::forward<A1>(a1));
596 }
597 template <class Ret, class A, class A0, class A1>
598 inline
599 typename enable_if_c
600 <
601 is_base_of<A, typename remove_reference<A0>::type>::value,
602 Ret
603 >::type
604 invoke(Ret (A::*f)(A1), A0& a0, A1 a1)
450 { 605 {
451 return (a0.*f)(a1); 606 return (a0.*f)(a1);
452 } 607 }
608 template <class Ret, class A, class A0, class A1>
609 inline
610 typename enable_if_c
611 <
612 is_base_of<A, typename remove_reference<A0>::type>::value,
613 Ret
614 >::type
615 invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1
616 )
617 {
618 return (*(a0).*f)(boost::forward<A1>(a1));
619 }
620 template <class Ret, class A, class A0, class A1>
621 inline
622 typename enable_if_c
623 <
624 is_base_of<A, typename remove_reference<A0>::type>::value,
625 Ret
626 >::type
627 invoke(Ret (A::*f)(A1), A0* a0, A1 a1)
628 {
629 return (*a0.*f)(a1);
630 }
453 template <class Ret, class A, class A0, class A1, class A2> 631 template <class Ret, class A, class A0, class A1, class A2>
454 inline 632 inline
455 typename enable_if_c 633 typename enable_if_c
456 < 634 <
457 is_base_of<A, typename remove_reference<A0>::type>::value, 635 is_base_of<A, typename remove_reference<A0>::type>::value,
458 Ret 636 Ret
459 >::type 637 >::type
460 invoke(Ret (A::*f)(A1, A2), 638 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 639 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
462 ) 640 )
463 { 641 {
464 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); 642 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
465 } 643 }
466 template <class Ret, class A, class A0, class A1, class A2> 644 template <class Ret, class A, class A0, class A1, class A2>
467 inline 645 inline
468 typename enable_if_c 646 typename enable_if_c
469 < 647 <
470 is_base_of<A, typename remove_reference<A0>::type>::value, 648 is_base_of<A, typename remove_reference<A0>::type>::value,
471 Ret 649 Ret
472 >::type 650 >::type
473 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) 651 invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2)
474 { 652 {
475 return (a0.*f)(a1, a2); 653 return ((*a0).*f)(a1, a2);
476 } 654 }
477 template <class Ret, class A, class A0, class A1, class A2, class A3> 655 template <class Ret, class A, class A0, class A1, class A2, class A3>
478 inline 656 inline
479 typename enable_if_c 657 typename enable_if_c
480 < 658 <
481 is_base_of<A, typename remove_reference<A0>::type>::value, 659 is_base_of<A, typename remove_reference<A0>::type>::value,
482 Ret 660 Ret
483 >::type 661 >::type
484 invoke(Ret (A::*f)(A1, A2, A3), 662 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) 663 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
486 { 664 {
487 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); 665 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
488 } 666 }
489 template <class Ret, class A, class A0, class A1, class A2, class A3> 667 template <class Ret, class A, class A0, class A1, class A2, class A3>
490 inline 668 inline
491 typename enable_if_c 669 typename enable_if_c
492 < 670 <
493 is_base_of<A, typename remove_reference<A0>::type>::value, 671 is_base_of<A, typename remove_reference<A0>::type>::value,
494 Ret 672 Ret
495 >::type 673 >::type
496 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) 674 invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3)
497 { 675 {
498 return (a0.*f)(a1, a2, a3); 676 return ((*a0).*f)(a1, a2, a3);
499 } 677 }
500 678
501 /// 679 ///
502 template <class Ret, class A, class A0> 680 template <class Ret, class A, class A0>
503 inline 681 inline
504 typename enable_if_c 682 typename enable_if_c
505 < 683 <
506 is_base_of<A, typename remove_reference<A0>::type>::value, 684 is_base_of<A, typename remove_reference<A0>::type>::value,
507 Ret 685 Ret
508 >::type 686 >::type
509 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) 687 invoke(Ret (A::*f)() const, A0 const& a0)
510 { 688 {
511 return (boost::forward<A0>(a0).*f)(); 689 return (a0.*f)();
512 } 690 }
513 template <class Ret, class A, class A0, class A1> 691 template <class Ret, class A, class A0>
514 inline 692 inline
515 typename enable_if_c 693 typename enable_if_c
516 < 694 <
517 is_base_of<A, typename remove_reference<A0>::type>::value, 695 is_base_of<A, typename remove_reference<A0>::type>::value,
518 Ret 696 Ret
519 >::type 697 >::type
520 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) 698 invoke(Ret (A::*f)() const, A0 const* a0)
521 { 699 {
522 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); 700 return ((*a0).*f)();
523 } 701 }
524 template <class Ret, class A, class A0, class A1> 702 template <class Ret, class A, class A0, class A1>
525 inline 703 inline
526 typename enable_if_c 704 typename enable_if_c
527 < 705 <
528 is_base_of<A, typename remove_reference<A0>::type>::value, 706 is_base_of<A, typename remove_reference<A0>::type>::value,
529 Ret 707 Ret
530 >::type 708 >::type
531 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) 709 invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1)
710 {
711 return (a0.*f)(boost::forward<A1>(a1));
712 }
713 template <class Ret, class A, class A0, class A1>
714 inline
715 typename enable_if_c
716 <
717 is_base_of<A, typename remove_reference<A0>::type>::value,
718 Ret
719 >::type
720 invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1)
721 {
722 return ((*a0).*f)(boost::forward<A1>(a1));
723 }
724
725 template <class Ret, class A, class A0, class A1>
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) const, A0 const& a0, A1 a1)
532 { 733 {
533 return (a0.*f)(a1); 734 return (a0.*f)(a1);
534 } 735 }
535 template <class Ret, class A, class A0, class A1, class A2> 736 template <class Ret, class A, class A0, class A1, class A2>
536 inline 737 inline
538 < 739 <
539 is_base_of<A, typename remove_reference<A0>::type>::value, 740 is_base_of<A, typename remove_reference<A0>::type>::value,
540 Ret 741 Ret
541 >::type 742 >::type
542 invoke(Ret (A::*f)(A1, A2) const, 743 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 744 A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
544 ) 745 )
545 { 746 {
546 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2) 747 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
547 ); 748 );
548 } 749 }
551 typename enable_if_c 752 typename enable_if_c
552 < 753 <
553 is_base_of<A, typename remove_reference<A0>::type>::value, 754 is_base_of<A, typename remove_reference<A0>::type>::value,
554 Ret 755 Ret
555 >::type 756 >::type
556 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) 757 invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2)
557 { 758 {
558 return (a0.*f)(a1, a2); 759 return (a0.*f)(a1, a2);
559 } 760 }
560 template <class Ret, class A, class A0, class A1, class A2, class A3> 761 template <class Ret, class A, class A0, class A1, class A2, class A3>
561 inline 762 inline
1157 1358
1158 // bullet 5 1359 // bullet 5
1159 // f(t1, t2, ..., tN) in all other cases. 1360 // f(t1, t2, ..., tN) in all other cases.
1160 1361
1161 template <class Ret, class Fp> 1362 template <class Ret, class Fp>
1162 inline 1363 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f)
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 { 1364 {
1170 return boost::forward<Fp>(f)(); 1365 return boost::forward<Fp>(f)();
1171 } 1366 }
1367 template <class Ret, class Fp>
1368 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f)
1369 {
1370 return f();
1371 }
1372 template <class Ret, class Fp>
1373 inline
1374 typename disable_if_c
1375 <
1376 is_member_function_pointer<Fp>::value,
1377 Ret
1378 >::type
1379 invoke(BOOST_THREAD_FWD_REF(Fp) f)
1380 {
1381 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f));
1382 }
1383
1172 template <class Ret, class Fp, class A1> 1384 template <class Ret, class Fp, class A1>
1173 inline 1385 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
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 { 1386 {
1181 return boost::forward<Fp>(f)(boost::forward<A1>(a1)); 1387 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
1182 } 1388 }
1183 template <class Ret, class Fp, class A1> 1389 template <class Ret, class Fp, class A1>
1184 inline 1390 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1185 typename enable_if_c 1391 {
1186 < 1392 return f(boost::forward<A1>(a1));
1187 ! is_member_function_pointer<Fp>::value, 1393 }
1188 Ret 1394 template <class Ret, class Fp, class A1>
1189 >::type 1395 inline
1190 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1) 1396 typename disable_if_c
1397 <
1398 is_member_function_pointer<Fp>::value,
1399 Ret
1400 >::type
1401 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1402 {
1403 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1));
1404 }
1405
1406 template <class Ret, class Fp, class A1, class A2>
1407 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1408 {
1409 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1410 }
1411 template <class Ret, class Fp, class A1, class A2>
1412 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1413 {
1414 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1415 }
1416 template <class Ret, class Fp, class A1, class A2>
1417 inline
1418 typename disable_if_c
1419 <
1420 is_member_function_pointer<Fp>::value,
1421 Ret
1422 >::type
1423 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1424 {
1425 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2));
1426 }
1427
1428 template <class Ret, class Fp, class A1, class A2, class A3>
1429 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1430 {
1431 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1432 }
1433 template <class Ret, class Fp, class A1, class A2, class A3>
1434 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1435 {
1436 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1437 }
1438 template <class Ret, class Fp, class A1, class A2, class A3>
1439 inline
1440 typename disable_if_c
1441 <
1442 is_member_function_pointer<Fp>::value,
1443 Ret
1444 >::type
1445 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1446 {
1447 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1448 }
1449
1450
1451 template <class Ret, class Fp, class A1>
1452 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1191 { 1453 {
1192 return boost::forward<Fp>(f)(a1); 1454 return boost::forward<Fp>(f)(a1);
1193 } 1455 }
1456 template <class Ret, class Fp, class A1>
1457 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1458 {
1459 return f(a1);
1460 }
1461 template <class Ret, class Fp, class A1>
1462 inline
1463 typename disable_if_c
1464 <
1465 is_member_function_pointer<Fp>::value,
1466 Ret
1467 >::type
1468 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1469 {
1470 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1);
1471 }
1472
1194 template <class Ret, class Fp, class A1, class A2> 1473 template <class Ret, class Fp, class A1, class A2>
1195 inline 1474 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1196 typename enable_if_c 1475 {
1197 < 1476 return boost::forward<Fp>(f)(a1, a2);
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 } 1477 }
1205 template <class Ret, class Fp, class A1, class A2> 1478 template <class Ret, class Fp, class A1, class A2>
1206 inline 1479 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1207 typename enable_if_c 1480 {
1208 < 1481 return f(a1, a2);
1209 ! is_member_function_pointer<Fp>::value, 1482 }
1210 Ret 1483 template <class Ret, class Fp, class A1, class A2>
1211 >::type 1484 inline
1212 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2) 1485 typename disable_if_c
1213 { 1486 <
1214 return boost::forward<Fp>(f)(a1, a2); 1487 is_member_function_pointer<Fp>::value,
1215 } 1488 Ret
1489 >::type
1490 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1491 {
1492 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2);
1493 }
1494
1216 template <class Ret, class Fp, class A1, class A2, class A3> 1495 template <class Ret, class Fp, class A1, class A2, class A3>
1217 inline 1496 inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1218 typename enable_if_c 1497 {
1219 < 1498 return boost::forward<Fp>(f)(a1, a2, a3);
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 } 1499 }
1227 template <class Ret, class Fp, class A1, class A2, class A3> 1500 template <class Ret, class Fp, class A1, class A2, class A3>
1228 inline 1501 inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1229 typename enable_if_c 1502 {
1230 < 1503 return f(a1, a2, a3);
1231 ! is_member_function_pointer<Fp>::value, 1504 }
1232 Ret 1505 template <class Ret, class Fp, class A1, class A2, class A3>
1233 >::type 1506 inline
1234 invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3) 1507 typename disable_if_c
1235 { 1508 <
1236 return boost::forward<Fp>(f)(a1, a2, a3); 1509 is_member_function_pointer<Fp>::value,
1237 } 1510 Ret
1511 >::type
1512 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1513 {
1514 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2, a3);
1515 }
1516
1238 1517
1239 /// 1518 ///
1240 template <class Ret, class Fp> 1519 template <class Ret, class Fp>
1241 inline 1520 inline
1242 typename enable_if_c 1521 typename disable_if_c
1243 < 1522 <
1244 ! is_member_function_pointer<Fp>::value, 1523 is_member_function_pointer<Fp>::value,
1245 Ret 1524 Ret
1246 >::type 1525 >::type
1247 invoke(Fp const &f) 1526 invoke(Fp &f)
1248 { 1527 {
1249 return f(); 1528 return f();
1250 } 1529 }
1251 template <class Ret, class Fp, class A1> 1530 template <class Ret, class Fp, class A1>
1252 inline 1531 inline
1253 typename enable_if_c 1532 typename disable_if_c
1254 < 1533 <
1255 ! is_member_function_pointer<Fp>::value, 1534 is_member_function_pointer<Fp>::value,
1256 Ret 1535 Ret
1257 >::type 1536 >::type
1258 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1) 1537 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1)
1259 { 1538 {
1260 return f(boost::forward<A1>(a1)); 1539 return f(boost::forward<A1>(a1));
1261 } 1540 }
1262 template <class Ret, class Fp, class A1> 1541 template <class Ret, class Fp, class A1>
1263 inline 1542 inline
1264 typename enable_if_c 1543 typename disable_if_c
1265 < 1544 <
1266 ! is_member_function_pointer<Fp>::value, 1545 is_member_function_pointer<Fp>::value,
1267 Ret 1546 Ret
1268 >::type 1547 >::type
1269 invoke(Fp const &f, A1 a1) 1548 invoke(Fp &f, A1 a1)
1270 { 1549 {
1271 return f(a1); 1550 return f(a1);
1272 } 1551 }
1273 template <class Ret, class Fp, class A1, class A2> 1552 template <class Ret, class Fp, class A1, class A2>
1274 inline 1553 inline
1275 typename enable_if_c 1554 typename disable_if_c
1276 < 1555 <
1277 ! is_member_function_pointer<Fp>::value, 1556 is_member_function_pointer<Fp>::value,
1278 Ret 1557 Ret
1279 >::type 1558 >::type
1280 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) 1559 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1281 { 1560 {
1282 return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); 1561 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1283 } 1562 }
1284 template <class Ret, class Fp, class A1, class A2> 1563 template <class Ret, class Fp, class A1, class A2>
1285 inline 1564 inline
1286 typename enable_if_c 1565 typename disable_if_c
1287 < 1566 <
1288 ! is_member_function_pointer<Fp>::value, 1567 is_member_function_pointer<Fp>::value,
1289 Ret 1568 Ret
1290 >::type 1569 >::type
1291 invoke(Fp const &f, A1 a1, A2 a2) 1570 invoke(Fp &f, A1 a1, A2 a2)
1292 { 1571 {
1293 return f(a1, a2); 1572 return f(a1, a2);
1294 } 1573 }
1295 template <class Ret, class Fp, class A1, class A2, class A3> 1574 template <class Ret, class Fp, class A1, class A2, class A3>
1296 inline 1575 inline
1297 typename enable_if_c 1576 typename disable_if_c
1298 < 1577 <
1299 ! is_member_function_pointer<Fp>::value, 1578 is_member_function_pointer<Fp>::value,
1300 Ret 1579 Ret
1301 >::type 1580 >::type
1302 invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) 1581 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1303 { 1582 {
1304 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); 1583 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1305 } 1584 }
1306 template <class Ret, class Fp, class A1, class A2, class A3> 1585 template <class Ret, class Fp, class A1, class A2, class A3>
1307 inline 1586 inline
1308 typename enable_if_c 1587 typename disable_if_c
1309 < 1588 <
1310 ! is_member_function_pointer<Fp>::value, 1589 is_member_function_pointer<Fp>::value,
1311 Ret 1590 Ret
1312 >::type 1591 >::type
1313 invoke(Fp const &f, A1 a1, A2 a2, A3 a3) 1592 invoke(Fp &f, A1 a1, A2 a2, A3 a3)
1314 { 1593 {
1315 return f(a1, a2, a3); 1594 return f(a1, a2, a3);
1316 } 1595 }
1317 /// 1596 ///
1318 1597
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 1598 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
1346 1599
1347 #endif // all 1600 #endif // all
1348 } 1601 }
1349 } 1602 }