File indexing completed on 2025-12-15 10:09:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
0026 #define BOOST_THREAD_DETAIL_INVOKE_HPP
0027
0028 #include <boost/config.hpp>
0029 #include <boost/static_assert.hpp>
0030 #include <boost/thread/detail/move.hpp>
0031 #include <boost/core/enable_if.hpp>
0032 #include <boost/type_traits/is_base_of.hpp>
0033 #include <boost/type_traits/is_pointer.hpp>
0034 #include <boost/type_traits/is_member_function_pointer.hpp>
0035 #include <boost/type_traits/is_member_object_pointer.hpp>
0036 #include <boost/type_traits/remove_reference.hpp>
0037 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
0038 #include <functional>
0039 #endif
0040
0041 namespace boost
0042 {
0043 namespace detail
0044 {
0045
0046
0047 #if ! defined(BOOST_NO_SFINAE_EXPR) && \
0048 ! defined(BOOST_NO_CXX11_DECLTYPE) && \
0049 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
0050 ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
0051
0052 #define BOOST_THREAD_PROVIDES_INVOKE
0053
0054 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
0055
0056
0057 template <class Fp, class A0, class ...Args>
0058 inline auto
0059 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0060 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
0061 {
0062 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0063 }
0064 template <class R, class Fp, class A0, class ...Args>
0065 inline auto
0066 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0067 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
0068 {
0069 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0070 }
0071
0072 template <class Fp, class A0, class ...Args>
0073 inline auto
0074 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0075 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
0076 {
0077 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0078 }
0079 template <class R, class Fp, class A0, class ...Args>
0080 inline auto
0081 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0082 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
0083 {
0084 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0085 }
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 template <class Fp, class A0, class En = typename boost::enable_if<boost::is_member_object_pointer<Fp> >::type>
0096 inline auto
0097 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0098 -> decltype(boost::forward<A0>(a0).*f)
0099 {
0100 return boost::forward<A0>(a0).*f;
0101 }
0102
0103 template <class Fp, class A0, class En = typename boost::enable_if<boost::is_member_object_pointer<Fp> >::type>
0104 inline auto
0105 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0106 -> decltype((*boost::forward<A0>(a0)).*f)
0107 {
0108 return (*boost::forward<A0>(a0)).*f;
0109 }
0110
0111 template <class R, class Fp, class A0, class En = typename boost::enable_if<boost::is_member_object_pointer<Fp> >::type>
0112 inline auto
0113 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0114 -> decltype(boost::forward<A0>(a0).*f)
0115 {
0116 return boost::forward<A0>(a0).*f;
0117 }
0118
0119 template <class R, class Fp, class A0, class En = typename boost::enable_if<boost::is_member_object_pointer<Fp> >::type>
0120 inline auto
0121 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0122 -> decltype((*boost::forward<A0>(a0)).*f)
0123 {
0124 return (*boost::forward<A0>(a0)).*f;
0125 }
0126
0127
0128
0129
0130 template <class R, class Fp, class ...Args>
0131 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
0132 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
0133 {
0134 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
0135 }
0136 template <class Fp, class ...Args>
0137 inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
0138 -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
0139 {
0140 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
0141 }
0142
0143 #else
0144
0145
0146
0147 template <class Fp, class A0>
0148 inline
0149 auto
0150 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0151 -> decltype((boost::forward<A0>(a0).*f)())
0152 {
0153 return (boost::forward<A0>(a0).*f)();
0154 }
0155 template <class R, class Fp, class A0>
0156 inline
0157 auto
0158 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0159 -> decltype((boost::forward<A0>(a0).*f)())
0160 {
0161 return (boost::forward<A0>(a0).*f)();
0162 }
0163 template <class Fp, class A0, class A1>
0164 inline
0165 auto
0166 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0167 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
0168 {
0169 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
0170 }
0171 template <class R, class Fp, class A0, class A1>
0172 inline
0173 auto
0174 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0175 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
0176 {
0177 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
0178 }
0179 template <class Fp, class A0, class A1, class A2>
0180 inline
0181 auto
0182 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)
0183 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0184 {
0185 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0186 }
0187 template <class R, class Fp, class A0, class A1, class A2>
0188 inline
0189 auto
0190 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)
0191 -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0192 {
0193 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0194 }
0195
0196 template <class Fp, class A0>
0197 inline
0198 auto
0199 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0200 -> decltype(((*boost::forward<A0>(a0)).*f)())
0201 {
0202 return ((*boost::forward<A0>(a0)).*f)();
0203 }
0204 template <class R, class Fp, class A0>
0205 inline
0206 auto
0207 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0208 -> decltype(((*boost::forward<A0>(a0)).*f)())
0209 {
0210 return ((*boost::forward<A0>(a0)).*f)();
0211 }
0212 template <class Fp, class A0, class A1>
0213 inline
0214 auto
0215 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0216 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
0217 {
0218 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
0219 }
0220 template <class R, class Fp, class A0, class A1>
0221 inline
0222 auto
0223 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0224 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
0225 {
0226 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
0227 }
0228 template <class Fp, class A0, class A1, class A2>
0229 inline
0230 auto
0231 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)
0232 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0233 {
0234 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0235 }
0236 template <class R, class Fp, class A0, class A1, class A2>
0237 inline
0238 auto
0239 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)
0240 -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0241 {
0242 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0243 }
0244
0245
0246
0247 template <class Fp, class A0>
0248 inline
0249 auto
0250 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0251 -> decltype(boost::forward<A0>(a0).*f)
0252 {
0253 return boost::forward<A0>(a0).*f;
0254 }
0255 template <class R, class Fp, class A0>
0256 inline
0257 auto
0258 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0259 -> decltype(boost::forward<A0>(a0).*f)
0260 {
0261 return boost::forward<A0>(a0).*f;
0262 }
0263
0264 template <class Fp, class A0>
0265 inline
0266 auto
0267 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0268 -> decltype((*boost::forward<A0>(a0)).*f)
0269 {
0270 return (*boost::forward<A0>(a0)).*f;
0271 }
0272 template <class R, class Fp, class A0>
0273 inline
0274 auto
0275 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
0276 -> decltype((*boost::forward<A0>(a0)).*f)
0277 {
0278 return (*boost::forward<A0>(a0)).*f;
0279 }
0280
0281
0282
0283 template <class Fp>
0284 inline
0285 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
0286 -> decltype(boost::forward<Fp>(f)())
0287 {
0288 return boost::forward<Fp>(f)();
0289 }
0290 template <class Fp, class A1>
0291 inline
0292 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
0293 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
0294 {
0295 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
0296 } template <class Fp, class A1, class A2>
0297 inline
0298 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
0299 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0300 {
0301 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0302 }
0303 template <class Fp, class A1, class A2, class A3>
0304 inline
0305 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)
0306 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
0307 {
0308 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0309 }
0310
0311
0312 template <class R, class Fp>
0313 inline
0314 auto invoke(BOOST_THREAD_RV_REF(Fp) f)
0315 -> decltype(boost::forward<Fp>(f)())
0316 {
0317 return boost::forward<Fp>(f)();
0318 }
0319 template <class R, class Fp, class A1>
0320 inline
0321 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
0322 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
0323 {
0324 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
0325 }
0326 template <class R, class Fp, class A1, class A2>
0327 inline
0328 auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
0329 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
0330 {
0331 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0332 }
0333 template <class R, class Fp, class A1, class A2, class A3>
0334 inline
0335 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)
0336 -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
0337 {
0338 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0339 }
0340
0341 #endif
0342
0343 #elif ! defined(BOOST_NO_SFINAE_EXPR) && \
0344 ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
0345 defined BOOST_MSVC
0346
0347 template <class Ret, class Fp>
0348 inline
0349 Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
0350 {
0351 return f();
0352 }
0353 template <class Ret, class Fp, class A1>
0354 inline
0355 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
0356 {
0357 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
0358 }
0359 template <class Ret, class Fp, class A1, class A2>
0360 inline
0361 Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
0362 {
0363 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
0364 }
0365 template <class Ret, class Fp, class A1, class A2, class A3>
0366 inline
0367 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)
0368 {
0369 return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
0370 }
0371
0372 #define BOOST_THREAD_PROVIDES_INVOKE_RET
0373
0374 #elif ! defined BOOST_MSVC
0375
0376 #define BOOST_THREAD_PROVIDES_INVOKE_RET
0377
0378 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
0379
0380
0381
0382
0383 template <class Ret, class A, class A0, class ...Args>
0384 inline
0385 typename enable_if_c
0386 <
0387 is_base_of<A, typename remove_reference<A0>::type>::value,
0388 Ret
0389 >::type
0390 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0391 {
0392 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0393 }
0394
0395 template <class Ret, class A, class A0, class ...Args>
0396 inline
0397 typename enable_if_c
0398 <
0399 is_base_of<A, typename remove_reference<A0>::type>::value,
0400 Ret
0401 >::type
0402 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0403 {
0404 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0405 }
0406
0407 template <class Ret, class A, class A0, class ...Args>
0408 inline
0409 typename enable_if_c
0410 <
0411 is_base_of<A, typename remove_reference<A0>::type>::value,
0412 Ret
0413 >::type
0414 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0415 {
0416 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0417 }
0418
0419 template <class Ret, class A, class A0, class ...Args>
0420 inline
0421 typename enable_if_c
0422 <
0423 is_base_of<A, typename remove_reference<A0>::type>::value,
0424 Ret
0425 >::type
0426 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0427 {
0428 return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
0429 }
0430
0431
0432
0433
0434 template <class Ret, class A, class A0, class ...Args>
0435 inline
0436 typename enable_if_c
0437 <
0438 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0439 Ret
0440 >::type
0441 invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0442 {
0443 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0444 }
0445
0446 template <class Ret, class A, class A0, class ...Args>
0447 inline
0448 typename enable_if_c
0449 <
0450 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0451 Ret
0452 >::type
0453 invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0454 {
0455 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0456 }
0457
0458 template <class Ret, class A, class A0, class ...Args>
0459 inline
0460 typename enable_if_c
0461 <
0462 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0463 Ret
0464 >::type
0465 invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0466 {
0467 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0468 }
0469
0470 template <class Ret, class A, class A0, class ...Args>
0471 inline
0472 typename enable_if_c
0473 <
0474 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0475 Ret
0476 >::type
0477 invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
0478 {
0479 return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
0480 }
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539 template <class Ret, class Fp, class ...Args>
0540 inline Ret do_invoke(boost::false_type, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
0541 {
0542 return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
0543 }
0544
0545 template <class Ret, class Fp, class ...Args>
0546 inline Ret do_invoke(boost::true_type, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
0547 {
0548 return f(boost::forward<Args>(args)...);
0549 }
0550
0551 template <class Ret, class Fp, class ...Args>
0552 inline
0553 typename disable_if_c
0554 <
0555 is_member_function_pointer<Fp>::value,
0556 Ret
0557 >::type
0558 invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
0559 {
0560 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<Args>(args)...);
0561 }
0562 #else
0563
0564
0565
0566
0567 template <class Ret, class A, class A0>
0568 inline
0569 typename enable_if_c
0570 <
0571 is_base_of<A, typename remove_reference<A0>::type>::value,
0572 Ret
0573 >::type
0574 invoke(Ret (A::*f)(), A0& a0)
0575 {
0576 return (a0.*f)();
0577 }
0578 template <class Ret, class A, class A0>
0579 inline
0580 typename enable_if_c
0581 <
0582 is_base_of<A, typename remove_reference<A0>::type>::value,
0583 Ret
0584 >::type
0585 invoke(Ret (A::*f)(), A0* a0)
0586 {
0587 return ((*a0).*f)();
0588 }
0589
0590 template <class Ret, class A, class A0, class A1>
0591 inline
0592 typename enable_if_c
0593 <
0594 is_base_of<A, typename remove_reference<A0>::type>::value,
0595 Ret
0596 >::type
0597 invoke(Ret (A::*f)(A1),
0598 A0& a0, BOOST_THREAD_RV_REF(A1) a1
0599 )
0600 {
0601 return (a0.*f)(boost::forward<A1>(a1));
0602 }
0603 template <class Ret, class A, class A0, class A1>
0604 inline
0605 typename enable_if_c
0606 <
0607 is_base_of<A, typename remove_reference<A0>::type>::value,
0608 Ret
0609 >::type
0610 invoke(Ret (A::*f)(A1), A0& a0, A1 a1)
0611 {
0612 return (a0.*f)(a1);
0613 }
0614 template <class Ret, class A, class A0, class A1>
0615 inline
0616 typename enable_if_c
0617 <
0618 is_base_of<A, typename remove_reference<A0>::type>::value,
0619 Ret
0620 >::type
0621 invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1
0622 )
0623 {
0624 return (*(a0).*f)(boost::forward<A1>(a1));
0625 }
0626 template <class Ret, class A, class A0, class A1>
0627 inline
0628 typename enable_if_c
0629 <
0630 is_base_of<A, typename remove_reference<A0>::type>::value,
0631 Ret
0632 >::type
0633 invoke(Ret (A::*f)(A1), A0* a0, A1 a1)
0634 {
0635 return (*a0.*f)(a1);
0636 }
0637 template <class Ret, class A, class A0, class A1, class A2>
0638 inline
0639 typename enable_if_c
0640 <
0641 is_base_of<A, typename remove_reference<A0>::type>::value,
0642 Ret
0643 >::type
0644 invoke(Ret (A::*f)(A1, A2),
0645 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
0646 )
0647 {
0648 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0649 }
0650 template <class Ret, class A, class A0, class A1, class A2>
0651 inline
0652 typename enable_if_c
0653 <
0654 is_base_of<A, typename remove_reference<A0>::type>::value,
0655 Ret
0656 >::type
0657 invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2)
0658 {
0659 return ((*a0).*f)(a1, a2);
0660 }
0661 template <class Ret, class A, class A0, class A1, class A2, class A3>
0662 inline
0663 typename enable_if_c
0664 <
0665 is_base_of<A, typename remove_reference<A0>::type>::value,
0666 Ret
0667 >::type
0668 invoke(Ret (A::*f)(A1, A2, A3),
0669 A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
0670 {
0671 return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0672 }
0673 template <class Ret, class A, class A0, class A1, class A2, class A3>
0674 inline
0675 typename enable_if_c
0676 <
0677 is_base_of<A, typename remove_reference<A0>::type>::value,
0678 Ret
0679 >::type
0680 invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3)
0681 {
0682 return ((*a0).*f)(a1, a2, a3);
0683 }
0684
0685
0686 template <class Ret, class A, class A0>
0687 inline
0688 typename enable_if_c
0689 <
0690 is_base_of<A, typename remove_reference<A0>::type>::value,
0691 Ret
0692 >::type
0693 invoke(Ret (A::*f)() const, A0 const& a0)
0694 {
0695 return (a0.*f)();
0696 }
0697 template <class Ret, class A, class A0>
0698 inline
0699 typename enable_if_c
0700 <
0701 is_base_of<A, typename remove_reference<A0>::type>::value,
0702 Ret
0703 >::type
0704 invoke(Ret (A::*f)() const, A0 const* a0)
0705 {
0706 return ((*a0).*f)();
0707 }
0708 template <class Ret, class A, class A0, class A1>
0709 inline
0710 typename enable_if_c
0711 <
0712 is_base_of<A, typename remove_reference<A0>::type>::value,
0713 Ret
0714 >::type
0715 invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1)
0716 {
0717 return (a0.*f)(boost::forward<A1>(a1));
0718 }
0719 template <class Ret, class A, class A0, class A1>
0720 inline
0721 typename enable_if_c
0722 <
0723 is_base_of<A, typename remove_reference<A0>::type>::value,
0724 Ret
0725 >::type
0726 invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1)
0727 {
0728 return ((*a0).*f)(boost::forward<A1>(a1));
0729 }
0730
0731 template <class Ret, class A, class A0, class A1>
0732 inline
0733 typename enable_if_c
0734 <
0735 is_base_of<A, typename remove_reference<A0>::type>::value,
0736 Ret
0737 >::type
0738 invoke(Ret (A::*f)(A1) const, A0 const& a0, A1 a1)
0739 {
0740 return (a0.*f)(a1);
0741 }
0742 template <class Ret, class A, class A0, class A1, class A2>
0743 inline
0744 typename enable_if_c
0745 <
0746 is_base_of<A, typename remove_reference<A0>::type>::value,
0747 Ret
0748 >::type
0749 invoke(Ret (A::*f)(A1, A2) const,
0750 A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
0751 )
0752 {
0753 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
0754 );
0755 }
0756 template <class Ret, class A, class A0, class A1, class A2>
0757 inline
0758 typename enable_if_c
0759 <
0760 is_base_of<A, typename remove_reference<A0>::type>::value,
0761 Ret
0762 >::type
0763 invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2)
0764 {
0765 return (a0.*f)(a1, a2);
0766 }
0767 template <class Ret, class A, class A0, class A1, class A2, class A3>
0768 inline
0769 typename enable_if_c
0770 <
0771 is_base_of<A, typename remove_reference<A0>::type>::value,
0772 Ret
0773 >::type
0774 invoke(Ret (A::*f)(A1, A2, A3) const,
0775 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
0776 )
0777 {
0778 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0779 }
0780 template <class Ret, class A, class A0, class A1, class A2, class A3>
0781 inline
0782 typename enable_if_c
0783 <
0784 is_base_of<A, typename remove_reference<A0>::type>::value,
0785 Ret
0786 >::type
0787 invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
0788 {
0789 return (a0.*f)(a1, a2, a3);
0790 }
0791
0792 template <class Ret, class A, class A0>
0793 inline
0794 typename enable_if_c
0795 <
0796 is_base_of<A, typename remove_reference<A0>::type>::value,
0797 Ret
0798 >::type
0799 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
0800 {
0801 return (boost::forward<A0>(a0).*f)();
0802 }
0803 template <class Ret, class A, class A0, class A1>
0804 inline
0805 typename enable_if_c
0806 <
0807 is_base_of<A, typename remove_reference<A0>::type>::value,
0808 Ret
0809 >::type
0810 invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0811 {
0812 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
0813 }
0814 template <class Ret, class A, class A0, class A1>
0815 inline
0816 typename enable_if_c
0817 <
0818 is_base_of<A, typename remove_reference<A0>::type>::value,
0819 Ret
0820 >::type
0821 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
0822 {
0823 return (a0.*f)(a1);
0824 }
0825 template <class Ret, class A, class A0, class A1, class A2>
0826 inline
0827 typename enable_if_c
0828 <
0829 is_base_of<A, typename remove_reference<A0>::type>::value,
0830 Ret
0831 >::type
0832 invoke(Ret (A::*f)(A1, A2) volatile,
0833 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
0834 {
0835 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0836 }
0837 template <class Ret, class A, class A0, class A1, class A2>
0838 inline
0839 typename enable_if_c
0840 <
0841 is_base_of<A, typename remove_reference<A0>::type>::value,
0842 Ret
0843 >::type
0844 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
0845 {
0846 return (a0.*f)(a1, a2);
0847 }
0848 template <class Ret, class A, class A0, class A1, class A2, class A3>
0849 inline
0850 typename enable_if_c
0851 <
0852 is_base_of<A, typename remove_reference<A0>::type>::value,
0853 Ret
0854 >::type
0855 invoke(Ret (A::*f)(A1, A2, A3) volatile,
0856 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
0857 )
0858 {
0859 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0860 }
0861 template <class Ret, class A, class A0, class A1, class A2, class A3>
0862 inline
0863 typename enable_if_c
0864 <
0865 is_base_of<A, typename remove_reference<A0>::type>::value,
0866 Ret
0867 >::type
0868 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
0869 {
0870 return (a0.*f)(a1, a2, a3);
0871 }
0872
0873 template <class Ret, class A, class A0>
0874 inline
0875 typename enable_if_c
0876 <
0877 is_base_of<A, typename remove_reference<A0>::type>::value,
0878 Ret
0879 >::type
0880 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
0881 {
0882 return (boost::forward<A0>(a0).*f)();
0883 }
0884 template <class Ret, class A, class A0, class A1>
0885 inline
0886 typename enable_if_c
0887 <
0888 is_base_of<A, typename remove_reference<A0>::type>::value,
0889 Ret
0890 >::type
0891 invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0892 {
0893 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
0894 }
0895 template <class Ret, class A, class A0, class A1>
0896 inline
0897 typename enable_if_c
0898 <
0899 is_base_of<A, typename remove_reference<A0>::type>::value,
0900 Ret
0901 >::type
0902 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
0903 {
0904 return (a0.*f)(a1);
0905 }
0906 template <class Ret, class A, class A0, class A1, class A2>
0907 inline
0908 typename enable_if_c
0909 <
0910 is_base_of<A, typename remove_reference<A0>::type>::value,
0911 Ret
0912 >::type
0913 invoke(Ret (A::*f)(A1, A2) const volatile,
0914 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
0915 )
0916 {
0917 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
0918 }
0919 template <class Ret, class A, class A0, class A1, class A2>
0920 inline
0921 typename enable_if_c
0922 <
0923 is_base_of<A, typename remove_reference<A0>::type>::value,
0924 Ret
0925 >::type
0926 invoke(Ret (A::*f)(A1, A2) const volatile,
0927 A0 a0, A1 a1, A2 a2
0928 )
0929 {
0930 return (a0.*f)(a1, a2);
0931 }
0932 template <class Ret, class A, class A0, class A1, class A2, class A3>
0933 inline
0934 typename enable_if_c
0935 <
0936 is_base_of<A, typename remove_reference<A0>::type>::value,
0937 Ret
0938 >::type
0939 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
0940 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
0941 )
0942 {
0943 return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
0944 }
0945 template <class Ret, class A, class A0, class A1, class A2, class A3>
0946 inline
0947 typename enable_if_c
0948 <
0949 is_base_of<A, typename remove_reference<A0>::type>::value,
0950 Ret
0951 >::type
0952 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
0953 A0 a0, A1 a1, A2 a2, A3 a3
0954 )
0955 {
0956 return (a0.*f)(a1, a2, a3);
0957 }
0958
0959
0960
0961
0962 template <class Ret, class A, class A0>
0963 inline
0964 typename enable_if_c
0965 <
0966 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0967 Ret
0968 >::type
0969 invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
0970 {
0971 return ((*boost::forward<A0>(a0)).*f)();
0972 }
0973 template <class Ret, class A, class A0, class A1>
0974 inline
0975 typename enable_if_c
0976 <
0977 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0978 Ret
0979 >::type
0980 invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
0981 {
0982 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
0983 }
0984 template <class Ret, class A, class A0, class A1>
0985 inline
0986 typename enable_if_c
0987 <
0988 ! is_base_of<A, typename remove_reference<A0>::type>::value,
0989 Ret
0990 >::type
0991 invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
0992 {
0993 return ((*a0).*f)(a1);
0994 }
0995 template <class Ret, class A, class A0, class A1, class A2>
0996 inline
0997 typename enable_if_c
0998 <
0999 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1000 Ret
1001 >::type
1002 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
1003 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1004 {
1005 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1006 }
1007 template <class Ret, class A, class A0, class A1, class A2>
1008 inline
1009 typename enable_if_c
1010 <
1011 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1012 Ret
1013 >::type
1014 invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
1015 {
1016 return ((*a0).*f)(a1, a2);
1017 }
1018 template <class Ret, class A, class A0, class A1, class A2, class A3>
1019 inline
1020 typename enable_if_c
1021 <
1022 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1023 Ret
1024 >::type
1025 invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
1026 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1027 {
1028 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
1029 );
1030 }
1031 template <class Ret, class A, class A0, class A1, class A2, class A3>
1032 inline
1033 typename enable_if_c
1034 <
1035 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1036 Ret
1037 >::type
1038 invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
1039 {
1040 return ((*a0).*f)(a1, a2, a3);
1041 }
1042
1043
1044 template <class Ret, class A, class A0>
1045 inline
1046 typename enable_if_c
1047 <
1048 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1049 Ret
1050 >::type
1051 invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
1052 {
1053 return ((*boost::forward<A0>(a0)).*f)();
1054 }
1055 template <class Ret, class A, class A0, class A1>
1056 inline
1057 typename enable_if_c
1058 <
1059 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1060 Ret
1061 >::type
1062 invoke(Ret (A::*f)(A1) const,
1063 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1064 {
1065 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1066 }
1067 template <class Ret, class A, class A0, class A1>
1068 inline
1069 typename enable_if_c
1070 <
1071 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1072 Ret
1073 >::type
1074 invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
1075 {
1076 return ((*boost::forward<A0>(a0)).*f)(a1);
1077 }
1078 template <class Ret, class A, class A0, class A1>
1079 inline
1080 typename enable_if_c
1081 <
1082 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1083 Ret
1084 >::type
1085 invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
1086 {
1087 return ((*a0).*f)(a1);
1088 }
1089 template <class Ret, class A, class A0, class A1, class A2>
1090 inline
1091 typename enable_if_c
1092 <
1093 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1094 Ret
1095 >::type
1096 invoke(Ret (A::*f)(A1, A2) const,
1097 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1098 {
1099 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1100 }
1101 template <class Ret, class A, class A0, class A1, class A2>
1102 inline
1103 typename enable_if_c
1104 <
1105 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1106 Ret
1107 >::type
1108 invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
1109 {
1110 return ((*a0).*f)(a1, a2);
1111 }
1112 template <class Ret, class A, class A0, class A1, class A2, class A3>
1113 inline
1114 typename enable_if_c
1115 <
1116 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1117 Ret
1118 >::type
1119 invoke(Ret (A::*f)(A1, A2, A3) const,
1120 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1121 {
1122 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1123 }
1124 template <class Ret, class A, class A0, class A1, class A2, class A3>
1125 inline
1126 typename enable_if_c
1127 <
1128 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1129 Ret
1130 >::type
1131 invoke(Ret (A::*f)(A1, A2, A3) const,
1132 A0 a0, A1 a1, A2 a2, A3 a3)
1133 {
1134 return ((*a0).*f)(a1, a2, a3);
1135 }
1136
1137 template <class Ret, class A, class A0>
1138 inline
1139 typename enable_if_c
1140 <
1141 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1142 Ret
1143 >::type
1144 invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
1145 {
1146 return ((*boost::forward<A0>(a0)).*f)();
1147 }
1148 template <class Ret, class A, class A0, class A1>
1149 inline
1150 typename enable_if_c
1151 <
1152 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1153 Ret
1154 >::type
1155 invoke(Ret (A::*f)(A1) volatile,
1156 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1157 {
1158 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1159 }
1160 template <class Ret, class A, class A0, class A1>
1161 inline
1162 typename enable_if_c
1163 <
1164 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1165 Ret
1166 >::type
1167 invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
1168 {
1169 return ((*a0).*f)(a1);
1170 }
1171 template <class Ret, class A, class A0, class A1, class A2>
1172 inline
1173 typename enable_if_c
1174 <
1175 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1176 Ret
1177 >::type
1178 invoke(Ret (A::*f)(A1, A2) volatile,
1179 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1180 {
1181 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1182 }
1183 template <class Ret, class A, class A0, class A1, class A2>
1184 inline
1185 typename enable_if_c
1186 <
1187 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1188 Ret
1189 >::type
1190 invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
1191 {
1192 return ((*a0).*f)(a1, a2);
1193 }
1194 template <class Ret, class A, class A0, class A1, class A2, class A3>
1195 inline
1196 typename enable_if_c
1197 <
1198 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1199 Ret
1200 >::type
1201 invoke(Ret (A::*f)(A1, A2, A3) volatile,
1202 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1203 {
1204 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1205 }
1206 template <class Ret, class A, class A0, class A1, class A2, class A3>
1207 inline
1208 typename enable_if_c
1209 <
1210 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1211 Ret
1212 >::type
1213 invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
1214 {
1215 return ((*a0).*f)(a1, a2, a3);
1216 }
1217
1218 template <class Ret, class A, class A0>
1219 inline
1220 typename enable_if_c
1221 <
1222 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1223 Ret
1224 >::type
1225 invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
1226 {
1227 return ((*boost::forward<A0>(a0)).*f)();
1228 }
1229 template <class Ret, class A, class A0>
1230 inline
1231 typename enable_if_c
1232 <
1233 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1234 Ret
1235 >::type
1236 invoke(Ret (A::*f)() const volatile, A0 a0)
1237 {
1238 return ((*a0).*f)();
1239 }
1240 template <class Ret, class A, class A0, class A1>
1241 inline
1242 typename enable_if_c
1243 <
1244 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1245 Ret
1246 >::type
1247 invoke(Ret (A::*f)(A1) const volatile,
1248 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1249 {
1250 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1251 }
1252 template <class Ret, class A, class A0, class A1>
1253 inline
1254 typename enable_if_c
1255 <
1256 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1257 Ret
1258 >::type
1259 invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
1260 {
1261 return ((*a0).*f)(a1);
1262 }
1263 template <class Ret, class A, class A0, class A1, class A2>
1264 inline
1265 typename enable_if_c
1266 <
1267 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1268 Ret
1269 >::type
1270 invoke(Ret (A::*f)(A1, A2) const volatile,
1271 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1272 {
1273 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1274 }
1275 template <class Ret, class A, class A0, class A1, class A2>
1276 inline
1277 typename enable_if_c
1278 <
1279 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1280 Ret
1281 >::type
1282 invoke(Ret (A::*f)(A1, A2) const volatile,
1283 A0 a0, A1 a1, A2 a2)
1284 {
1285 return ((*a0).*f)(a1, a2);
1286 }
1287 template <class Ret, class A, class A0, class A1, class A2, class A3>
1288 inline
1289 typename enable_if_c
1290 <
1291 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1292 Ret
1293 >::type
1294 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1295 BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1296 {
1297 return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1298 }
1299 template <class Ret, class A, class A0, class A1, class A2, class A3>
1300 inline
1301 typename enable_if_c
1302 <
1303 ! is_base_of<A, typename remove_reference<A0>::type>::value,
1304 Ret
1305 >::type
1306 invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1307 A0 a0, A1 a1, A2 a2, A3 a3)
1308 {
1309 return ((*a0).*f)(a1, a2, a3);
1310 }
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368 template <class Ret, class Fp>
1369 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f)
1370 {
1371 return boost::forward<Fp>(f)();
1372 }
1373 template <class Ret, class Fp>
1374 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f)
1375 {
1376 return f();
1377 }
1378 template <class Ret, class Fp>
1379 inline
1380 typename disable_if_c
1381 <
1382 is_member_function_pointer<Fp>::value,
1383 Ret
1384 >::type
1385 invoke(BOOST_THREAD_FWD_REF(Fp) f)
1386 {
1387 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f));
1388 }
1389
1390 template <class Ret, class Fp, class A1>
1391 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1392 {
1393 return boost::forward<Fp>(f)(boost::forward<A1>(a1));
1394 }
1395 template <class Ret, class Fp, class A1>
1396 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1397 {
1398 return f(boost::forward<A1>(a1));
1399 }
1400 template <class Ret, class Fp, class A1>
1401 inline
1402 typename disable_if_c
1403 <
1404 is_member_function_pointer<Fp>::value,
1405 Ret
1406 >::type
1407 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1408 {
1409 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1));
1410 }
1411
1412 template <class Ret, class Fp, class A1, class A2>
1413 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1414 {
1415 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1416 }
1417 template <class Ret, class Fp, class A1, class A2>
1418 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1419 {
1420 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1421 }
1422 template <class Ret, class Fp, class A1, class A2>
1423 inline
1424 typename disable_if_c
1425 <
1426 is_member_function_pointer<Fp>::value,
1427 Ret
1428 >::type
1429 invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1430 {
1431 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2));
1432 }
1433
1434 template <class Ret, class Fp, class A1, class A2, class A3>
1435 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1436 {
1437 return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1438 }
1439 template <class Ret, class Fp, class A1, class A2, class A3>
1440 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1441 {
1442 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1443 }
1444 template <class Ret, class Fp, class A1, class A2, class A3>
1445 inline
1446 typename disable_if_c
1447 <
1448 is_member_function_pointer<Fp>::value,
1449 Ret
1450 >::type
1451 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)
1452 {
1453 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));
1454 }
1455
1456
1457 template <class Ret, class Fp, class A1>
1458 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1459 {
1460 return boost::forward<Fp>(f)(a1);
1461 }
1462 template <class Ret, class Fp, class A1>
1463 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1464 {
1465 return f(a1);
1466 }
1467 template <class Ret, class Fp, class A1>
1468 inline
1469 typename disable_if_c
1470 <
1471 is_member_function_pointer<Fp>::value,
1472 Ret
1473 >::type
1474 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1)
1475 {
1476 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1);
1477 }
1478
1479 template <class Ret, class Fp, class A1, class A2>
1480 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1481 {
1482 return boost::forward<Fp>(f)(a1, a2);
1483 }
1484 template <class Ret, class Fp, class A1, class A2>
1485 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1486 {
1487 return f(a1, a2);
1488 }
1489 template <class Ret, class Fp, class A1, class A2>
1490 inline
1491 typename disable_if_c
1492 <
1493 is_member_function_pointer<Fp>::value,
1494 Ret
1495 >::type
1496 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2)
1497 {
1498 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2);
1499 }
1500
1501 template <class Ret, class Fp, class A1, class A2, class A3>
1502 inline Ret do_invoke(boost::false_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1503 {
1504 return boost::forward<Fp>(f)(a1, a2, a3);
1505 }
1506 template <class Ret, class Fp, class A1, class A2, class A3>
1507 inline Ret do_invoke(boost::true_type, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1508 {
1509 return f(a1, a2, a3);
1510 }
1511 template <class Ret, class Fp, class A1, class A2, class A3>
1512 inline
1513 typename disable_if_c
1514 <
1515 is_member_function_pointer<Fp>::value,
1516 Ret
1517 >::type
1518 invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1519 {
1520 return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2, a3);
1521 }
1522
1523
1524
1525 template <class Ret, class Fp>
1526 inline
1527 typename disable_if_c
1528 <
1529 is_member_function_pointer<Fp>::value,
1530 Ret
1531 >::type
1532 invoke(Fp &f)
1533 {
1534 return f();
1535 }
1536 template <class Ret, class Fp, class A1>
1537 inline
1538 typename disable_if_c
1539 <
1540 is_member_function_pointer<Fp>::value,
1541 Ret
1542 >::type
1543 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1)
1544 {
1545 return f(boost::forward<A1>(a1));
1546 }
1547 template <class Ret, class Fp, class A1>
1548 inline
1549 typename disable_if_c
1550 <
1551 is_member_function_pointer<Fp>::value,
1552 Ret
1553 >::type
1554 invoke(Fp &f, A1 a1)
1555 {
1556 return f(a1);
1557 }
1558 template <class Ret, class Fp, class A1, class A2>
1559 inline
1560 typename disable_if_c
1561 <
1562 is_member_function_pointer<Fp>::value,
1563 Ret
1564 >::type
1565 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1566 {
1567 return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1568 }
1569 template <class Ret, class Fp, class A1, class A2>
1570 inline
1571 typename disable_if_c
1572 <
1573 is_member_function_pointer<Fp>::value,
1574 Ret
1575 >::type
1576 invoke(Fp &f, A1 a1, A2 a2)
1577 {
1578 return f(a1, a2);
1579 }
1580 template <class Ret, class Fp, class A1, class A2, class A3>
1581 inline
1582 typename disable_if_c
1583 <
1584 is_member_function_pointer<Fp>::value,
1585 Ret
1586 >::type
1587 invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1588 {
1589 return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1590 }
1591 template <class Ret, class Fp, class A1, class A2, class A3>
1592 inline
1593 typename disable_if_c
1594 <
1595 is_member_function_pointer<Fp>::value,
1596 Ret
1597 >::type
1598 invoke(Fp &f, A1 a1, A2 a2, A3 a3)
1599 {
1600 return f(a1, a2, a3);
1601 }
1602
1603
1604 #endif
1605
1606 #endif
1607 }
1608 }
1609
1610 #endif