462 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			462 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 2010 Thomas Heller
 | |
| 
 | |
|     Distributed under the Boost Software License, Version 1.0. (See accompanying 
 | |
|     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
| ==============================================================================*/
 | |
| 
 | |
| #ifndef BOOST_PHOENIX_CORE_DETAIL_EXPRESSION_HPP
 | |
| #define BOOST_PHOENIX_CORE_DETAIL_EXPRESSION_HPP
 | |
| 
 | |
| #include <boost/preprocessor/empty.hpp>
 | |
| #include <boost/preprocessor/arithmetic/add.hpp>
 | |
| #include <boost/preprocessor/arithmetic/dec.hpp>
 | |
| #include <boost/preprocessor/comma_if.hpp>
 | |
| #include <boost/preprocessor/comparison/equal.hpp>
 | |
| #include <boost/preprocessor/seq/size.hpp>
 | |
| #include <boost/preprocessor/seq/enum.hpp>
 | |
| #include <boost/preprocessor/seq/for_each.hpp>
 | |
| #include <boost/preprocessor/seq/pop_back.hpp>
 | |
| #include <boost/preprocessor/seq/reverse.hpp>
 | |
| #include <boost/preprocessor/tuple/elem.hpp>
 | |
| #include <boost/preprocessor/enum_params.hpp>
 | |
| #include <boost/preprocessor/repeat_from_to.hpp>
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION(NAME_SEQ, SEQ)                          \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_BASE(                                       \
 | |
|         NAME_SEQ                                                                \
 | |
|       , SEQ                                                                     \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_DEFAULT                      \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_DEFAULT                            \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_DEFAULT                  \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_DEFAULT                 \
 | |
|       , _                                                                       \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT)    \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_BASE(                                       \
 | |
|         NAME_SEQ                                                                \
 | |
|       , GRAMMAR_SEQ                                                             \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_VARARG                       \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_VARARG                             \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG                   \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG                  \
 | |
|       , LIMIT                                                                   \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(ACTOR, NAME_SEQ, GRAMMAR_SEQ)       \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_BASE(                                       \
 | |
|         NAME_SEQ                                                                \
 | |
|       , GRAMMAR_SEQ                                                             \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_EXT                          \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_DEFAULT                            \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_DEFAULT                  \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_DEFAULT                 \
 | |
|       , ACTOR                                                                   \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG(ACTOR, NAME, GRAMMAR, LIMIT) \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_BASE(                                       \
 | |
|         NAME_SEQ                                                                \
 | |
|       , GRAMMAR_SEQ                                                             \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_VARARG_EXT                   \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_VARARG                             \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG                   \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG                  \
 | |
|       , ACTOR                                                                   \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_NAMESPACE(R, D, E)                      \
 | |
| namespace E {                                                                   \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_NAMESPACE_END(R, D, E)                  \
 | |
| }                                                                               \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_NS(R, D, E)                             \
 | |
| E ::                                                                            \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_BASE(NAME_SEQ, GRAMMAR_SEQ, EXPRESSION, RULE, RESULT_OF_MAKE, MAKE_EXPRESSION, DATA) \
 | |
| BOOST_PP_SEQ_FOR_EACH(                                                          \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_NAMESPACE                                   \
 | |
|   , _                                                                           \
 | |
|   , BOOST_PP_SEQ_POP_BACK(NAME_SEQ)                                             \
 | |
| )                                                                               \
 | |
|     namespace tag                                                               \
 | |
|     {                                                                           \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)) {};            \
 | |
|         template <typename Ostream>                                             \
 | |
|         inline Ostream &operator<<(                                             \
 | |
|             Ostream & os                                                        \
 | |
|           , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)))                  \
 | |
|         {                                                                       \
 | |
|             os << BOOST_PP_STRINGIZE(                                           \
 | |
|                 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))               \
 | |
|             );                                                                  \
 | |
|             return os;                                                          \
 | |
|         }                                                                       \
 | |
|     }                                                                           \
 | |
