Mercurial > hg > vamp-build-and-test
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 } |