diff options
Diffstat (limited to 'boost/fusion/functional/invocation/invoke.hpp')
-rw-r--r-- | boost/fusion/functional/invocation/invoke.hpp | 81 |
1 files changed, 43 insertions, 38 deletions
diff --git a/boost/fusion/functional/invocation/invoke.hpp b/boost/fusion/functional/invocation/invoke.hpp index d4aa945647..b79ff5b439 100644 --- a/boost/fusion/functional/invocation/invoke.hpp +++ b/boost/fusion/functional/invocation/invoke.hpp @@ -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 @@ namespace boost { namespace fusion 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 @@ namespace boost { namespace fusion 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,7 +132,7 @@ namespace boost { namespace fusion typedef typename boost::add_reference<qualified_type>::type result_type; - BOOST_FUSION_GPU_ENABLED + 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); @@ -156,16 +143,25 @@ namespace boost { namespace fusion 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_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED inline typename result_of::invoke<Function,Sequence>::type invoke(Function f, Sequence & s) { @@ -175,7 +171,7 @@ namespace boost { namespace fusion } template <typename Function, class Sequence> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED inline typename result_of::invoke<Function,Sequence const>::type invoke(Function f, Sequence const & s) { @@ -195,20 +191,24 @@ namespace boost { namespace fusion /////////////////////////////////////////////////////////////////////////////// #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_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -218,7 +218,7 @@ namespace boost { namespace fusion #else template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -239,7 +239,7 @@ namespace boost { namespace fusion #if N > 0 template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -249,7 +249,7 @@ namespace boost { namespace fusion #else template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -270,7 +270,7 @@ namespace boost { namespace fusion typedef typename ft::result_type<Function>::type result_type; template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -288,7 +288,12 @@ namespace boost { namespace fusion 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; @@ -301,7 +306,7 @@ namespace boost { namespace fusion #if N > 0 template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -313,7 +318,7 @@ namespace boost { namespace fusion #else template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -336,7 +341,7 @@ namespace boost { namespace fusion #if N > 0 template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -348,7 +353,7 @@ namespace boost { namespace fusion #else template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -370,7 +375,7 @@ namespace boost { namespace fusion typedef typename ft::result_type<Function>::type result_type; template <typename F> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { |