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