summaryrefslogtreecommitdiff
path: root/boost/fusion/functional/invocation/invoke_procedure.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/functional/invocation/invoke_procedure.hpp')
-rw-r--r--boost/fusion/functional/invocation/invoke_procedure.hpp64
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;