diff DEPENDENCIES/generic/include/boost/fusion/functional/invocation/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/fusion/functional/invocation/invoke.hpp	Fri Sep 04 12:01:02 2015 +0100
+++ b/DEPENDENCIES/generic/include/boost/fusion/functional/invocation/invoke.hpp	Mon Sep 07 11:12:49 2015 +0100
@@ -41,6 +41,7 @@
 #include <boost/utility/result_of.hpp>
 
 #include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/detail/enabler.hpp>
 #include <boost/fusion/sequence/intrinsic/at.hpp>
 #include <boost/fusion/sequence/intrinsic/size.hpp>
 #include <boost/fusion/sequence/intrinsic/front.hpp>
@@ -52,21 +53,6 @@
 
 namespace boost { namespace fusion
 {
-    namespace result_of
-    {
-        template <typename Function, class Sequence> struct invoke;
-    }
-
-    //~ template <typename Function, class Sequence>
-    //~ inline typename result_of::invoke<Function, Sequence>::type
-    //~ invoke(Function, Sequence &);
-
-    //~ template <typename Function, class Sequence>
-    //~ inline typename result_of::invoke<Function, Sequence const>::type
-    //~ invoke(Function, Sequence const &);
-
-    //----- ---- --- -- - -  -   -
-
     namespace detail
     {
         namespace ft = function_types;
@@ -75,7 +61,8 @@
             typename Function, class Sequence,
             int N = result_of::size<Sequence>::value,
             bool CBI = ft::is_callable_builtin<Function>::value,
-            bool RandomAccess = traits::is_random_access<Sequence>::value
+            bool RandomAccess = traits::is_random_access<Sequence>::value,
+            typename Enable = void
             >
         struct invoke_impl;
 
@@ -104,16 +91,16 @@
                 Sequence, N, RandomAccess >
         { };
 
-        template <typename Function, class Sequence, int N, bool RandomAccess>
-        struct invoke_impl<Function,Sequence,N,true,RandomAccess>
+        template <typename Function, class Sequence, int N, bool RandomAccess, typename Enable>
+        struct invoke_impl<Function,Sequence,N,true,RandomAccess,Enable>
             : mpl::if_< ft::is_member_function_pointer<Function>,
                 invoke_mem_fn<Function,Sequence,N,RandomAccess>,
                 invoke_nonmember_builtin<Function,Sequence,N,RandomAccess>
             >::type
         { };
 
-        template <typename Function, class Sequence, bool RandomAccess>
-        struct invoke_impl<Function,Sequence,1,true,RandomAccess>
+        template <typename Function, class Sequence, bool RandomAccess, typename Enable>
+        struct invoke_impl<Function,Sequence,1,true,RandomAccess,Enable>
             : mpl::eval_if< ft::is_member_pointer<Function>,
                 mpl::if_< ft::is_member_function_pointer<Function>,
                     invoke_mem_fn<Function,Sequence,1,RandomAccess>,
@@ -145,6 +132,7 @@
             typedef typename boost::add_reference<qualified_type>::type
                 result_type;
 
+            BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type call(T C::* f, Sequence & s)
             {
                 typename result_of::front<Sequence>::type c = fusion::front(s);
@@ -155,15 +143,25 @@
 
     namespace result_of
     {
-        template <typename Function, class Sequence> struct invoke
+        template <typename Function, class Sequence, typename = void>
+        struct invoke;
+
+        template <typename Function, class Sequence>
+        struct invoke<Function, Sequence,
+                      typename detail::enabler<
+                          typename detail::invoke_impl<
+                              typename boost::remove_reference<Function>::type, Sequence
+                          >::result_type
+                      >::type>
         {
             typedef typename detail::invoke_impl<
                 typename boost::remove_reference<Function>::type, Sequence
-              >::result_type type;
+            >::result_type type;
         };
     }
 
     template <typename Function, class Sequence>
+    BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
     inline typename result_of::invoke<Function,Sequence>::type
     invoke(Function f, Sequence & s)
     {
@@ -173,6 +171,7 @@
     }
 
     template <typename Function, class Sequence>
+    BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
     inline typename result_of::invoke<Function,Sequence const>::type
     invoke(Function f, Sequence const & s)
     {
@@ -192,19 +191,24 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define N BOOST_PP_ITERATION()
 
+#define M(z,j,data) typename result_of::at_c<Sequence,j>::type
+
         template <typename Function, class Sequence>
-        struct invoke_impl<Function,Sequence,N,false,true>
+        struct invoke_impl<Function,Sequence,N,false,true,
+            typename enabler<
+                typename boost::result_of<Function(BOOST_PP_ENUM(N,M,~)) >::type
+              >::type>
         {
         public:
 
             typedef typename boost::result_of<
-#define M(z,j,data) typename result_of::at_c<Sequence,j>::type
                     Function(BOOST_PP_ENUM(N,M,~)) >::type result_type;
 #undef M
 
 #if N > 0
 
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -214,6 +218,7 @@
 
 #else
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -234,6 +239,7 @@
 #if N > 0
 
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -243,6 +249,7 @@
 
 #else
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -263,6 +270,7 @@
             typedef typename ft::result_type<Function>::type result_type;
 
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -280,7 +288,12 @@
                 fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j)));
 
         template <typename Function, class Sequence>
-        struct invoke_impl<Function,Sequence,N,false,false>
+        struct invoke_impl<Function,Sequence,N,false,false,
+            typename enabler<
+#define L(z,j,data) typename invoke_param_types<Sequence,N>::BOOST_PP_CAT(T, j)
+                typename boost::result_of<Function(BOOST_PP_ENUM(N,L,~))>::type
+              >::type>
+#undef L
         {
         private:
             typedef invoke_param_types<Sequence,N> seq;
@@ -293,6 +306,7 @@
 #if N > 0
 
             template <typename F>
+            BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -304,6 +318,7 @@
 #else
 
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -326,6 +341,7 @@
 #if N > 0
 
             template <typename F>
+            BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -337,6 +353,7 @@
 #else
 
             template <typename F>
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -358,6 +375,7 @@
             typedef typename ft::result_type<Function>::type result_type;
 
             template <typename F>
+            BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {