Update of /cvsroot/boost/boost/boost/fusion/functional/invocation
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv14992
Modified Files:
invoke.hpp
Log Message:
adds const correctness, simplifies code, fixes nullary member function
invocation
Index: invoke.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/fusion/functional/invocation/invoke.hpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- invoke.hpp 19 Mar 2007 18:16:21 -0000 1.2
+++ invoke.hpp 13 Jul 2007 16:29:45 -0000 1.3
@@ -22,15 +22,9 @@
#include <boost/mpl/if.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/or.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/less.hpp>
-#include <boost/mpl/equal_to.hpp>
-#include <boost/mpl/size_t.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/identity.hpp>
-#include <boost/blank.hpp>
-
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/type_traits/add_reference.hpp>
@@ -39,10 +33,10 @@
#include <boost/function_types/is_function.hpp>
#include <boost/function_types/is_callable_builtin.hpp>
+#include <boost/function_types/is_member_pointer.hpp>
#include <boost/function_types/is_member_function_pointer.hpp>
#include <boost/function_types/result_type.hpp>
#include <boost/function_types/parameter_types.hpp>
-#include <boost/function_types/function_arity.hpp>
#include <boost/utility/result_of.hpp>
@@ -81,45 +75,53 @@
typename Function, class Sequence,
int N = result_of::size<Sequence>::value,
bool CBI = ft::is_callable_builtin<Function>::value,
- bool MFP = ft::is_member_function_pointer<Function>::value,
bool RandomAccess = traits::is_random_access<Sequence>::value
>
- struct invoke_impl
- {
- typedef boost::blank result;
- };
+ struct invoke_impl;
- template <class Sequence, int N> struct invoke_param_types;
+ template <class Sequence, int N>
+ struct invoke_param_types;
- template <typename Func, class N, bool CBI = true, typename Sig = void>
- // contains type member with the result, empty on error
- struct invoke_result
- : mpl::if_<
- mpl::or_<
- mpl::equal_to< ft::function_arity<Func>, N >,
- mpl::and_< ft::is_callable_builtin<Func, ft::variadic>,
- mpl::less< ft::function_arity<Func>, N > >
- >, ft::result_type<Func>, boost::blank
- >::type
- { };
- template <typename Func, class N, typename Sig>
- struct invoke_result<Func,N,false,Sig>
- : boost::result_of<Sig>
- { };
+ template <typename T, class Sequence>
+ struct invoke_data_member;
- // Transform for F so that boost::result_of< F(...) > works
- template <typename F> struct invoke_result_of_prep
- : mpl::if_< ft::is_function<F>, boost::add_reference<F>,
- boost::remove_cv<F>
- >::type
- { };
+ template <typename Function, class Sequence, int N, bool RandomAccess>
+ struct invoke_mem_fn;
#define BOOST_PP_FILENAME_1
<boost/fusion/functional/invocation/invoke.hpp>
#define BOOST_PP_ITERATION_LIMITS (0, BOOST_FUSION_INVOKE_MAX_ARITY)
#include BOOST_PP_ITERATE()
+ 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
+ typename mpl::eval_if< ft::is_function<F>,
+ boost::add_reference<F>, boost::remove_cv<F> >::type,
+ Sequence, N, false, RandomAccess >
+ { };
+
+ template <typename Function, class Sequence, int N, bool RandomAccess>
+ struct invoke_impl<Function,Sequence,N,true,RandomAccess>
+ : mpl::if_< ft::is_member_function_pointer<Function>,
+ invoke_mem_fn<Function,Sequence,N,RandomAccess>,
+ invoke_nonmember_builtin<Function,Sequence,N,RandomAccess>
+ >::type
+ { };
+
+ template <typename Function, class Sequence, bool RandomAccess>
+ struct invoke_impl<Function,Sequence,1,true,RandomAccess>
+ : mpl::eval_if< ft::is_member_pointer<Function>,
+ mpl::if_< ft::is_member_function_pointer<Function>,
+ invoke_mem_fn<Function,Sequence,1,RandomAccess>,
+ invoke_data_member<Function, Sequence> >,
+ mpl::identity< invoke_nonmember_builtin<
+ Function,Sequence,1,RandomAccess> >
+ >::type
+ { };
+
template <typename T, class C, class Sequence>
- struct invoke_data_member
+ struct invoke_data_member< T C::*, Sequence >
{
private:
@@ -137,37 +139,25 @@
public:
- template <typename _ = void>
- struct result
- : boost::add_reference<qualified_type>
- { };
+ typedef typename boost::add_reference<qualified_type>::type
+ result_type;
- static inline typename result<>::type call(T C::* f, Sequence & s)
+ static inline result_type call(T C::* f, Sequence & s)
{
typename result_of::front<Sequence>::type c = fusion::front(s);
return that_ptr<qualified_class>::get(c)->*f;
}
};
-
- template <typename T, class C, class Sequence>
- struct invoke_impl<T C::*, Sequence, 1, true, false, false>
- : detail::invoke_data_member<T, C, Sequence>
- { };
-
- template <typename T, class C, class Sequence>
- struct invoke_impl<T C::*, Sequence, 1, true, false, true>
- : detail::invoke_data_member<T, C, Sequence>
- { };
-
}
namespace result_of
{
template <typename Function, class Sequence> struct invoke
- : detail::invoke_impl<
+ {
+ typedef typename detail::invoke_impl<
typename boost::remove_reference<Function>::type, Sequence
- >::template result<>
- { };
+ >::result_type type;
+ };
}
template <typename Function, class Sequence>
@@ -199,23 +189,18 @@
///////////////////////////////////////////////////////////////////////////////
#define N BOOST_PP_ITERATION()
- template <typename Function, class Sequence, bool CBI>
- struct invoke_impl<Function,Sequence,N,CBI,false,true>
+ template <typename Function, class Sequence>
+ struct invoke_impl<Function,Sequence,N,false,true>
{
- private:
- typedef typename invoke_result_of_prep<Function>::type func;
public:
- template <typename _ = void>
- struct result
- : invoke_result< Function, mpl::size_t<N>, CBI,
+ typedef typename boost::result_of<
#define M(z,j,data) typename result_of::at_c<Sequence,j>::type
- func(BOOST_PP_ENUM(N,M,~)) >
+ Function(BOOST_PP_ENUM(N,M,~)) >::type result_type;
#undef M
- { };
template <typename F>
- static inline typename result<F>::type
+ static inline result_type
call(F & f, Sequence & s)
{
#define M(z,j,data) fusion::at_c<j>(s)
@@ -223,19 +208,17 @@
}
};
+
#if N > 0
template <typename Function, class Sequence>
- struct invoke_impl<Function,Sequence,N,true,true,true>
+ struct invoke_mem_fn<Function,Sequence,N,true>
{
public:
- template <typename _ = void>
- struct result
- : invoke_result< Function, mpl::size_t<N> >
- { };
+ typedef typename ft::result_type<Function>::type result_type;
template <typename F>
- static inline typename result<F>::type
+ static inline result_type
call(F & f, Sequence & s)
{
return (that_ptr<typename mpl::front<
@@ -251,22 +234,19 @@
typename seq::I##j i##j =
\
fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j)));
- template <typename Function, class Sequence, bool CBI>
- struct invoke_impl<Function,Sequence,N,CBI,false,false>
+ template <typename Function, class Sequence>
+ struct invoke_impl<Function,Sequence,N,false,false>
{
private:
- typedef typename invoke_result_of_prep<Function>::type func;
typedef invoke_param_types<Sequence,N> seq;
public:
- template <typename _ = void>
- struct result
- : invoke_result< Function, mpl::size_t<N>, CBI,
- func(BOOST_PP_ENUM_PARAMS(N,typename seq::T)) >
- { };
+ typedef typename boost::result_of<
+ Function(BOOST_PP_ENUM_PARAMS(N,typename seq::T))
+ >::type result_type;
template <typename F>
- static inline typename result<F>::type
+ static inline result_type
call(F & f, Sequence & s)
{
#if N > 0
@@ -279,19 +259,16 @@
#if N > 0
template <typename Function, class Sequence>
- struct invoke_impl<Function,Sequence,N,true,true,false>
+ struct invoke_mem_fn<Function,Sequence,N,false>
{
private:
typedef invoke_param_types<Sequence,N> seq;
public:
- template <typename _ = void>
- struct result
- : invoke_result< Function, mpl::size_t<N> >
- { };
+ typedef typename ft::result_type<Function>::type result_type;
template <typename F>
- static inline typename result<F>::type
+ static inline result_type
call(F & f, Sequence & s)
{
typename seq::I0 i0 = fusion::begin(s);
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs