#ifndef SPROUT_BREED_BREED_FWD_HPP #define SPROUT_BREED_BREED_FWD_HPP #include #include #include #include namespace sprout { namespace breed { namespace detail { typedef char yes_type; typedef char (&no_type)[2]; template struct sized_type { public: typedef char (&type)[N]; }; struct dont_care; struct undefined; struct not_a_valid_type; struct private_type_ { public: SPROUT_CONSTEXPR private_type_ operator,(int) const; // ??? }; template struct uncvref { public: typedef T type; }; template struct uncvref { public: typedef T type; }; template struct uncvref { public: typedef T type; }; template struct uncvref { public: typedef T type; }; template struct uncvref { public: typedef T type[N]; }; template struct uncvref { public: typedef T type[N]; }; template struct uncvref { public: typedef T type[N]; }; struct ignore { public: ignore() = default; ignore(ignore const&) = default; ignore(ignore&&) = default; template SPROUT_CONSTEXPR ignore(T const&) {} }; struct _default; struct not_a_domain; struct not_a_grammar; struct not_a_generator; template struct is_transform_; template struct is_aggregate_; } // namespace detail typedef sprout::breed::detail::ignore const ignore; namespace argsns_ { template struct term; template struct list; } // namespace argsns_ using namespace argsns_; 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 struct breed_expr; struct breed_expr_iterator; struct breed_flat_view; } // namespace tag } // namespace tagns_ using namespace tagns_; template struct tag_of; struct _; struct default_generator; struct basic_default_generator; template class Extends> struct generator; template class Extends> struct pod_generator; struct by_value_generator; template struct compose_generators; template struct wants_basic_expr; template struct use_basic_expr; namespace domainns_ { typedef sprout::breed::detail::not_a_domain no_super_domain; template< typename Generator = sprout::breed::default_generator, typename Grammar = sprout::breed::_, typename Super = sprout::breed::domainns_::no_super_domain > struct domain; struct default_domain; struct basic_default_domain; struct deduce_domain; template< typename Domain, typename Tag, typename Args, bool WantsBasicExpr = sprout::breed::wants_basic_expr::value > struct base_expr; } // namespace domainns_ using namespace domainns_; namespace exprns_ { template struct basic_expr; template struct expr; template< typename Expr, typename Derived, typename Domain = sprout::breed::default_domain, long Arity = Expr::breed_arity_c > struct extends; template struct virtual_member; struct is_breed_expr; } using exprns_::expr; using exprns_::basic_expr; using exprns_::extends; using exprns_::is_breed_expr; template struct or_; template struct and_; template struct not_; template< typename Condition, typename Then = sprout::breed::_, typename Else = sprout::breed::not_ > struct if_; template()> struct switch_; template struct exact; template struct convertible_to; template struct vararg; SPROUT_STATIC_CONSTEXPR int N = (INT_MAX >> 10); namespace context { struct null_context; template struct null_eval; struct default_context; template< typename Expr, typename Context, typename Tag = typename Expr::breed_tag, long Arity = Expr::breed_arity_c > struct default_eval; template struct callable_context; template struct callable_eval; } // namespace context 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 struct literal; } // namespace context using utility::literal; namespace result_of { template struct as_expr; template struct as_child; template > struct child; template struct child_c; template struct left; template struct right; template struct deep_copy; template struct eval; template< typename Tag, typename DomainOrArg, typename... Args > struct make_expr; template struct unpack_expr; } // namespace result_of template struct is_expr; template struct is_domain; template struct is_sub_domain_of; template struct arity_of; template struct domain_of; template struct matches; template struct unary_expr; template struct binary_expr; template struct nary_expr; template struct terminal; template struct unary_plus; template struct negate; template struct dereference; template struct complement; template struct address_of; template struct logical_not; template struct pre_inc; template struct pre_dec; template struct post_inc; template struct post_dec; template struct shift_left; template struct shift_right; template struct multiplies; template struct divides; template struct modulus; template struct plus; template struct minus; template struct less; template struct greater; template struct less_equal; template struct greater_equal; template struct equal_to; template struct not_equal_to; template struct logical_or; template struct logical_and; template struct bitwise_and; template struct bitwise_or; template struct bitwise_xor; template struct comma; template struct mem_ptr; template struct assign; template struct shift_left_assign; template struct shift_right_assign; template struct multiplies_assign; template struct divides_assign; template struct modulus_assign; template struct plus_assign; template struct minus_assign; template struct bitwise_and_assign; template struct bitwise_or_assign; template struct bitwise_xor_assign; template struct subscript; template struct member; template struct if_else_; template struct function; namespace functional { struct left; struct right; struct eval; struct deep_copy; template struct as_expr; template struct as_child; template > struct child; template struct child_c; template struct make_expr; template struct unpack_expr; typedef sprout::breed::functional::make_expr make_terminal; typedef sprout::breed::functional::make_expr make_unary_plus; typedef sprout::breed::functional::make_expr make_negate; typedef sprout::breed::functional::make_expr make_dereference; typedef sprout::breed::functional::make_expr make_complement; typedef sprout::breed::functional::make_expr make_address_of; typedef sprout::breed::functional::make_expr make_logical_not; typedef sprout::breed::functional::make_expr make_pre_inc; typedef sprout::breed::functional::make_expr make_pre_dec; typedef sprout::breed::functional::make_expr make_post_inc; typedef sprout::breed::functional::make_expr make_post_dec; typedef sprout::breed::functional::make_expr make_shift_left; typedef sprout::breed::functional::make_expr make_shift_right; typedef sprout::breed::functional::make_expr make_multiplies; typedef sprout::breed::functional::make_expr make_divides; typedef sprout::breed::functional::make_expr make_modulus; typedef sprout::breed::functional::make_expr make_plus; typedef sprout::breed::functional::make_expr make_minus; typedef sprout::breed::functional::make_expr make_less; typedef sprout::breed::functional::make_expr make_greater; typedef sprout::breed::functional::make_expr make_less_equal; typedef sprout::breed::functional::make_expr make_greater_equal; typedef sprout::breed::functional::make_expr make_equal_to; typedef sprout::breed::functional::make_expr make_not_equal_to; typedef sprout::breed::functional::make_expr make_logical_or; typedef sprout::breed::functional::make_expr make_logical_and; typedef sprout::breed::functional::make_expr make_bitwise_and; typedef sprout::breed::functional::make_expr make_bitwise_or; typedef sprout::breed::functional::make_expr make_bitwise_xor; typedef sprout::breed::functional::make_expr make_comma; typedef sprout::breed::functional::make_expr make_mem_ptr; typedef sprout::breed::functional::make_expr make_assign; typedef sprout::breed::functional::make_expr make_shift_left_assign; typedef sprout::breed::functional::make_expr make_shift_right_assign; typedef sprout::breed::functional::make_expr make_multiplies_assign; typedef sprout::breed::functional::make_expr make_divides_assign; typedef sprout::breed::functional::make_expr make_modulus_assign; typedef sprout::breed::functional::make_expr make_plus_assign; typedef sprout::breed::functional::make_expr make_minus_assign; typedef sprout::breed::functional::make_expr make_bitwise_and_assign; typedef sprout::breed::functional::make_expr make_bitwise_or_assign; typedef sprout::breed::functional::make_expr make_bitwise_xor_assign; typedef sprout::breed::functional::make_expr make_subscript; typedef sprout::breed::functional::make_expr make_if_else; typedef sprout::breed::functional::make_expr 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; } // namespace functional 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 sprout::breed::functional::make_expr _make_terminal; typedef sprout::breed::functional::make_expr _make_unary_plus; typedef sprout::breed::functional::make_expr _make_negate; typedef sprout::breed::functional::make_expr _make_dereference; typedef sprout::breed::functional::make_expr _make_complement; typedef sprout::breed::functional::make_expr _make_address_of; typedef sprout::breed::functional::make_expr _make_logical_not; typedef sprout::breed::functional::make_expr _make_pre_inc; typedef sprout::breed::functional::make_expr _make_pre_dec; typedef sprout::breed::functional::make_expr _make_post_inc; typedef sprout::breed::functional::make_expr _make_post_dec; typedef sprout::breed::functional::make_expr _make_shift_left; typedef sprout::breed::functional::make_expr _make_shift_right; typedef sprout::breed::functional::make_expr _make_multiplies; typedef sprout::breed::functional::make_expr _make_divides; typedef sprout::breed::functional::make_expr _make_modulus; typedef sprout::breed::functional::make_expr _make_plus; typedef sprout::breed::functional::make_expr _make_minus; typedef sprout::breed::functional::make_expr _make_less; typedef sprout::breed::functional::make_expr _make_greater; typedef sprout::breed::functional::make_expr _make_less_equal; typedef sprout::breed::functional::make_expr _make_greater_equal; typedef sprout::breed::functional::make_expr _make_equal_to; typedef sprout::breed::functional::make_expr _make_not_equal_to; typedef sprout::breed::functional::make_expr _make_logical_or; typedef sprout::breed::functional::make_expr _make_logical_and; typedef sprout::breed::functional::make_expr _make_bitwise_and; typedef sprout::breed::functional::make_expr _make_bitwise_or; typedef sprout::breed::functional::make_expr _make_bitwise_xor; typedef sprout::breed::functional::make_expr _make_comma; typedef sprout::breed::functional::make_expr _make_mem_ptr; typedef sprout::breed::functional::make_expr _make_assign; typedef sprout::breed::functional::make_expr _make_shift_left_assign; typedef sprout::breed::functional::make_expr _make_shift_right_assign; typedef sprout::breed::functional::make_expr _make_multiplies_assign; typedef sprout::breed::functional::make_expr _make_divides_assign; typedef sprout::breed::functional::make_expr _make_modulus_assign; typedef sprout::breed::functional::make_expr _make_plus_assign; typedef sprout::breed::functional::make_expr _make_minus_assign; typedef sprout::breed::functional::make_expr _make_bitwise_and_assign; typedef sprout::breed::functional::make_expr _make_bitwise_or_assign; typedef sprout::breed::functional::make_expr _make_bitwise_xor_assign; typedef sprout::breed::functional::make_expr _make_subscript; typedef sprout::breed::functional::make_expr _make_if_else; typedef sprout::breed::functional::make_expr _make_function; template struct is_callable; template struct is_transform; template struct is_aggregate; # define SPROUT_BREED_UNEXPR() typedef int breed_is_expr_; # define SPROUT_BREED_CALLABLE() typedef void breed_is_callable_; # define SPROUT_BREED_AGGREGATE() typedef void breed_is_aggregate_; # define SPROUT_BREED_USE_BASIC_EXPR() typedef void breed_use_basic_expr_; struct callable { public: SPROUT_BREED_CALLABLE(); }; struct external_transform; template struct transform; template struct when; template struct otherwise; template struct call; template struct make; template struct protect; template struct noinvoke; template struct lazy; template struct fold; template struct reverse_fold; template struct fold_tree; template struct reverse_fold_tree; template struct pass_through; template struct _default; struct _expr; struct _state; struct _data; struct _value; struct _void; template struct integral_c; template struct char_; template struct int_; template struct long_; template struct size_t; template struct _child_c; typedef _child_c<0> _child0; typedef _child_c<1> _child1; typedef _child0 _child; typedef _child0 _left; typedef _child1 _right; typedef _child_c<2> _child2; struct _byref; struct _byval; template struct is_extension; } // namespace breed } // namespace sprout #endif // #ifndef SPROUT_BREED_BREED_FWD_HPP