Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / fusion / functional / invocation / invoke.hpp
index 085beb7..d4aa945 100644 (file)
@@ -57,13 +57,13 @@ namespace boost { namespace fusion
         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>::type
+    //~ invoke(Function, Sequence &);
 
-    template <typename Function, class Sequence>
-    inline typename result_of::invoke<Function, Sequence const>::type
-    invoke(Function, Sequence const &);
+    //~ template <typename Function, class Sequence>
+    //~ inline typename result_of::invoke<Function, Sequence const>::type
+    //~ invoke(Function, Sequence const &);
 
     //----- ---- --- -- - -  -   -
 
@@ -86,6 +86,9 @@ namespace boost { namespace fusion
         struct invoke_data_member;
 
         template <typename Function, class Sequence, int N, bool RandomAccess>
+        struct invoke_fn_ptr;
+
+        template <typename Function, class Sequence, int N, bool RandomAccess>
         struct invoke_mem_fn;
 
         #define  BOOST_PP_FILENAME_1 <boost/fusion/functional/invocation/invoke.hpp>
@@ -95,10 +98,10 @@ namespace boost { namespace fusion
         template <typename F, class Sequence, int N, bool RandomAccess>
         struct invoke_nonmember_builtin
         // use same implementation as for function objects but...
-            : invoke_impl< // ...work around boost::result_of bugs
+            : invoke_fn_ptr< // ...work around boost::result_of bugs
                 typename mpl::eval_if< ft::is_function<F>,
                     boost::add_reference<F>, boost::remove_cv<F> >::type,
-                Sequence, N, false, RandomAccess >
+                Sequence, N, RandomAccess >
         { };
 
         template <typename Function, class Sequence, int N, bool RandomAccess>
@@ -142,6 +145,7 @@ namespace boost { namespace fusion
             typedef typename boost::add_reference<qualified_type>::type
                 result_type;
 
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type call(T C::* f, Sequence & s)
             {
                 typename result_of::front<Sequence>::type c = fusion::front(s);
@@ -161,6 +165,7 @@ namespace boost { namespace fusion
     }
 
     template <typename Function, class Sequence>
+    BOOST_FUSION_GPU_ENABLED
     inline typename result_of::invoke<Function,Sequence>::type
     invoke(Function f, Sequence & s)
     {
@@ -170,6 +175,7 @@ namespace boost { namespace fusion
     }
 
     template <typename Function, class Sequence>
+    BOOST_FUSION_GPU_ENABLED
     inline typename result_of::invoke<Function,Sequence const>::type
     invoke(Function f, Sequence const & s)
     {
@@ -202,6 +208,38 @@ namespace boost { namespace fusion
 #if N > 0
 
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
+            static inline result_type
+            call(F & f, Sequence & s)
+            {
+#define M(z,j,data) fusion::at_c<j>(s)
+                return f( BOOST_PP_ENUM(N,M,~) );
+            }
+
+#else
+            template <typename F>
+            BOOST_FUSION_GPU_ENABLED
+            static inline result_type
+            call(F & f, Sequence & /*s*/)
+            {
+                return f();
+            }
+
+#endif
+
+        };
+
+        template <typename Function, class Sequence>
+        struct invoke_fn_ptr<Function,Sequence,N,true>
+        {
+        public:
+
+            typedef typename ft::result_type<Function>::type result_type;
+
+#if N > 0
+
+            template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -211,6 +249,7 @@ namespace boost { namespace fusion
 
 #else
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -231,6 +270,7 @@ namespace boost { namespace fusion
             typedef typename ft::result_type<Function>::type result_type;
 
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -261,6 +301,42 @@ namespace boost { namespace fusion
 #if N > 0
 
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
+            static inline result_type
+            call(F & f, Sequence & s)
+            {
+                typename seq::I0 i0 = fusion::begin(s);
+                BOOST_PP_REPEAT_FROM_TO(1,N,M,~)
+                return f( BOOST_PP_ENUM_PARAMS(N,*i) );
+            }
+
+#else
+
+            template <typename F>
+            BOOST_FUSION_GPU_ENABLED
+            static inline result_type
+            call(F & f, Sequence & /*s*/)
+            {
+                return f();
+            }
+
+#endif
+
+        };
+
+        template <typename Function, class Sequence>
+        struct invoke_fn_ptr<Function,Sequence,N,false>
+        {
+        private:
+            typedef invoke_param_types<Sequence,N> seq;
+        public:
+
+            typedef typename ft::result_type<Function>::type result_type;
+
+#if N > 0
+
+            template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {
@@ -272,6 +348,7 @@ namespace boost { namespace fusion
 #else
 
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & /*s*/)
             {
@@ -293,6 +370,7 @@ namespace boost { namespace fusion
             typedef typename ft::result_type<Function>::type result_type;
 
             template <typename F>
+            BOOST_FUSION_GPU_ENABLED
             static inline result_type
             call(F & f, Sequence & s)
             {