annotate DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 133:4acb5d8d80b6 tip

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