mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-23 00:57:20 +02:00
Fixed code to allow decltype implementation of boost::result_of with BOOST_RESULT_OF_USE_DECLTYPE defined.
[SVN r80395]
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> struct invoke;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Function, class Sequence>
|
//~ template <typename Function, class Sequence>
|
||||||
inline typename result_of::invoke<Function, Sequence>::type
|
//~ inline typename result_of::invoke<Function, Sequence>::type
|
||||||
invoke(Function, Sequence &);
|
//~ invoke(Function, Sequence &);
|
||||||
|
|
||||||
template <typename Function, class Sequence>
|
//~ template <typename Function, class Sequence>
|
||||||
inline typename result_of::invoke<Function, Sequence const>::type
|
//~ inline typename result_of::invoke<Function, Sequence const>::type
|
||||||
invoke(Function, Sequence const &);
|
//~ invoke(Function, Sequence const &);
|
||||||
|
|
||||||
//----- ---- --- -- - - - -
|
//----- ---- --- -- - - - -
|
||||||
|
|
||||||
@ -85,6 +85,9 @@ namespace boost { namespace fusion
|
|||||||
template <typename T, class Sequence>
|
template <typename T, class Sequence>
|
||||||
struct invoke_data_member;
|
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>
|
template <typename Function, class Sequence, int N, bool RandomAccess>
|
||||||
struct invoke_mem_fn;
|
struct invoke_mem_fn;
|
||||||
|
|
||||||
@ -95,10 +98,10 @@ namespace boost { namespace fusion
|
|||||||
template <typename F, class Sequence, int N, bool RandomAccess>
|
template <typename F, class Sequence, int N, bool RandomAccess>
|
||||||
struct invoke_nonmember_builtin
|
struct invoke_nonmember_builtin
|
||||||
// use same implementation as for function objects but...
|
// 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>,
|
typename mpl::eval_if< ft::is_function<F>,
|
||||||
boost::add_reference<F>, boost::remove_cv<F> >::type,
|
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>
|
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;
|
Function(BOOST_PP_ENUM(N,M,~)) >::type result_type;
|
||||||
#undef M
|
#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
|
#if N > 0
|
||||||
|
|
||||||
template <typename F>
|
template <typename F>
|
||||||
@ -278,6 +310,39 @@ namespace boost { namespace fusion
|
|||||||
return f();
|
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
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user