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