diff DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp @ 101:c530137014c0

Update Boost headers (1.58.0)
author Chris Cannam
date Mon, 07 Sep 2015 11:12:49 +0100
parents 2665513ce2d3
children
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp	Fri Sep 04 12:01:02 2015 +0100
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/invoke.hpp	Mon Sep 07 11:12:49 2015 +0100
@@ -28,7 +28,11 @@
 #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>
@@ -40,11 +44,10 @@
   {
 
 
-#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
-    ! defined(BOOST_NO_SFINAE_EXPR) && \
+#if ! defined(BOOST_NO_SFINAE_EXPR) && \
     ! defined(BOOST_NO_CXX11_DECLTYPE) && \
     ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
-    ! defined(BOOST_NO_CXX11_AUTO)
+    ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
 
 #define BOOST_THREAD_PROVIDES_INVOKE
 
@@ -58,6 +61,13 @@
     {
         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
@@ -66,6 +76,13 @@
     {
         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
 
@@ -85,14 +102,38 @@
         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
@@ -105,21 +146,45 @@
     {
         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<Args>(a1)))
+        -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1)))
     {
-        return (boost::forward<A0>(a0).*f)(boost::forward<Args>(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<Args>(a1), boost::forward<Args>(a2)))
+        -> decltype((boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
     {
-        return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(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>
@@ -130,21 +195,45 @@
     {
         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<Args>(a1)))
+        -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1)))
     {
-        return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1));
+        return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
     }
-    template <class Fp, class A0, class 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<Args>(a1), boost::forward<Args>(a2)))
+        -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
     {
-        return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(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
@@ -157,6 +246,14 @@
     {
         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
@@ -166,6 +263,14 @@
     {
         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
 
@@ -178,7 +283,7 @@
     }
     template <class Fp, class A1>
     inline
-    auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1)
+    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));
@@ -197,6 +302,36 @@
       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) && \
@@ -396,21 +531,27 @@
     // 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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
     invoke(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 ...Args>
-    inline Ret
-    invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args)
-    {
-      return f(boost::forward<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
@@ -424,9 +565,34 @@
         is_base_of<A, typename remove_reference<A0>::type>::value,
         Ret
     >::type
-    invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
+    invoke(Ret (A::*f)(), A0& a0)
     {
-        return (boost::forward<A0>(a0).*f)();
+        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
@@ -435,9 +601,9 @@
         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)
+    invoke(Ret (A::*f)(A1), A0& a0, A1 a1)
     {
-        return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
+        return (a0.*f)(a1);
     }
     template <class Ret, class A, class A0, class A1>
     inline
@@ -446,9 +612,21 @@
         is_base_of<A, typename remove_reference<A0>::type>::value,
         Ret
     >::type
-    invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
+    invoke(Ret (A::*f)(A1), A0* a0, BOOST_THREAD_RV_REF(A1) a1
+        )
     {
-        return (a0.*f)(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
@@ -458,10 +636,10 @@
         Ret
     >::type
     invoke(Ret (A::*f)(A1, A2),
-        BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
+        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));
+        return (a0.*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
     }
     template <class Ret, class A, class A0, class A1, class A2>
     inline
@@ -470,9 +648,9 @@
         is_base_of<A, typename remove_reference<A0>::type>::value,
         Ret
     >::type
-    invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
+    invoke(Ret (A::*f)(A1, A2), A0* a0, A1 a1, A2 a2)
     {
-        return (a0.*f)(a1, a2);
+        return ((*a0).*f)(a1, a2);
     }
     template <class Ret, class A, class A0, class A1, class A2, class A3>
     inline
@@ -482,9 +660,9 @@
         Ret
     >::type
     invoke(Ret (A::*f)(A1, A2, 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)
+        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));
+        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
@@ -493,9 +671,9 @@
         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)
+    invoke(Ret (A::*f)(A1, A2, A3), A0* a0, A1 a1, A2 a2, A3 a3)
     {
-        return (a0.*f)(a1, a2, a3);
+        return ((*a0).*f)(a1, a2, a3);
     }
 
 ///
@@ -506,9 +684,20 @@
         is_base_of<A, typename remove_reference<A0>::type>::value,
         Ret
     >::type
-    invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
+    invoke(Ret (A::*f)() const, A0 const& a0)
     {
-        return (boost::forward<A0>(a0).*f)();
+        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
@@ -517,9 +706,9 @@
         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)
+    invoke(Ret (A::*f)(A1) const, A0 const& a0, BOOST_THREAD_RV_REF(A1) a1)
     {
-        return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
+        return (a0.*f)(boost::forward<A1>(a1));
     }
     template <class Ret, class A, class A0, class A1>
     inline
@@ -528,7 +717,19 @@
         is_base_of<A, typename remove_reference<A0>::type>::value,
         Ret
     >::type
-    invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
+    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);
     }
