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
 | 
