summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/phoenix/core/detail/expression.hpp')
-rw-r--r--3rdParty/Boost/src/boost/phoenix/core/detail/expression.hpp409
1 files changed, 409 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/phoenix/core/detail/expression.hpp b/3rdParty/Boost/src/boost/phoenix/core/detail/expression.hpp
new file mode 100644
index 0000000..7b239b1
--- /dev/null
+++ b/3rdParty/Boost/src/boost/phoenix/core/detail/expression.hpp
@@ -0,0 +1,409 @@
+/*=============================================================================
+ 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))> \
+ 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 \
+ inline 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)) \
+ ); \
+ } \
+/**/
+
+#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) \
+ ) \
+ ) \
+/**/
+
+#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 \
+ ) \
+ > \
+ > \
+ {}; \
+/**/
+
+#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)) \
+ ) \
+/**/
+
+#define BOOST_PHOENIX_DEFINE_EXPRESSION_MAKE_EXPRESSION_VARARG_R(Z, N, NAME) \
+ template <BOOST_PHOENIX_typename_A(N)> \
+ typename \
+ result_of:: BOOST_PP_CAT(make_, NAME)< \
+ BOOST_PHOENIX_A(N) \
+ >::type \
+ inline 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)) \
+ ) \
+/**/
+
+#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