File indexing completed on 2025-01-18 09:45:06
0001
0002 #if !BOOST_PHOENIX_IS_ITERATING
0003
0004 #include <boost/phoenix/support/iterate.hpp>
0005 #include <boost/preprocessor/comparison/equal.hpp>
0006
0007 #if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES)
0008
0009 #include <boost/phoenix/core/detail/cpp03/preprocessed/expression.hpp>
0010
0011 #else
0012
0013 #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
0014 #pragma wave option(preserve: 2, line: 0, output: "preprocessed/expression_" BOOST_PHOENIX_LIMIT_STR ".hpp")
0015 #endif
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
0027 #pragma wave option(preserve: 1)
0028 #endif
0029
0030 template <
0031 template <typename> class Actor
0032 , typename Tag
0033 , BOOST_PHOENIX_typename_A_void(BOOST_PHOENIX_COMPOSITE_LIMIT)
0034 , typename Dummy = void>
0035 struct expr_ext;
0036
0037 template <
0038 typename Tag
0039 , BOOST_PHOENIX_typename_A_void(BOOST_PHOENIX_COMPOSITE_LIMIT)
0040 , typename Dummy = void
0041 >
0042 struct expr : expr_ext<actor, Tag, BOOST_PHOENIX_A(BOOST_PHOENIX_COMPOSITE_LIMIT)> {};
0043
0044 #define M0(Z, N, D) \
0045 BOOST_PP_COMMA_IF(N) \
0046 typename proto::detail::uncvref<BOOST_PP_CAT(A, N)>::type
0047
0048 #define M1(Z, N, D) \
0049 BOOST_PP_COMMA_IF(N) typename boost::add_reference<typename boost::add_const<BOOST_PP_CAT(A, N)>::type>::type BOOST_PP_CAT(a, N)
0050
0051 #define BOOST_PHOENIX_ITERATION_PARAMS \
0052 (3, (1, BOOST_PHOENIX_COMPOSITE_LIMIT, \
0053 <boost/phoenix/core/detail/cpp03/expression.hpp>)) \
0054
0055 #include BOOST_PHOENIX_ITERATE()
0056
0057 #undef M0
0058 #undef M1
0059
0060 #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
0061 #pragma wave option(output: null)
0062 #endif
0063
0064 #endif
0065
0066 #else
0067 template <template <typename> class Actor, typename Tag, BOOST_PHOENIX_typename_A>
0068 struct expr_ext<Actor, Tag, BOOST_PHOENIX_A>
0069 : proto::transform<expr_ext<Actor, Tag, BOOST_PHOENIX_A>, int>
0070 {
0071 typedef
0072 typename proto::result_of::make_expr<
0073 Tag
0074 , phoenix_default_domain
0075 , BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, M0, _)
0076 >::type
0077 base_type;
0078
0079 typedef Actor<base_type> type;
0080
0081 typedef
0082 typename proto::nary_expr<Tag, BOOST_PHOENIX_A>::proto_grammar
0083 proto_grammar;
0084
0085 static type make(BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, M1, _))
0086 {
0087
0088 actor<base_type> const e =
0089 {
0090 proto::make_expr<
0091 Tag
0092 , phoenix_default_domain
0093 >(BOOST_PHOENIX_a)
0094 };
0095 return e;
0096 }
0097
0098 template<typename Expr, typename State, typename Data>
0099 struct impl
0100 : proto::pass_through<expr_ext>::template impl<Expr, State, Data>
0101 {};
0102
0103 typedef Tag proto_tag;
0104 #define BOOST_PHOENIX_ENUM_CHILDREN(_, N, __) \
0105 typedef BOOST_PP_CAT(A, N) BOOST_PP_CAT(proto_child, N); \
0106
0107 BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_ENUM_CHILDREN, _)
0108 #undef BOOST_PHOENIX_ENUM_CHILDREN
0109 };
0110
0111 #endif