|     namespace expression                                                        \
 | |
|     {                                                                           \
 | |
|         EXPRESSION(NAME_SEQ, GRAMMAR_SEQ, DATA)                                 \
 | |
|     }                                                                           \
 | |
|     namespace rule                                                              \
 | |
|     {                                                                           \
 | |
|         RULE(NAME_SEQ, GRAMMAR_SEQ, DATA)                                       \
 | |
|     }                                                                           \
 | |
|     namespace functional                                                        \
 | |
|     {                                                                           \
 | |
|         typedef                                                                 \
 | |
|             boost::proto::functional::make_expr<                                \
 | |
|                     tag:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))     \
 | |
|             >                                                                   \
 | |
|             BOOST_PP_CAT(                                                       \
 | |
|                 make_                                                           \
 | |
|               , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))               \
 | |
|             );                                                                  \
 | |
|     }                                                                           \
 | |
|     namespace result_of                                                         \
 | |
|     {                                                                           \
 | |
|         RESULT_OF_MAKE(NAME_SEQ, GRAMMAR_SEQ, DATA)                             \
 | |
|     }                                                                           \
 | |
|     MAKE_EXPRESSION(NAME_SEQ, GRAMMAR_SEQ, DATA)                                \
 | |
|                                                                                 \
 | |
| BOOST_PP_SEQ_FOR_EACH(                                                          \
 | |
|     BOOST_PHOENIX_DEFINE_EXPRESSION_NAMESPACE_END                               \
 | |
|   , _                                                                           \
 | |
|   , BOOST_PP_SEQ_POP_BACK(NAME_SEQ)                                             \
 | |
| )                                                                               \
 | |
| namespace boost { namespace phoenix                                             \
 | |
| {                                                                               \
 | |
|     template <typename Dummy>                                                   \
 | |
|     struct meta_grammar::case_<                                                 \
 | |
|         :: BOOST_PP_SEQ_FOR_EACH(                                               \
 | |
|             BOOST_PHOENIX_DEFINE_EXPRESSION_NS                                  \
 | |
|           , _                                                                   \
 | |
|           , BOOST_PP_SEQ_POP_BACK(NAME_SEQ)                                     \
 | |
|         ) tag:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))               \
 | |
|       , Dummy                                                                   \
 | |
|     >                                                                           \
 | |
|         : enable_rule<                                                          \
 | |
|             :: BOOST_PP_SEQ_FOR_EACH(                                           \
 | |
|                 BOOST_PHOENIX_DEFINE_EXPRESSION_NS                              \
 | |
|               , _                                                               \
 | |
|               , BOOST_PP_SEQ_POP_BACK(NAME_SEQ)                                 \
 | |
|             ) rule:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))          \
 | |
|          , Dummy                                                                \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| } }                                                                             \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_DEFAULT(NAME_SEQ, GRAMMAR_SEQ, D) \
 | |
|         template <BOOST_PHOENIX_typename_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))>     \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                \
 | |
|             : boost::phoenix::expr<                                             \
 | |
|                 :: BOOST_PP_SEQ_FOR_EACH(                                       \
 | |
|                     BOOST_PHOENIX_DEFINE_EXPRESSION_NS                          \
 | |
|                   , _                                                           \
 | |
|                   , BOOST_PP_SEQ_POP_BACK(NAME_SEQ)                             \
 | |
|                 ) tag:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))       \
 | |
|               , BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ), A)>        \
 | |
|         {};                                                                     \
 | |
| /**/
 | |
|         
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_DEFAULT(NAME_SEQ, GRAMMAR_SEQ, D)  \
 | |
|     struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                    \
 | |
|         : expression:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))        \
 | |
|             <BOOST_PP_SEQ_ENUM(GRAMMAR_SEQ)>                                    \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_DEFAULT(NAME_SEQ, GRAMMAR_SEQ, D) \
 | |
|     template <BOOST_PHOENIX_typename_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))>         \
 | |
|     struct BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))) \
 | |
|         : boost::result_of<                                                     \
 | |
