887 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			887 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /////////////////////////////////////////////////////////////////////////////// | ||
|  | /// \file proto_fwd.hpp | ||
|  | /// Forward declarations of all of proto's public types and functions. | ||
|  | // | ||
|  | //  Copyright 2008 Eric Niebler. 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_PROTO_FWD_HPP_EAN_04_01_2005 | ||
|  | #define BOOST_PROTO_FWD_HPP_EAN_04_01_2005 | ||
|  | 
 | ||
|  | #include <cstddef> | ||
|  | #include <climits> | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | #include <boost/preprocessor/cat.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/inc.hpp> | ||
|  | #include <boost/preprocessor/punctuation/comma.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_params.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> | ||
|  | #include <boost/preprocessor/repetition/repeat_from_to.hpp> | ||
|  | #include <boost/ref.hpp> | ||
|  | #include <boost/mpl/long.hpp> | ||
|  | #include <boost/type_traits/remove_const.hpp> | ||
|  | #include <boost/type_traits/remove_reference.hpp> | ||
|  | #include <boost/mpl/aux_/config/ttp.hpp> | ||
|  | #include <boost/utility/result_of.hpp> | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_MAX_ARITY | ||
|  | # define BOOST_PROTO_MAX_ARITY 10 | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_MAX_LOGICAL_ARITY | ||
|  | # define BOOST_PROTO_MAX_LOGICAL_ARITY 10 | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_MAX_FUNCTION_CALL_ARITY | ||
|  | # define BOOST_PROTO_MAX_FUNCTION_CALL_ARITY BOOST_PROTO_MAX_ARITY | ||
|  | #endif | ||
|  | 
 | ||
|  | #if BOOST_PROTO_MAX_ARITY < 3 | ||
|  | # error BOOST_PROTO_MAX_ARITY must be at least 3 | ||
|  | #endif | ||
|  | 
 | ||
|  | #if BOOST_PROTO_MAX_FUNCTION_CALL_ARITY > BOOST_PROTO_MAX_ARITY | ||
|  | # error BOOST_PROTO_MAX_FUNCTION_CALL_ARITY cannot be larger than BOOST_PROTO_MAX_ARITY | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_DONT_USE_PREPROCESSED_FILES | ||
|  |   #if 10 < BOOST_PROTO_MAX_ARITY ||                                                                 \ | ||
|  |       10 < BOOST_PROTO_MAX_LOGICAL_ARITY ||                                                         \ | ||
|  |       10 < BOOST_PROTO_MAX_FUNCTION_CALL_ARITY | ||
|  |     #define BOOST_PROTO_DONT_USE_PREPROCESSED_FILES | ||
|  |   #endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_BROKEN_CONST_OVERLOADS | ||
|  | # if BOOST_WORKAROUND(__GNUC__, == 3) \ | ||
|  |   || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310)) | ||
|  | #  define BOOST_PROTO_BROKEN_CONST_OVERLOADS | ||
|  | # endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS | ||
|  | # if BOOST_WORKAROUND(__GNUC__, == 3) \ | ||
|  |   || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310)) | ||
|  | #  define BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS | ||
|  | # endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef BOOST_PROTO_BROKEN_CONST_OVERLOADS | ||
|  | # include <boost/utility/enable_if.hpp> | ||
|  | # include <boost/type_traits/is_const.hpp> | ||
|  | # define BOOST_PROTO_DISABLE_IF_IS_CONST(T)\ | ||
|  |     , typename boost::disable_if_c<boost::is_const<T>::value, boost::proto::detail::undefined>::type * = 0 | ||
|  | #else | ||
|  | # define BOOST_PROTO_DISABLE_IF_IS_CONST(T) | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS | ||
|  | # include <boost/utility/enable_if.hpp> | ||
|  | # include <boost/type_traits/is_function.hpp> | ||
|  | # define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T)\ | ||
|  |     , typename boost::disable_if_c<boost::is_function<T>::value, boost::proto::detail::undefined>::type * = 0 | ||
|  | #else | ||
|  | # define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T) | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_BROKEN_PTS | ||
|  | # if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) | ||
|  | #  define BOOST_PROTO_BROKEN_PTS | ||
|  | # endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef BOOST_NO_CXX11_DECLTYPE_N3276 | ||
|  | # // Proto can only use the decltype-based result_of if N3276 has been | ||
|  | # // implemented by the compiler. | ||
|  | # // See http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf | ||
|  | # ifndef BOOST_PROTO_USE_NORMAL_RESULT_OF | ||
|  | #  define BOOST_PROTO_USE_NORMAL_RESULT_OF | ||
|  | # endif | ||
|  | #endif | ||
|  | 
 | ||
