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