diff options
Diffstat (limited to 'boost/fusion/functional/invocation/invoke_procedure.hpp')
-rw-r--r-- | boost/fusion/functional/invocation/invoke_procedure.hpp | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/boost/fusion/functional/invocation/invoke_procedure.hpp b/boost/fusion/functional/invocation/invoke_procedure.hpp index bd3e49b9d0..a0fe73a6f3 100644 --- a/boost/fusion/functional/invocation/invoke_procedure.hpp +++ b/boost/fusion/functional/invocation/invoke_procedure.hpp @@ -28,6 +28,7 @@ #include <boost/function_types/parameter_types.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/begin.hpp> @@ -38,24 +39,6 @@ namespace boost { namespace fusion { - namespace result_of - { - template <typename Function, class Sequence> struct invoke_procedure - { - typedef void type; - }; - } - - template <typename Function, class Sequence> - BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function, Sequence &); - - template <typename Function, class Sequence> - BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function, Sequence const &); - - //----- ---- --- -- - - - - - namespace detail { namespace ft = function_types; @@ -76,9 +59,27 @@ namespace boost { namespace fusion } + namespace result_of + { + template <typename Function, class Sequence, class Enable = void> + struct invoke_procedure; + + template <typename Function, class Sequence> + struct invoke_procedure<Function, Sequence, + typename detail::enabler< + typename detail::invoke_procedure_impl< + typename boost::remove_reference<Function>::type,Sequence + >::result_type + >::type> + { + typedef void type; + }; + } + template <typename Function, class Sequence> - BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function f, Sequence & s) + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED + inline typename result_of::invoke_procedure<Function, Sequence>::type + invoke_procedure(Function f, Sequence & s) { detail::invoke_procedure_impl< typename boost::remove_reference<Function>::type,Sequence @@ -86,8 +87,9 @@ namespace boost { namespace fusion } template <typename Function, class Sequence> - BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function f, Sequence const & s) + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED + inline typename result_of::invoke_procedure<Function, Sequence const>::type + invoke_procedure(Function f, Sequence const & s) { detail::invoke_procedure_impl< typename boost::remove_reference<Function>::type,Sequence const @@ -110,10 +112,11 @@ namespace boost { namespace fusion template <typename Function, class Sequence> struct invoke_procedure_impl<Function,Sequence,N,false,true> { + typedef void result_type; #if N > 0 - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { f(BOOST_PP_ENUM(N,M,~)); @@ -121,7 +124,7 @@ namespace boost { namespace fusion #else - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & /*s*/) { f(); @@ -135,7 +138,9 @@ namespace boost { namespace fusion template <typename Function, class Sequence> struct invoke_procedure_impl<Function,Sequence,N,true,true> { - BOOST_FUSION_GPU_ENABLED + typedef void result_type; + + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { (that_ptr<typename mpl::front< @@ -155,10 +160,11 @@ namespace boost { namespace fusion template <typename Function, class Sequence> struct invoke_procedure_impl<Function,Sequence,N,false,false> { + typedef void result_type; #if N > 0 - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { typedef typename result_of::begin<Sequence>::type I0; @@ -168,7 +174,7 @@ namespace boost { namespace fusion } #else - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & /*s*/) { f(); @@ -182,7 +188,9 @@ namespace boost { namespace fusion template <typename Function, class Sequence> struct invoke_procedure_impl<Function,Sequence,N,true,false> { - BOOST_FUSION_GPU_ENABLED + typedef void result_type; + + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { typedef typename result_of::begin<Sequence>::type I0; |