|             functional::                                                        \
 | |
|                 BOOST_PP_CAT(                                                   \
 | |
|                     make_                                                       \
 | |
|                   , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))           \
 | |
|                 )(BOOST_PHOENIX_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ)))              \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_DEFAULT(NAME_SEQ, GRAMMAR_SEQ, D) \
 | |
|     template <BOOST_PHOENIX_typename_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))>         \
 | |
|     inline                                                                      \
 | |
|     typename                                                                    \
 | |
|         result_of::BOOST_PP_CAT(                                                \
 | |
|             make_                                                               \
 | |
|           , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                   \
 | |
|         )<                                                                      \
 | |
|             BOOST_PHOENIX_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))                     \
 | |
|         >::type const                                                           \
 | |
|     BOOST_PP_CAT(                                                               \
 | |
|         make_                                                                   \
 | |
|       , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                       \
 | |
|     )(                                                                          \
 | |
|         BOOST_PHOENIX_A_const_ref_a(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))             \
 | |
|     )                                                                           \
 | |
|     {                                                                           \
 | |
|         return                                                                  \
 | |
|             functional::BOOST_PP_CAT(                                           \
 | |
|                 make_                                                           \
 | |
|               , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))               \
 | |
|             )()(                                                                \
 | |
|               BOOST_PHOENIX_a(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))                   \
 | |
|             );                                                                  \
 | |
|     }                                                                           \
 | |
| /**/
 | |
| 
 | |
| #ifndef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_VARARG(NAME_SEQ, _G, _L)     \
 | |
|     template <typename A0, typename... A>                                       \
 | |
|     struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                    \
 | |
|         : boost::phoenix::expr<                                                 \
 | |
|             tag:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))             \
 | |
|           , A0, A...                                                            \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #else // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG_R(_, N, NAME)                    \
 | |
|     template <                                                                  \
 | |
|         BOOST_PHOENIX_typename_A(                                               \
 | |
|             BOOST_PP_ADD(                                                       \
 | |
|                 N                                                               \
 | |
|               , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))              \
 | |
|             )                                                                   \
 | |
|         )                                                                       \
 | |
|     >                                                                           \
 | |
|     struct BOOST_PP_TUPLE_ELEM(2, 0, NAME)<                                     \
 | |
|         BOOST_PHOENIX_A(                                                        \
 | |
|             BOOST_PP_ADD(N, BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))) \
 | |
|         )                                                                       \
 | |
|     >                                                                           \
 | |
|         : boost::phoenix::expr<                                                 \
 | |
|             tag:: BOOST_PP_TUPLE_ELEM(2, 0, NAME)                               \
 | |
|           , BOOST_PHOENIX_A(                                                    \
 | |
|                 BOOST_PP_ADD(                                                   \
 | |
|                     N                                                           \
 | |
|                   , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))          \
 | |
|                 )                                                               \
 | |
|             )                                                                   \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT) \
 | |
|         template <                                                              \
 | |
|             BOOST_PHOENIX_typename_A_void(                                      \
 | |
|                 BOOST_PP_ADD(                                                   \
 | |
|                     LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ)))        \
 | |
|             )                                                                   \
 | |
|           , typename Dummy = void                                               \
 | |
|         >                                                                       \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ));               \
 | |
|                                                                                 \
 | |
|         BOOST_PP_REPEAT_FROM_TO(                                                \
 | |
|             1                                                                   \
 | |
|           , BOOST_PP_ADD(LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ)))   \
 | |
|           , BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG_R                            \
 | |
|           , (                                                                   \
 | |
|                 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))               \
 | |
|               , BOOST_PP_SEQ_POP_BACK(GRAMMAR_SEQ)                              \
 | |
|             )                                                                   \
 | |
|         )                                                                       \
 | |
| /**/
 | |
| #endif // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT) \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                \
 | |
|             : expression:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)) <  \
 | |
|                 BOOST_PP_IF(                                                    \
 | |
|                     BOOST_PP_EQUAL(1, BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))           \
 | |
