1 /*=============================================================================
2 Copyright (c) 2005-2007 Dan Marsden
3 Copyright (c) 2005-2007 Joel de Guzman
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #ifndef BOOST_PP_IS_ITERATING
9 #ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
10 #define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
12 #include <boost/spirit/home/phoenix/core/limits.hpp>
13 #include <boost/spirit/home/phoenix/core/actor.hpp>
15 #include <boost/preprocessor/repetition/enum_params.hpp>
16 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
17 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
18 #include <boost/preprocessor/iteration/iterate.hpp>
19 #include <boost/preprocessor/arithmetic/sub.hpp>
20 #include <boost/preprocessor/arithmetic/dec.hpp>
22 #include <boost/mpl/void.hpp>
24 #include <boost/type_traits/function_traits.hpp>
26 #include <boost/get_pointer.hpp>
28 #include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp>
30 namespace boost { namespace phoenix {
32 struct mem_fun_ptr_eval
34 template<typename Env, typename PtrActor, typename MemFunPtrActor,
35 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PP_SUB(PHOENIX_MEMBER_LIMIT, 2), typename Arg, mpl::void_)>
38 : detail::mem_fun_ptr_return<typename eval_result<MemFunPtrActor, Env>::type> { };
40 template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor>
41 static typename result<Env,PtrActor,MemFunPtrActor>::type
42 eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor)
44 return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))();
47 #define BOOST_PP_ITERATION_PARAMS_1 \
48 (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_MEMBER_LIMIT)), "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp"))
50 #include BOOST_PP_ITERATE()
59 #define PHOENIX_ITERATION BOOST_PP_ITERATION()
61 #define PHOENIX_EVAL_ARG(z,n,_) arg ## n.eval(env)
63 template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor,
64 BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename Arg)>
65 static typename result<Env,PtrActor,MemFunPtrActor, BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION,Arg)>::type
66 eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor,
67 BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, Arg, & arg))
69 return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))(
70 BOOST_PP_ENUM(PHOENIX_ITERATION,PHOENIX_EVAL_ARG,_));
73 #undef PHOENIX_EVAL_ARG
74 #undef PHOENIX_ITERATION