|  | // Unless compiler support is there, use tr1_result_of instead of | ||
|  | // result_of to avoid the problems addressed by N3276. | ||
|  | #ifdef BOOST_PROTO_USE_NORMAL_RESULT_OF | ||
|  | # define BOOST_PROTO_RESULT_OF boost::result_of | ||
|  | #else | ||
|  | # define BOOST_PROTO_RESULT_OF boost::tr1_result_of | ||
|  | #endif | ||
|  | 
 | ||
|  | // If we're using the decltype-based result_of, we need to be a bit | ||
|  | // stricter about the return types of some functions. | ||
|  | #if defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_PROTO_USE_NORMAL_RESULT_OF) | ||
|  | # define BOOST_PROTO_STRICT_RESULT_OF | ||
|  | # define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) X | ||
|  | #else | ||
|  | # define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) Y | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING | ||
|  | # define BOOST_PROTO_EXTENDED_TEMPLATE_PARAMETERS_MATCHING  | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) | ||
|  | # define BOOST_PROTO_DISABLE_MSVC_C4522 __pragma(warning(disable : 4522))  // 'class' : multiple assignment operators specified | ||
|  | # define BOOST_PROTO_DISABLE_MSVC_C4714 __pragma(warning(disable : 4714))  // function 'xxx' marked as __forceinline not inlined | ||
|  | #else | ||
|  | # define BOOST_PROTO_DISABLE_MSVC_C4522  | ||
|  | # define BOOST_PROTO_DISABLE_MSVC_C4714 | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost { namespace proto | ||
|  | { | ||
|  |     namespace detail | ||
|  |     { | ||
|  |         typedef char yes_type; | ||
|  |         typedef char (&no_type)[2]; | ||
|  | 
 | ||
|  |         template<int N> | ||
|  |         struct sized_type | ||
|  |         { | ||
|  |             typedef char (&type)[N]; | ||
|  |         }; | ||
|  | 
 | ||
|  |         struct dont_care; | ||
|  |         struct undefined; // leave this undefined | ||
|  |         struct not_a_valid_type; | ||
|  | 
 | ||
|  |         struct private_type_ | ||
|  |         { | ||
|  |             private_type_ operator ,(int) const; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct uncvref | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct uncvref<T const> | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct uncvref<T &> | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct uncvref<T const &> | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T, std::size_t N> | ||
|  |         struct uncvref<T const[N]> | ||
|  |         { | ||
|  |             typedef T type[N]; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T, std::size_t N> | ||
|  |         struct uncvref<T (&)[N]> | ||
|  |         { | ||
|  |             typedef T type[N]; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename T, std::size_t N> | ||
|  |         struct uncvref<T const (&)[N]> | ||
|  |         { | ||
|  |             typedef T type[N]; | ||
|  |         }; | ||
|  | 
 | ||
|  |         struct ignore | ||
|  |         { | ||
|  |             ignore() | ||
|  |             {} | ||
|  | 
 | ||
|  |             template<typename T> | ||
|  |             ignore(T const &) | ||
|  |             {} | ||
|  |         }; | ||
|  | 
 | ||
|  |         /// INTERNAL ONLY | ||
|  |         /// | ||
|  |         #define BOOST_PROTO_UNCVREF(X)                                                              \ | ||
|  |             typename boost::proto::detail::uncvref<X>::type                                         \ | ||
|  |             /**/ | ||
|  | 
 | ||
|  |         struct _default; | ||
|  | 
 | ||
|  |         struct not_a_domain; | ||
|  |         struct not_a_grammar; | ||
|  |         struct not_a_generator; | ||
|  | 
 | ||
|  |         template<typename T, typename Void = void> | ||
|  |         struct is_transform_; | ||
|  | 
 | ||
|  |         template<typename T, typename Void = void> | ||
|  |         struct is_aggregate_; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct flat_view; | ||
|  |     } | ||
|  | 
 | ||
|  |     typedef detail::ignore const ignore; | ||
|  | 
 | ||
|  |     namespace argsns_ | ||
|  |     { | ||
|  |         template<typename Arg0> | ||
|  |         struct term; | ||
|  | 
 | ||
|  |         #define M0(Z, N, DATA)                                                                      \ | ||
|  |         template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename Arg)> struct BOOST_PP_CAT(list, N);          \ | ||
|  |         /**/ | ||
|  |         BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), M0, ~) | ||
|  |         #undef M0 | ||
|  |     } | ||
|  | 
 | ||
|  |     using namespace argsns_; | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     // Operator tags | ||
|  |     namespace tagns_ | ||
|  |     { | ||
|  |         namespace tag | ||
|  |         { | ||
|  |             struct terminal; | ||
|  |             struct unary_plus; | ||
|  |             struct negate; | ||
|  |             struct dereference; | ||
|  |             struct complement; | ||
|  |             struct address_of; | ||
|  |             struct logical_not; | ||
|  |             struct pre_inc; | ||
|  |             struct pre_dec; | ||
|  |             struct post_inc; | ||
|  |             struct post_dec; | ||
|  | 
 | ||
|  |             struct shift_left; | ||
|  |             struct shift_right; | ||
|  |             struct multiplies; | ||
|  |             struct divides; | ||
|  |             struct modulus; | ||
|  |             struct plus; | ||
|  |             struct minus; | ||
|  |             struct less; | ||
|  |             struct greater; | ||
|  |             struct less_equal; | ||
|  |             struct greater_equal; | ||
|  |             struct equal_to; | ||
|  |             struct not_equal_to; | ||
|  |             struct logical_or; | ||
|  |             struct logical_and; | ||
|  |             struct bitwise_and; | ||
|  |             struct bitwise_or; | ||
|  |             struct bitwise_xor; | ||
|  |             struct comma; | ||
|  |             struct mem_ptr; | ||
|  | 
 | ||
|  |             struct assign; | ||
|  |             struct shift_left_assign; | ||
|  |             struct shift_right_assign; | ||
|  |             struct multiplies_assign; | ||
|  |             struct divides_assign; | ||
|  |             struct modulus_assign; | ||
|  |             struct plus_assign; | ||
|  |             struct minus_assign; | ||
|  |             struct bitwise_and_assign; | ||
|  |             struct bitwise_or_assign; | ||
|  |             struct bitwise_xor_assign; | ||
|  |             struct subscript; | ||
|  |             struct member; | ||
|  |             struct if_else_; | ||
|  |             struct function; | ||
|  | 
 | ||
|  |             // Fusion tags | ||
|  |             template<typename Tag, typename Domain> struct proto_expr; | ||
|  |             template<typename Tag, typename Domain> struct proto_expr_iterator; | ||
|  |             template<typename Tag, typename Domain> struct proto_flat_view; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     using namespace tagns_; | ||
|  | 
 | ||
|  |     template<typename Expr> | ||
|  |     struct tag_of; | ||
|  | 
 | ||
|  |     //////////////////////////////////////////////////////////////////////////////////////////////// | ||
|  |     struct _; | ||
|  | 
 | ||
|  |     //////////////////////////////////////////////////////////////////////////////////////////////// | ||
|  |     struct default_generator; | ||
|  | 
 | ||
|  |     struct basic_default_generator; | ||
|  | 
 | ||
|  |     template<template<typename> class Extends> | ||
|  |     struct generator; | ||
|  | 
 | ||
|  |     template<template<typename> class Extends> | ||
|  |     struct pod_generator; | ||
|  | 
 | ||
|  |     struct by_value_generator; | ||
|  | 
 | ||
|  |     template<typename First, typename Second> | ||
|  |     struct compose_generators; | ||
|  | 
 | ||
|  |     template<typename Generator, typename Void = void> | ||
|  |     struct wants_basic_expr; | ||
|  | 
 | ||
|  |     template<typename Generator> | ||
|  |     struct use_basic_expr; | ||
|  | 
 | ||
|  |     //////////////////////////////////////////////////////////////////////////////////////////////// | ||
|  |     namespace domainns_ | ||
|  |     { | ||
|  |         typedef detail::not_a_domain no_super_domain; | ||
|  | 
 | ||
|  |         template< | ||
|  |             typename Generator  = default_generator | ||
|  |           , typename Grammar    = proto::_ | ||
|  |           , typename Super      = no_super_domain | ||
|  |         > | ||
|  |         struct domain; | ||
|  | 
 | ||
|  |         struct default_domain; | ||
|  | 
 | ||
|  |         struct basic_default_domain; | ||
|  | 
 | ||
|  |         struct deduce_domain; | ||
|  | 
 | ||
|  |         template<typename Domain, typename Tag, typename Args, bool WantsBasicExpr = wants_basic_expr<typename Domain::proto_generator>::value> | ||
|  |         struct base_expr; | ||
|  |     } | ||
|  | 
 | ||
|  |     using namespace domainns_; | ||
|  | 
 | ||
|  |     //////////////////////////////////////////////////////////////////////////////////////////////// | ||
|  |     namespace exprns_ | ||
|  |     { | ||
|  |         template<typename Tag, typename Args, long Arity = Args::arity> | ||
|  |         struct basic_expr; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Args, long Arity = Args::arity> | ||
|  |         struct expr; | ||
|  | 
 | ||
|  |         template< | ||
|  |             typename Expr | ||
|  |           , typename Derived | ||
|  |           , typename Domain = default_domain | ||
|  |           , long Arity = Expr::proto_arity_c | ||
|  |         > | ||
|  |         struct extends; | ||
|  | 
 | ||
|  |         template<typename This, typename Fun, typename Domain> | ||
|  |         struct virtual_member; | ||
|  |          | ||
|  |         struct is_proto_expr; | ||
|  |     } | ||
|  |     //////////////////////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     using exprns_::expr; | ||
|  |     using exprns_::basic_expr; | ||
|  |     using exprns_::extends; | ||
|  |     using exprns_::is_proto_expr; | ||
|  | 
 | ||
|  |     template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)> | ||
|  |     struct or_; | ||
|  | 
 | ||
|  |     template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)> | ||
|  |     struct and_; | ||
|  | 
 | ||
|  |     template<typename Grammar> | ||
|  |     struct not_; | ||
|  | 
 | ||
|  |     template<typename Condition, typename Then = _, typename Else = not_<_> > | ||
|  |     struct if_; | ||
|  | 
 | ||
|  |     template<typename Cases, typename Transform = tag_of<_>()> | ||
|  |     struct switch_; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct exact; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct convertible_to; | ||
|  | 
 | ||
|  |     template<typename Grammar> | ||
|  |     struct vararg; | ||
|  | 
 | ||
|  |     struct pack; | ||
|  | 
 | ||
|  |     // Boost bug https://svn.boost.org/trac/boost/ticket/4602 | ||
|  |     //int const N = INT_MAX; | ||
|  |     int const N = (INT_MAX >> 10); | ||
|  | 
 | ||
|  |     namespace context | ||
|  |     { | ||
|  |         struct null_context; | ||
|  | 
 | ||
|  |         template<typename Expr, typename Context, long Arity = Expr::proto_arity_c> | ||
|  |         struct null_eval; | ||
|  | 
 | ||
|  |         struct default_context; | ||
|  | 
 | ||
|  |         template<typename Expr, typename Context, typename Tag = typename Expr::proto_tag, long Arity = Expr::proto_arity_c> | ||
|  |         struct default_eval; | ||
|  | 
 | ||
|  |         template<typename Derived, typename DefaultCtx = default_context> | ||
|  |         struct callable_context; | ||
|  | 
 | ||
|  |         template<typename Expr, typename Context, long Arity = Expr::proto_arity_c> | ||
|  |         struct callable_eval; | ||
|  |     } | ||
|  | 
 | ||
|  |     using context::null_context; | ||
|  |     using context::null_eval; | ||
|  |     using context::default_context; | ||
|  |     using context::default_eval; | ||
|  |     using context::callable_context; | ||
|  |     using context::callable_eval; | ||
|  | 
 | ||
|  |     namespace utility | ||
|  |     { | ||
|  |         template<typename T, typename Domain = default_domain> | ||
|  |         struct literal; | ||
|  |     } | ||
|  | 
 | ||
|  |     using utility::literal; | ||
|  | 
 | ||
|  |     namespace result_of | ||
|  |     { | ||
|  |         template<typename T, typename Domain = default_domain> | ||
|  |         struct as_expr; | ||
|  | 
 | ||
|  |         template<typename T, typename Domain = default_domain> | ||
|  |         struct as_child; | ||
|  | 
 | ||
|  |         template<typename Expr, typename N = mpl::long_<0> > | ||
|  |         struct child; | ||
|  | 
 | ||
|  |         template<typename Expr, long N> | ||
|  |         struct child_c; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct left; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct right; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct deep_copy; | ||
|  | 
 | ||
|  |         template<typename Expr, typename Context> | ||
|  |         struct eval; | ||
|  | 
 | ||
|  |         template< | ||
|  |             typename Tag | ||
|  |           , typename DomainOrA0 | ||
|  |             BOOST_PP_ENUM_TRAILING_BINARY_PARAMS( | ||
|  |                 BOOST_PROTO_MAX_ARITY | ||
|  |               , typename A | ||
|  |               , = void BOOST_PP_INTERCEPT | ||
|  |             ) | ||
|  |           , typename Void = void | ||
|  |         > | ||
|  |         struct make_expr; | ||
|  | 
 | ||
|  |         template<typename Tag, typename DomainOrSequence, typename SequenceOrVoid = void, typename Void = void> | ||
|  |         struct unpack_expr; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct as_env; | ||
|  | 
 | ||
|  |         template<typename Env, typename Tag> | ||
|  |         struct has_env_var; | ||
|  | 
 | ||
|  |         template<typename Env, typename Tag> | ||
|  |         struct env_var; | ||
|  |     } | ||
|  | 
 | ||
|  |     template<typename T, typename Void = void> | ||
|  |     struct is_expr; | ||
|  | 
 | ||
|  |     template<typename T, typename Void = void> | ||
|  |     struct is_domain; | ||
|  | 
 | ||
|  |     template<typename SubDomain, typename SuperDomain> | ||
|  |     struct is_sub_domain_of; | ||
|  | 
 | ||
|  |     template<typename T, typename Void = void> | ||
|  |     struct is_env; | ||
|  | 
 | ||
|  |     template<typename Expr> | ||
|  |     struct arity_of; | ||
|  | 
 | ||
|  |     template<typename T, typename Void = void> | ||
|  |     struct domain_of; | ||
|  | 
 | ||
|  |     template<typename Expr, typename Grammar> | ||
|  |     struct matches; | ||
|  | 
 | ||
|  |     // Generic expression metafunctions and | ||
|  |     // grammar elements | ||
|  |     template<typename Tag, typename Arg> | ||
|  |     struct unary_expr; | ||
|  | 
 | ||
|  |     template<typename Tag, typename Left, typename Right> | ||
|  |     struct binary_expr; | ||
|  | 
 | ||
|  |     template<typename Tag, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)> | ||
|  |     struct nary_expr; | ||
|  | 
 | ||