|                   , BOOST_PP_EMPTY                                              \
 | |
|                   , BOOST_PP_IDENTITY(                                          \
 | |
|                       BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_POP_BACK(GRAMMAR_SEQ))     \
 | |
|                     )                                                           \
 | |
|                 )()                                                             \
 | |
|                 BOOST_PP_COMMA_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))) \
 | |
|                 boost::proto::vararg<                                           \
 | |
|                     BOOST_PP_SEQ_ELEM(                                          \
 | |
|                         BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))            \
 | |
|                       , GRAMMAR_SEQ                                             \
 | |
|                     )                                                           \
 | |
|                 >                                                               \
 | |
|             >                                                                   \
 | |
|         {};                                                                     \
 | |
| /**/
 | |
| 
 | |
| #ifndef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG(NAME_SEQ, _G, _L) \
 | |
|     template <typename A0, typename... A>                                       \
 | |
|     struct BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))) \
 | |
|         : boost::result_of<                                                     \
 | |
|             functional:: BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)))( \
 | |
|                 A0, A...                                                        \
 | |
|             )                                                                   \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #else // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG_R(Z, N, NAME)     \
 | |
|     template <BOOST_PHOENIX_typename_A(N)>                                      \
 | |
|     struct BOOST_PP_CAT(make_, NAME) <BOOST_PHOENIX_A(N)>                       \
 | |
|         : boost::result_of<                                                     \
 | |
|             functional:: BOOST_PP_CAT(make_, NAME)(                             \
 | |
|                 BOOST_PHOENIX_A(N)                                              \
 | |
|             )                                                                   \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT) \
 | |
|     template <BOOST_PHOENIX_typename_A_void(LIMIT), typename Dummy = void>      \
 | |
|     struct BOOST_PP_CAT(                                                        \
 | |
|         make_                                                                   \
 | |
|       , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                       \
 | |
|     );                                                                          \
 | |
|     BOOST_PP_REPEAT_FROM_TO(                                                    \
 | |
|         1                                                                       \
 | |
|       , LIMIT                                                                   \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_RESULT_OF_MAKE_VARARG_R                 \
 | |
|       , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                       \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| #endif // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #ifndef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT) \
 | |
|     template <typename A0, typename... A>                                       \
 | |
|     inline                                                                      \
 | |
|     typename                                                                    \
 | |
|         result_of:: BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)))< \
 | |
|             A0, A...                                                            \
 | |
|         >::type                                                                 \
 | |
|     BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)))(A0 const& a0, A const&... a) \
 | |
|     {                                                                           \
 | |
|         return functional::BOOST_PP_CAT(make_, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ)))()(a0, a...); \
 | |
|     }                                                                           \
 | |
| /**/
 | |
| 
 | |
| #else // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG_R(Z, N, NAME)    \
 | |
|     template <BOOST_PHOENIX_typename_A(N)>                                      \
 | |
|     inline                                                                      \
 | |
|     typename                                                                    \
 | |
|         result_of:: BOOST_PP_CAT(make_, NAME)<                                  \
 | |
|             BOOST_PHOENIX_A(N)                                                  \
 | |
|         >::type                                                                 \
 | |
|     BOOST_PP_CAT(make_, NAME)(BOOST_PHOENIX_A_const_ref_a(N))                   \
 | |
|     {                                                                           \
 | |
|         return functional::BOOST_PP_CAT(make_, NAME)()(BOOST_PHOENIX_a(N));     \
 | |
|     }                                                                           \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG(NAME_SEQ, GRAMMAR_SEQ, LIMIT) \
 | |
|     BOOST_PP_REPEAT_FROM_TO(                                                    \
 | |
|         1                                                                       \
 | |
|       , LIMIT                                                                   \
 | |
|       , BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG_R                \
 | |
|       , BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                       \
 | |
|     )                                                                           \
 | |
| /**/
 | |
| #endif // BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXPRESSION_EXT(NAME_SEQ, GRAMMAR_SEQ, ACTOR) \
 | |
