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
							 |