|  |     // Specific expression metafunctions and | ||
|  |     // grammar elements, for convenience | ||
|  |     template<typename T> struct terminal; | ||
|  |     template<typename T> struct unary_plus; | ||
|  |     template<typename T> struct negate; | ||
|  |     template<typename T> struct dereference; | ||
|  |     template<typename T> struct complement; | ||
|  |     template<typename T> struct address_of; | ||
|  |     template<typename T> struct logical_not; | ||
|  |     template<typename T> struct pre_inc; | ||
|  |     template<typename T> struct pre_dec; | ||
|  |     template<typename T> struct post_inc; | ||
|  |     template<typename T> struct post_dec; | ||
|  | 
 | ||
|  |     template<typename T, typename U> struct shift_left; | ||
|  |     template<typename T, typename U> struct shift_right; | ||
|  |     template<typename T, typename U> struct multiplies; | ||
|  |     template<typename T, typename U> struct divides; | ||
|  |     template<typename T, typename U> struct modulus; | ||
|  |     template<typename T, typename U> struct plus; | ||
|  |     template<typename T, typename U> struct minus; | ||
|  |     template<typename T, typename U> struct less; | ||
|  |     template<typename T, typename U> struct greater; | ||
|  |     template<typename T, typename U> struct less_equal; | ||
|  |     template<typename T, typename U> struct greater_equal; | ||
|  |     template<typename T, typename U> struct equal_to; | ||
|  |     template<typename T, typename U> struct not_equal_to; | ||
|  |     template<typename T, typename U> struct logical_or; | ||
|  |     template<typename T, typename U> struct logical_and; | ||
|  |     template<typename T, typename U> struct bitwise_and; | ||
|  |     template<typename T, typename U> struct bitwise_or; | ||
|  |     template<typename T, typename U> struct bitwise_xor; | ||
|  |     template<typename T, typename U> struct comma; | ||
|  |     template<typename T, typename U> struct mem_ptr; | ||
|  | 
 | ||
