diff options
Diffstat (limited to 'src/third_party/boost-1.56.0/boost/thread/detail/invoke.hpp')
-rw-r--r-- | src/third_party/boost-1.56.0/boost/thread/detail/invoke.hpp | 1606 |
1 files changed, 0 insertions, 1606 deletions
diff --git a/src/third_party/boost-1.56.0/boost/thread/detail/invoke.hpp b/src/third_party/boost-1.56.0/boost/thread/detail/invoke.hpp deleted file mode 100644 index c81f50fba2b..00000000000 --- a/src/third_party/boost-1.56.0/boost/thread/detail/invoke.hpp +++ /dev/null @@ -1,1606 +0,0 @@ -// Copyright (C) 2012-2013 Vicente J. Botet Escriba -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// 2013/04 Vicente J. Botet Escriba -// Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined. -// Make use of Boost.Move -// Make use of Boost.Tuple (movable) -// 2012 Vicente J. Botet Escriba -// Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined -// 2012 Vicente J. Botet Escriba -// Adapt to boost libc++ implementation - -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -// The invoke code is based on the one from libcxx. -//===----------------------------------------------------------------------===// - -#ifndef BOOST_THREAD_DETAIL_INVOKE_HPP -#define BOOST_THREAD_DETAIL_INVOKE_HPP - -#include <boost/config.hpp> -#include <boost/static_assert.hpp> -#include <boost/thread/detail/move.hpp> -#include <boost/core/enable_if.hpp> -#include <boost/mpl/bool.hpp> -#include <boost/type_traits/is_base_of.hpp> -#include <boost/type_traits/is_pointer.hpp> -#include <boost/type_traits/is_member_function_pointer.hpp> -#include <boost/type_traits/remove_reference.hpp> -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL -#include <functional> -#endif - -namespace boost -{ - namespace detail - { - - -#if ! defined(BOOST_NO_SFINAE_EXPR) && \ - ! defined(BOOST_NO_CXX11_DECLTYPE) && \ - ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \ - ! defined(BOOST_THREAD_NO_CXX11_DECLTYPE_N3276) && \ - ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES) - -#define BOOST_THREAD_PROVIDES_INVOKE - -#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - // bullets 1 and 2 - - template <class Fp, class A0, class ...Args> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...)) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - template <class R, class Fp, class A0, class ...Args> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...)) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - - template <class Fp, class A0, class ...Args> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...)) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - template <class R, class Fp, class A0, class ...Args> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...)) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - - // bullets 3 and 4 - - template <class Fp, class A0> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(boost::forward<A0>(a0).*f) - { - return boost::forward<A0>(a0).*f; - } - - template <class Fp, class A0> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((*boost::forward<A0>(a0)).*f) - { - return (*boost::forward<A0>(a0)).*f; - } - - template <class R, class Fp, class A0> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(boost::forward<A0>(a0).*f) - { - return boost::forward<A0>(a0).*f; - } - - template <class R, class Fp, class A0> - inline auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((*boost::forward<A0>(a0)).*f) - { - return (*boost::forward<A0>(a0)).*f; - } - - - // bullet 5 - - template <class R, class Fp, class ...Args> - inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...)) - { - return boost::forward<Fp>(f)(boost::forward<Args>(args)...); - } - template <class Fp, class ...Args> - inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) - -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...)) - { - return boost::forward<Fp>(f)(boost::forward<Args>(args)...); - } - -#else // BOOST_NO_CXX11_VARIADIC_TEMPLATES - - // bullets 1 and 2 - - template <class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((boost::forward<A0>(a0).*f)()) - { - return (boost::forward<A0>(a0).*f)(); - } - template <class R, class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((boost::forward<A0>(a0).*f)()) - { - return (boost::forward<A0>(a0).*f)(); - } - template <class Fp, class A0, class A1> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1))) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); - } - template <class R, class Fp, class A0, class A1> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1))) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); - } - template <class Fp, class A0, class A1, class A2> - inline - auto - 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) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class R, class Fp, class A0, class A1, class A2> - inline - auto - 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) - -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - - template <class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(((*boost::forward<A0>(a0)).*f)()) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class R, class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(((*boost::forward<A0>(a0)).*f)()) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class Fp, class A0, class A1> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1))) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class R, class Fp, class A0, class A1> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1))) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class Fp, class A0, class A1, class A2> - inline - auto - 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) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class R, class Fp, class A0, class A1, class A2> - inline - auto - 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) - -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - - // bullets 3 and 4 - - template <class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(boost::forward<A0>(a0).*f) - { - return boost::forward<A0>(a0).*f; - } - template <class R, class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype(boost::forward<A0>(a0).*f) - { - return boost::forward<A0>(a0).*f; - } - - template <class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((*boost::forward<A0>(a0)).*f) - { - return (*boost::forward<A0>(a0)).*f; - } - template <class R, class Fp, class A0> - inline - auto - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0) - -> decltype((*boost::forward<A0>(a0)).*f) - { - return (*boost::forward<A0>(a0)).*f; - } - - // bullet 5 - - template <class Fp> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f) - -> decltype(boost::forward<Fp>(f)()) - { - return boost::forward<Fp>(f)(); - } - template <class Fp, class A1> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1)); - } template <class Fp, class A1, class A2> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Fp, class A1, class A2, class A3> - inline - 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) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - - - template <class R, class Fp> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f) - -> decltype(boost::forward<Fp>(f)()) - { - return boost::forward<Fp>(f)(); - } - template <class R, class Fp, class A1> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1)); - } - template <class R, class Fp, class A1, class A2> - inline - auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class R, class Fp, class A1, class A2, class A3> - inline - 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) - -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - -#endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES - -#elif ! defined(BOOST_NO_SFINAE_EXPR) && \ - ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \ - defined BOOST_MSVC - -//#error - template <class Ret, class Fp> - inline - Ret invoke(BOOST_THREAD_RV_REF(Fp) f) - { - return f(); - } - template <class Ret, class Fp, class A1> - inline - Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - { - return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))(); - } - template <class Ret, class Fp, class A1, class A2> - inline - Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))(); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline - 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) - { - return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))(); - } - -#define BOOST_THREAD_PROVIDES_INVOKE_RET - -#elif ! defined BOOST_MSVC -//!!!!! WARNING !!!!! THIS DOESN'T WORKS YET -#define BOOST_THREAD_PROVIDES_INVOKE_RET - -#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - - // bullet 1 - // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of - // type T or a reference to an object of type T or a reference to an object of a type derived from T - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...); - } - - // bullet 2 - // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of - // the types described in the previous item; - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - - template <class Ret, class A, class A0, class ...Args> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...); - } - - // bullet 3 - // 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 - // reference to an object of type T or a reference to an object of a type derived from T; -// template <class Ret, class A, class A0> -// inline -// typename enable_if_c -// < -// is_base_of<A, typename remove_reference<A0>::type>::value, -// typename detail::apply_cv<A0, A>::type& -// >::type -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return boost::forward<A0>(a0).*f; -// } - - // bullet 4 - // (*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 - //described in the previous item; - -// template <class A0, class Ret, bool> -// struct d4th_helper -// { -// }; -// -// template <class A0, class Ret> -// struct d4th_helper<A0, Ret, true> -// { -// typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type; -// }; -// -// template <class Ret, class A, class A0> -// inline -// typename detail::4th_helper<A, Ret, -// !is_base_of<A, -// typename remove_reference<A0>::type -// >::value -// >::type& -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return (*boost::forward<A0>(a0)).*f; -// } - -// template <class Ret, class A, class A0> -// inline -// typename enable_if_c -// < -// !is_base_of<A, typename remove_reference<A0>::type>::value, -// typename detail::ref_return1<Ret A::*, A0>::type -// >::type -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return (*boost::forward<A0>(a0)).*f; -// } - - // bullet 5 - // f(t1, t2, ..., tN) in all other cases. - - template <class Ret, class Fp, class ...Args> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) - { - return boost::forward<Fp>(f)(boost::forward<Args>(args)...); - } - - template <class Ret, class Fp, class ...Args> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) - { - return f(boost::forward<Args>(args)...); - } - - template <class Ret, class Fp, class ...Args> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<Args>(args)...); - } -#else // BOOST_NO_CXX11_VARIADIC_TEMPLATES - // bullet 1 - // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of - // type T or a reference to an object of type T or a reference to an object of a type derived from T - - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(), A0& a0) - { - return (a0.*f)(); - } - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(), A0* a0) - { - return ((*a0).*f)(); - } - - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), - A0& a0, BOOST_THREAD_RV_REF(A1) a1 - ) - { - return (a0.*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), A0& a0, A1 a1) - { - return (a0.*f)(a1); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1 - ) - { - return (*(a0).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), A0* a0, A1 a1) - { - return (*a0.*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2), - A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 - ) - { - return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2) - { - return ((*a0).*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3), - A0& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3) - { - return ((*a0).*f)(a1, a2, a3); - } - -/// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const, A0 const& a0) - { - return (a0.*f)(); - } - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const, A0 const* a0) - { - return ((*a0).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1) - { - return (a0.*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, A0 const* a0, BOOST_THREAD_RV_REF(A1) a1) - { - return ((*a0).*f)(boost::forward<A1>(a1)); - } - - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, A0 const& a0, A1 a1) - { - return (a0.*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const, - A0 const& a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 - ) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2) - ); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2) - { - return (a0.*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 - ) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3) - { - return (a0.*f)(a1, a2, a3); - } - /// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) - { - return (boost::forward<A0>(a0).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) - { - return (a0.*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 ) - { - return (a0.*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 - ) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) - { - return (a0.*f)(a1, a2, a3); - } - /// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) - { - return (boost::forward<A0>(a0).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) - { - return (a0.*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2 - ) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const volatile, - A0 a0, A1 a1, A2 a2 - ) - { - return (a0.*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3 - ) - { - return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const volatile, - A0 a0, A1 a1, A2 a2, A3 a3 - ) - { - return (a0.*f)(a1, a2, a3); - } - - // bullet 2 - // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of - // the types described in the previous item; - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1), A0 a0, A1 a1) - { - return ((*a0).*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)), - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2) - { - return ((*a0).*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)), - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3) - ); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3) - { - return ((*a0).*f)(a1, a2, a3); - } - -/// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1) - { - return ((*boost::forward<A0>(a0)).*f)(a1); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1) - { - return ((*a0).*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2) - { - return ((*a0).*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const, - A0 a0, A1 a1, A2 a2, A3 a3) - { - return ((*a0).*f)(a1, a2, a3); - } - /// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1) - { - return ((*a0).*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2) - { - return ((*a0).*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3) - { - return ((*a0).*f)(a1, a2, a3); - } - /// - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0) - { - return ((*boost::forward<A0>(a0)).*f)(); - } - template <class Ret, class A, class A0> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)() const volatile, A0 a0) - { - return ((*a0).*f)(); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)); - } - template <class Ret, class A, class A0, class A1> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1) - { - return ((*a0).*f)(a1); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class A, class A0, class A1, class A2> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2) const volatile, - A0 a0, A1 a1, A2 a2) - { - return ((*a0).*f)(a1, a2); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const volatile, - BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class A, class A0, class A1, class A2, class A3> - inline - typename enable_if_c - < - ! is_base_of<A, typename remove_reference<A0>::type>::value, - Ret - >::type - invoke(Ret (A::*f)(A1, A2, A3) const volatile, - A0 a0, A1 a1, A2 a2, A3 a3) - { - return ((*a0).*f)(a1, a2, a3); - } - // bullet 3 - // 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 - // reference to an object of type T or a reference to an object of a type derived from T; -// template <class Ret, class A, class A0> -// inline -// typename enable_if_c -// < -// is_base_of<A, typename remove_reference<A0>::type>::value, -// typename detail::apply_cv<A0, A>::type& -// >::type -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return boost::forward<A0>(a0).*f; -// } - - // bullet 4 - // (*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 - //described in the previous item; - -// template <class A0, class Ret, bool> -// struct d4th_helper -// { -// }; -// -// template <class A0, class Ret> -// struct d4th_helper<A0, Ret, true> -// { -// typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type; -// }; -// -// template <class Ret, class A, class A0> -// inline -// typename detail::4th_helper<A, Ret, -// !is_base_of<A, -// typename remove_reference<A0>::type -// >::value -// >::type& -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return (*boost::forward<A0>(a0)).*f; -// } - -// template <class Ret, class A, class A0> -// inline -// typename enable_if_c -// < -// !is_base_of<A, typename remove_reference<A0>::type>::value, -// typename detail::ref_return1<Ret A::*, A0>::type -// >::type -// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0) -// { -// return (*boost::forward<A0>(a0)).*f; -// } - - // bullet 5 - // f(t1, t2, ..., tN) in all other cases. - - template <class Ret, class Fp> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f) - { - return boost::forward<Fp>(f)(); - } - template <class Ret, class Fp> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f) - { - return f(); - } - template <class Ret, class Fp> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f)); - } - - template <class Ret, class Fp, class A1> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1)); - } - template <class Ret, class Fp, class A1> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - { - return f(boost::forward<A1>(a1)); - } - template <class Ret, class Fp, class A1> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1)); - } - - template <class Ret, class Fp, class A1, class A2> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class Fp, class A1, class A2> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class Fp, class A1, class A2> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - - template <class Ret, class Fp, class A1, class A2, class A3> - 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) - { - return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class Fp, class A1, class A2, class A3> - 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) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - 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) - { - 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)); - } - - - template <class Ret, class Fp, class A1> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) - { - return boost::forward<Fp>(f)(a1); - } - template <class Ret, class Fp, class A1> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1) - { - return f(a1); - } - template <class Ret, class Fp, class A1> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1); - } - - template <class Ret, class Fp, class A1, class A2> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) - { - return boost::forward<Fp>(f)(a1, a2); - } - template <class Ret, class Fp, class A1, class A2> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) - { - return f(a1, a2); - } - template <class Ret, class Fp, class A1, class A2> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2); - } - - template <class Ret, class Fp, class A1, class A2, class A3> - inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) - { - return boost::forward<Fp>(f)(a1, a2, a3); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline Ret do_invoke(mpl::true_, BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) - { - return f(a1, a2, a3); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(BOOST_THREAD_FWD_REF(Fp) f, A1 a1, A2 a2, A3 a3) - { - return boost::detail::do_invoke<Ret>(boost::is_pointer<Fp>(), boost::forward<Fp>(f), a1, a2, a3); - } - - - /// - template <class Ret, class Fp> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f) - { - return f(); - } - template <class Ret, class Fp, class A1> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1) - { - return f(boost::forward<A1>(a1)); - } - template <class Ret, class Fp, class A1> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, A1 a1) - { - return f(a1); - } - template <class Ret, class Fp, class A1, class A2> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2)); - } - template <class Ret, class Fp, class A1, class A2> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, A1 a1, A2 a2) - { - return f(a1, a2); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3) - { - return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)); - } - template <class Ret, class Fp, class A1, class A2, class A3> - inline - typename disable_if_c - < - is_member_function_pointer<Fp>::value, - Ret - >::type - invoke(Fp &f, A1 a1, A2 a2, A3 a3) - { - return f(a1, a2, a3); - } - /// - -#endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES - -#endif // all - } - } - -#endif // header |