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 &);
//----- ---- --- -- - - - -
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>
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>
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);
}
template <typename Function, class Sequence>
+ BOOST_FUSION_GPU_ENABLED
inline typename result_of::invoke<Function,Sequence>::type
invoke(Function f, Sequence & s)
{
}
template <typename Function, class Sequence>
+ BOOST_FUSION_GPU_ENABLED
inline typename result_of::invoke<Function,Sequence const>::type
invoke(Function f, Sequence const & s)
{
#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)
{
#else
template <typename F>
+ BOOST_FUSION_GPU_ENABLED
static inline result_type
call(F & f, Sequence & /*s*/)
{
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)
{
#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)
{
#else
template <typename F>
+ BOOST_FUSION_GPU_ENABLED
static inline result_type
call(F & f, Sequence & /*s*/)
{
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)
{