|  |     template<typename T, typename U> struct assign; | ||
|  |     template<typename T, typename U> struct shift_left_assign; | ||
|  |     template<typename T, typename U> struct shift_right_assign; | ||
|  |     template<typename T, typename U> struct multiplies_assign; | ||
|  |     template<typename T, typename U> struct divides_assign; | ||
|  |     template<typename T, typename U> struct modulus_assign; | ||
|  |     template<typename T, typename U> struct plus_assign; | ||
|  |     template<typename T, typename U> struct minus_assign; | ||
|  |     template<typename T, typename U> struct bitwise_and_assign; | ||
|  |     template<typename T, typename U> struct bitwise_or_assign; | ||
|  |     template<typename T, typename U> struct bitwise_xor_assign; | ||
|  |     template<typename T, typename U> struct subscript; | ||
|  |     template<typename T, typename U> struct member; | ||
|  |     template<typename T, typename U, typename V> struct if_else_; | ||
|  | 
 | ||
|  |     template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)> | ||
|  |     struct function; | ||
|  | 
 | ||
|  |     namespace functional | ||
|  |     { | ||
|  |         struct left; | ||
|  |         struct right; | ||
|  |         struct eval; | ||
|  |         struct deep_copy; | ||
|  | 
 | ||
|  |         template<typename Domain = default_domain> | ||
|  |         struct as_expr; | ||
|  | 
 | ||
|  |         template<typename Domain = default_domain> | ||
|  |         struct as_child; | ||
|  | 
 | ||
|  |         template<typename N = mpl::long_<0> > | ||
|  |         struct child; | ||
|  | 
 | ||
|  |         template<long N> | ||
|  |         struct child_c; | ||
|  | 
 | ||
|  |         struct as_env; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct has_env_var; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct env_var; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain = deduce_domain> | ||
|  |         struct make_expr; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain = deduce_domain> | ||
|  |         struct unpack_expr; | ||
|  | 
 | ||
|  |         typedef make_expr<tag::terminal>            make_terminal; | ||
|  |         typedef make_expr<tag::unary_plus>          make_unary_plus; | ||
|  |         typedef make_expr<tag::negate>              make_negate; | ||
|  |         typedef make_expr<tag::dereference>         make_dereference; | ||
|  |         typedef make_expr<tag::complement>          make_complement; | ||
|  |         typedef make_expr<tag::address_of>          make_address_of; | ||
|  |         typedef make_expr<tag::logical_not>         make_logical_not; | ||
|  |         typedef make_expr<tag::pre_inc>             make_pre_inc; | ||
|  |         typedef make_expr<tag::pre_dec>             make_pre_dec; | ||
|  |         typedef make_expr<tag::post_inc>            make_post_inc; | ||
|  |         typedef make_expr<tag::post_dec>            make_post_dec; | ||
|  |         typedef make_expr<tag::shift_left>          make_shift_left; | ||
|  |         typedef make_expr<tag::shift_right>         make_shift_right; | ||
|  |         typedef make_expr<tag::multiplies>          make_multiplies; | ||
|  |         typedef make_expr<tag::divides>             make_divides; | ||
|  |         typedef make_expr<tag::modulus>             make_modulus; | ||
|  |         typedef make_expr<tag::plus>                make_plus; | ||
|  |         typedef make_expr<tag::minus>               make_minus; | ||
|  |         typedef make_expr<tag::less>                make_less; | ||
|  |         typedef make_expr<tag::greater>             make_greater; | ||
|  |         typedef make_expr<tag::less_equal>          make_less_equal; | ||
|  |         typedef make_expr<tag::greater_equal>       make_greater_equal; | ||
|  |         typedef make_expr<tag::equal_to>            make_equal_to; | ||
|  |         typedef make_expr<tag::not_equal_to>        make_not_equal_to; | ||
|  |         typedef make_expr<tag::logical_or>          make_logical_or; | ||
|  |         typedef make_expr<tag::logical_and>         make_logical_and; | ||
|  |         typedef make_expr<tag::bitwise_and>         make_bitwise_and; | ||
|  |         typedef make_expr<tag::bitwise_or>          make_bitwise_or; | ||
|  |         typedef make_expr<tag::bitwise_xor>         make_bitwise_xor; | ||
|  |         typedef make_expr<tag::comma>               make_comma; | ||
|  |         typedef make_expr<tag::mem_ptr>             make_mem_ptr; | ||
|  |         typedef make_expr<tag::assign>              make_assign; | ||
|  |         typedef make_expr<tag::shift_left_assign>   make_shift_left_assign; | ||
|  |         typedef make_expr<tag::shift_right_assign>  make_shift_right_assign; | ||
|  |         typedef make_expr<tag::multiplies_assign>   make_multiplies_assign; | ||
|  |         typedef make_expr<tag::divides_assign>      make_divides_assign; | ||
|  |         typedef make_expr<tag::modulus_assign>      make_modulus_assign; | ||
|  |         typedef make_expr<tag::plus_assign>         make_plus_assign; | ||
|  |         typedef make_expr<tag::minus_assign>        make_minus_assign; | ||
|  |         typedef make_expr<tag::bitwise_and_assign>  make_bitwise_and_assign; | ||
|  |         typedef make_expr<tag::bitwise_or_assign>   make_bitwise_or_assign; | ||
|  |         typedef make_expr<tag::bitwise_xor_assign>  make_bitwise_xor_assign; | ||
|  |         typedef make_expr<tag::subscript>           make_subscript; | ||
|  |         typedef make_expr<tag::if_else_>            make_if_else; | ||
|  |         typedef make_expr<tag::function>            make_function; | ||
|  | 
 | ||
|  |         struct flatten; | ||
|  |         struct make_pair; | ||
|  |         struct first; | ||
|  |         struct second; | ||
|  |         struct at; | ||
|  |         struct pop_front; | ||
|  |         struct push_front; | ||
|  |         struct pop_back; | ||
|  |         struct push_back; | ||
|  |         struct reverse; | ||
|  |     } | ||
|  | 
 | ||
