Merge from trunk

[SVN r81061]
This commit is contained in:
Joel de Guzman
2012-10-25 02:06:21 +00:00
parent 940c594d3e
commit fc38122f0f
21 changed files with 525 additions and 171 deletions

View File

@ -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
};