|         template <BOOST_PHOENIX_typename_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))>     \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))                \
 | |
|             : ::boost::phoenix::expr_ext<                                       \
 | |
|                 ACTOR                                                           \
 | |
|               , tag:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(NAME_SEQ))         \
 | |
|               , BOOST_PHOENIX_A(BOOST_PP_SEQ_SIZE(GRAMMAR_SEQ))>                \
 | |
|         {};                                                                     \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG_R(_, N, NAME)                \
 | |
|     template <                                                                  \
 | |
|         BOOST_PHOENIX_typename_A(                                               \
 | |
|             BOOST_PP_ADD(                                                       \
 | |
|                 N                                                               \
 | |
|               , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3, 1, NAME))              \
 | |
|             )                                                                   \
 | |
|         )                                                                       \
 | |
|     >                                                                           \
 | |
|     struct BOOST_PP_TUPLE_ELEM(3, 0, NAME)<                                     \
 | |
|         BOOST_PHOENIX_A(                                                        \
 | |
|             BOOST_PP_ADD(N, BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3, 1, NAME))) \
 | |
|         )                                                                       \
 | |
|     >                                                                           \
 | |
|         : expr_ext<                                                             \
 | |
|             BOOST_PP_TUPLE_ELEM(3, 2, NAME)                                     \
 | |
|           , tag:: BOOST_PP_TUPLE_ELEM(3, 0, NAME)                               \
 | |
|           , BOOST_PHOENIX_A(                                                    \
 | |
|                 BOOST_PP_ADD(                                                   \
 | |
|                     N                                                           \
 | |
|                   , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3, 1, NAME))          \
 | |
|                 )                                                               \
 | |
|             )                                                                   \
 | |
|         >                                                                       \
 | |
|     {};                                                                         \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_EXRPESSION_VARARG_EXT(N, G, D)          \
 | |
|         template <                                                              \
 | |
|             BOOST_PHOENIX_typename_A_void(                                      \
 | |
|                 BOOST_PP_ADD(LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(G)))         \
 | |
|             )                                                                   \
 | |
|           , typename Dummy = void                                               \
 | |
|         >                                                                       \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(N));                      \
 | |
|                                                                                 \
 | |
|         BOOST_PP_REPEAT_FROM_TO(                                                \
 | |
|             1                                                                   \
 | |
|           , BOOST_PP_ADD(LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(G)))             \
 | |
|           , BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG_R                        \
 | |
|           , (                                                                   \
 | |
|               BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(N))                        \
 | |
|             , BOOST_PP_SEQ_POP_BACK(G)                                          \
 | |
|             , ACTOR                                                             \
 | |
|           )                                                                     \
 | |
|         )                                                                       \
 | |
| /**/
 | |
| 
 | |
| #define BOOST_PHOENIX_DEFINE_EXPRESSION_RULE_VARARG_EXT(N, GRAMMAR, D)          \
 | |
|         struct BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(N))                       \
 | |
|             : expression:: BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(N)) <         \
 | |
|                 BOOST_PP_IF(                                                    \
 | |
|                     BOOST_PP_EQUAL(1, BOOST_PP_SEQ_SIZE(GRAMMAR))               \
 | |
|                   , BOOST_PP_EMPTY                                              \
 | |
|                   , BOOST_PP_IDENTITY(                                          \
 | |
|                       BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_POP_BACK(GRAMMAR))         \
 | |
|                     )                                                           \
 | |
|                 )()                                                             \
 | |
|                 BOOST_PP_COMMA_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR)))     \
 | |
|                 proto::vararg<                                                  \
 | |
|                     BOOST_PP_SEQ_ELEM(                                          \
 | |
|                         BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR))                \
 | |
|                       , GRAMMAR                                                 \
 | |
|                     )                                                           \
 | |
|                 >                                                               \
 | |
|             >                                                                   \
 | |
|         {};                                                                     \
 | |
| 
 | |
| 
 | |
| #endif
 | 