|  |     typedef functional::flatten     _flatten; | ||
|  |     typedef functional::make_pair   _make_pair; | ||
|  |     typedef functional::first       _first; | ||
|  |     typedef functional::second      _second; | ||
|  |     typedef functional::pop_front   _at; | ||
|  |     typedef functional::pop_front   _pop_front; | ||
|  |     typedef functional::push_front  _push_front; | ||
|  |     typedef functional::pop_back    _pop_back; | ||
|  |     typedef functional::push_back   _push_back; | ||
|  |     typedef functional::reverse     _reverse; | ||
|  |     typedef functional::eval        _eval; | ||
|  |     struct _deep_copy; | ||
|  | 
 | ||
|  |     typedef functional::make_expr<tag::terminal>           _make_terminal; | ||
|  |     typedef functional::make_expr<tag::unary_plus>         _make_unary_plus; | ||
|  |     typedef functional::make_expr<tag::negate>             _make_negate; | ||
|  |     typedef functional::make_expr<tag::dereference>        _make_dereference; | ||
|  |     typedef functional::make_expr<tag::complement>         _make_complement; | ||
|  |     typedef functional::make_expr<tag::address_of>         _make_address_of; | ||
|  |     typedef functional::make_expr<tag::logical_not>        _make_logical_not; | ||
|  |     typedef functional::make_expr<tag::pre_inc>            _make_pre_inc; | ||
|  |     typedef functional::make_expr<tag::pre_dec>            _make_pre_dec; | ||
|  |     typedef functional::make_expr<tag::post_inc>           _make_post_inc; | ||
|  |     typedef functional::make_expr<tag::post_dec>           _make_post_dec; | ||
|  |     typedef functional::make_expr<tag::shift_left>         _make_shift_left; | ||
|  |     typedef functional::make_expr<tag::shift_right>        _make_shift_right; | ||
|  |     typedef functional::make_expr<tag::multiplies>         _make_multiplies; | ||
|  |     typedef functional::make_expr<tag::divides>            _make_divides; | ||
|  |     typedef functional::make_expr<tag::modulus>            _make_modulus; | ||
|  |     typedef functional::make_expr<tag::plus>               _make_plus; | ||
|  |     typedef functional::make_expr<tag::minus>              _make_minus; | ||
|  |     typedef functional::make_expr<tag::less>               _make_less; | ||
|  |     typedef functional::make_expr<tag::greater>            _make_greater; | ||
|  |     typedef functional::make_expr<tag::less_equal>         _make_less_equal; | ||
|  |     typedef functional::make_expr<tag::greater_equal>      _make_greater_equal; | ||
|  |     typedef functional::make_expr<tag::equal_to>           _make_equal_to; | ||
|  |     typedef functional::make_expr<tag::not_equal_to>       _make_not_equal_to; | ||
|  |     typedef functional::make_expr<tag::logical_or>         _make_logical_or; | ||
|  |     typedef functional::make_expr<tag::logical_and>        _make_logical_and; | ||
|  |     typedef functional::make_expr<tag::bitwise_and>        _make_bitwise_and; | ||
|  |     typedef functional::make_expr<tag::bitwise_or>         _make_bitwise_or; | ||
|  |     typedef functional::make_expr<tag::bitwise_xor>        _make_bitwise_xor; | ||
|  |     typedef functional::make_expr<tag::comma>              _make_comma; | ||
|  |     typedef functional::make_expr<tag::mem_ptr>            _make_mem_ptr; | ||
|  |     typedef functional::make_expr<tag::assign>             _make_assign; | ||
|  |     typedef functional::make_expr<tag::shift_left_assign>  _make_shift_left_assign; | ||
|  |     typedef functional::make_expr<tag::shift_right_assign> _make_shift_right_assign; | ||
|  |     typedef functional::make_expr<tag::multiplies_assign>  _make_multiplies_assign; | ||
|  |     typedef functional::make_expr<tag::divides_assign>     _make_divides_assign; | ||
|  |     typedef functional::make_expr<tag::modulus_assign>     _make_modulus_assign; | ||
|  |     typedef functional::make_expr<tag::plus_assign>        _make_plus_assign; | ||
|  |     typedef functional::make_expr<tag::minus_assign>       _make_minus_assign; | ||
|  |     typedef functional::make_expr<tag::bitwise_and_assign> _make_bitwise_and_assign; | ||
|  |     typedef functional::make_expr<tag::bitwise_or_assign>  _make_bitwise_or_assign; | ||
|  |     typedef functional::make_expr<tag::bitwise_xor_assign> _make_bitwise_xor_assign; | ||
|  |     typedef functional::make_expr<tag::subscript>          _make_subscript; | ||
|  |     typedef functional::make_expr<tag::if_else_>           _make_if_else; | ||
|  |     typedef functional::make_expr<tag::function>           _make_function; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct is_callable; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct is_transform; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct is_aggregate; | ||
|  | 
 | ||
