annotate DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
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