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.hpp94
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)
{