|  |     #define BOOST_PROTO_UNEXPR() typedef int proto_is_expr_; | ||
|  |     #define BOOST_PROTO_CALLABLE() typedef void proto_is_callable_; | ||
|  |     #define BOOST_PROTO_AGGREGATE() typedef void proto_is_aggregate_; | ||
|  |     #define BOOST_PROTO_USE_BASIC_EXPR() typedef void proto_use_basic_expr_; | ||
|  | 
 | ||
|  |     struct callable | ||
|  |     { | ||
|  |         BOOST_PROTO_CALLABLE() | ||
|  |     }; | ||
|  | 
 | ||
|  |     namespace envns_ | ||
|  |     { | ||
|  |         struct key_not_found; | ||
|  | 
 | ||
|  |         struct empty_env; | ||
|  | 
 | ||
|  |         typedef int empty_state; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Value, typename Base = empty_env> | ||
|  |         struct env; | ||
|  | 
 | ||
|  |         struct data_type; | ||
|  | 
 | ||
|  |         struct transforms_type; | ||
|  |     } | ||
|  | 
 | ||
|  |     using envns_::key_not_found; | ||
|  |     using envns_::empty_env; | ||
|  |     using envns_::empty_state; | ||
|  |     using envns_::env; | ||
|  |     using envns_::data_type; | ||
|  |     using envns_::transforms_type; | ||
|  | 
 | ||
