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