@@ -540,7 +741,7 @@
         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
+        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)
@@ -553,7 +754,7 @@
         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)
+    invoke(Ret (A::*f)(A1, A2) const, A0 const& a0, A1 a1, A2 a2)
     {
         return (a0.*f)(a1, a2);
     }
@@ -1159,189 +1360,241 @@
     // f(t1, t2, ..., tN) in all other cases.
 
     template <class Ret, class Fp>
-    inline
-    typename enable_if_c
-    <
-        ! is_member_function_pointer<Fp>::value,
-        Ret
-    >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f)
+    inline Ret do_invoke(mpl::false_, BOOST_THREAD_FWD_REF(Fp) f)
     {
       return boost::forward<Fp>(f)();
     }
-    template <class Ret, class Fp, class A1>
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1)
+    invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
     {
-      return boost::forward<Fp>(f)(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
-    typename enable_if_c
-    <
-        ! is_member_function_pointer<Fp>::value,
-        Ret
-    >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) 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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2)
+    invoke(BOOST_THREAD_FWD_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
     {
-      return boost::forward<Fp>(f)(a1, 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
-    typename enable_if_c
-    <
-        ! is_member_function_pointer<Fp>::value,
-        Ret
-    >::type
-    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)
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3)
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f)
+    invoke(Fp &f)
     {
       return f();
     }
     template <class Ret, class Fp, class A1>
     inline
-    typename enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1)
+    invoke(Fp &f, BOOST_THREAD_RV_REF(A1) a1)
     {
       return f(boost::forward<A1>(a1));
     }
     template <class Ret, class Fp, class A1>
     inline
-    typename enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, A1 a1)
+    invoke(Fp &f, A1 a1)
     {
       return f(a1);
     }
     template <class Ret, class Fp, class A1, class A2>
     inline
-    typename enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, A1 a1, A2 a2)
+    invoke(Fp &f, A1 a1, A2 a2)
     {
       return f(a1, a2);
     }
     template <class Ret, class Fp, class A1, class A2, class A3>
     inline
-    typename enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
+    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 enable_if_c
+    typename disable_if_c
     <
-        ! is_member_function_pointer<Fp>::value,
+        is_member_function_pointer<Fp>::value,
         Ret
     >::type
-    invoke(Fp const &f, A1 a1, A2 a2, A3 a3)
+    invoke(Fp &f, A1 a1, A2 a2, A3 a3)
     {
       return f(a1, a2, a3);
     }
     ///
 
-    template <class Ret>
-    inline Ret
-    invoke(Ret(*f)())
-    {
-      return f();
-    }
-    template <class Ret, class A1>
-    inline Ret
-    invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1)
-    {
-      return f(boost::forward<A1>(a1));
-    }
-    template <class Ret, class A1, class A2>
-    inline Ret
-    invoke(Ret(*f)(A1, A2),
-        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 A1, class A2, class A3>
-    inline Ret
-    invoke(Ret(*f)(A1, A2, A3),
-        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));
-    }
 #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
 
 #endif  // all