|  |     struct external_transform; | ||
|  | 
 | ||
|  |     template<typename PrimitiveTransform = void, typename X = void> | ||
|  |     struct transform; | ||
|  | 
 | ||
|  |     template<typename Grammar, typename Fun = Grammar> | ||
|  |     struct when; | ||
|  | 
 | ||
|  |     template<typename Fun> | ||
|  |     struct otherwise; | ||
|  | 
 | ||
|  |     template<typename Fun> | ||
|  |     struct call; | ||
|  | 
 | ||
|  |     template<typename Fun> | ||
|  |     struct make; | ||
|  | 
 | ||
|  |     template<typename PrimitiveTransform> | ||
|  |     struct protect; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct noinvoke; | ||
|  | 
 | ||
|  |     template<typename Fun> | ||
|  |     struct lazy; | ||
|  | 
 | ||
|  |     template<typename Sequence, typename State, typename Fun> | ||
|  |     struct fold; | ||
|  | 
 | ||
|  |     template<typename Sequence, typename State, typename Fun> | ||
|  |     struct reverse_fold; | ||
|  | 
 | ||
|  |     // Q: can we replace fold_tree with fold<flatten(_), state, fun> ? | ||
|  |     // A: once segmented Fusion works well. | ||
|  |     template<typename Sequence, typename State, typename Fun> | ||
|  |     struct fold_tree; | ||
|  | 
 | ||
