diff options
Diffstat (limited to 'boost/fusion/functional/invocation/invoke.hpp')
-rw-r--r-- | boost/fusion/functional/invocation/invoke.hpp | 94 |
1 files changed, 86 insertions, 8 deletions
diff --git a/boost/fusion/functional/invocation/invoke.hpp b/boost/fusion/functional/invocation/invoke.hpp index 085beb7eda..d4aa945647 100644 --- a/boost/fusion/functional/invocation/invoke.hpp +++ b/boost/fusion/functional/invocation/invoke.hpp @@ -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) { |