forked from boostorg/fusion
Merge from trunk
[SVN r81061]
This commit is contained in:
@ -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 &);
|
||||
|
||||
//----- ---- --- -- - - - -
|
||||
|
||||
@ -85,6 +85,9 @@ namespace boost { namespace fusion
|
||||
template <typename T, class Sequence>
|
||||
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;
|
||||
|
||||
@ -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>
|
||||
@ -199,6 +202,35 @@ namespace boost { namespace fusion
|
||||
Function(BOOST_PP_ENUM(N,M,~)) >::type result_type;
|
||||
#undef M
|
||||
|
||||
#if N > 0
|
||||
|
||||
template <typename F>
|
||||
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>
|
||||
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>
|
||||
@ -278,6 +310,39 @@ namespace boost { namespace fusion
|
||||
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>
|
||||
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>
|
||||
static inline result_type
|
||||
call(F & f, Sequence & /*s*/)
|
||||
{
|
||||
return f();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
};
|
||||
|
Reference in New Issue
Block a user