|  |     template<typename Sequence, typename State, typename Fun> | ||
|  |     struct reverse_fold_tree; | ||
|  | 
 | ||
|  |     template<typename Grammar, typename Domain = deduce_domain> | ||
|  |     struct pass_through; | ||
|  | 
 | ||
|  |     template<typename Grammar = detail::_default> | ||
|  |     struct _default; | ||
|  | 
 | ||
|  |     struct _expr; | ||
|  |     struct _state; | ||
|  |     struct _data; | ||
|  | 
 | ||
|  |     struct _value; | ||
|  | 
 | ||
|  |     struct _void; | ||
|  | 
 | ||
|  |     template<typename T, T I> | ||
|  |     struct integral_c; | ||
|  | 
 | ||
|  |     template<char I> | ||
|  |     struct char_; | ||
|  | 
 | ||
|  |     template<int I> | ||
|  |     struct int_; | ||
|  | 
 | ||
|  |     template<long I> | ||
|  |     struct long_; | ||
|  | 
 | ||
|  |     template<std::size_t I> | ||
|  |     struct size_t; | ||
|  | 
 | ||
|  |     template<int I> | ||
|  |     struct _child_c; | ||
|  | 
 | ||
|  |     typedef _child_c<0> _child0; | ||
|  |     typedef _child_c<1> _child1; | ||
|  |     typedef _child0     _child; | ||
|  |     typedef _child0     _left; | ||
|  |     typedef _child1     _right; | ||
|  | 
 | ||
|  |     // _child2, _child3, _child4, ... | ||
|  |     #define M0(Z, N, DATA) typedef _child_c<N> BOOST_PP_CAT(_child, N); | ||
|  |     BOOST_PP_REPEAT_FROM_TO( | ||
|  |         2 | ||
|  |       , BOOST_PP_DEC(BOOST_PROTO_MAX_ARITY) | ||
|  |       , M0 | ||
|  |       , ~ | ||
|  |     ) | ||
|  |     #undef M0 | ||
|  | 
 | ||
|  |     struct _byref; | ||
|  |     struct _byval; | ||
|  | 
 | ||
|  |     template<typename Tag> | ||
|  |     struct _env_var; | ||
|  | 
 | ||
|  |     struct _env; | ||
|  | 
 | ||
|  |     template<typename T> | ||
|  |     struct is_extension; | ||
|  | 
 | ||
|  |     namespace exops = exprns_; | ||
|  | 
 | ||
|  | }} // namespace boost::proto | ||
|  | 
 | ||
|  | #endif |