Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2007 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef PHOENIX_STATEMENT_SWITCH_HPP Chris@16: #define PHOENIX_STATEMENT_SWITCH_HPP 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: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct switch_case_base Chris@16: { Chris@16: typedef Derived derived_t; Chris@16: typedef Actor actor_t; Chris@16: typedef typename Actor::no_nullary no_nullary; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename Actor::eval_type::template result::type type; Chris@16: }; Chris@16: Chris@16: switch_case_base(Actor const& actor) Chris@16: : actor(actor) {} Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: eval(Env const& env) const Chris@16: { Chris@16: return actor.eval(env); Chris@16: } Chris@16: Chris@16: Actor actor; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct switch_case : switch_case_base, Actor> Chris@16: { Chris@16: typedef switch_case_base, Actor> base_t; Chris@16: static K const value = Value; Chris@16: static bool const is_default = false; Chris@16: Chris@16: switch_case(Actor const& actor) Chris@16: : base_t(actor) {} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct default_case : switch_case_base, Actor> Chris@16: { Chris@16: typedef switch_case_base, Actor> base_t; Chris@16: static bool const is_default = true; Chris@16: Chris@16: default_case(Actor const& actor) Chris@16: : base_t(actor) {} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct switch_gen Chris@16: { Chris@16: switch_gen(Cond const& cond) Chris@16: : cond(cond) {} Chris@16: Chris@16: template Chris@16: typename lazy_enable_if< Chris@16: fusion::traits::is_sequence Chris@16: , detail::switch_composite_actor Chris@16: >::type Chris@16: operator[](Cases const& cases) const Chris@16: { Chris@16: typedef typename Chris@16: detail::switch_composite Chris@16: switch_composite; Chris@16: return switch_composite::eval(cond, cases); Chris@16: } Chris@16: Chris@16: template Chris@16: actor > >::type> Chris@16: operator[](switch_case_base const& case_) const Chris@16: { Chris@16: typedef typename Chris@16: detail::switch_composite > > Chris@16: switch_composite; Chris@16: return switch_composite::eval(cond, Chris@16: fusion::vector >(static_cast(case_))); Chris@16: } Chris@16: Chris@16: Cond cond; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline switch_gen::type> Chris@16: switch_(Cond const& cond) Chris@16: { Chris@16: return switch_gen::type>( Chris@16: as_actor::convert(cond)); Chris@16: } Chris@16: Chris@16: template Chris@16: switch_case::type, int, N> Chris@16: case_(A0 const& _0) Chris@16: { Chris@16: return switch_case::type, int, N> Chris@16: (as_actor::convert(_0)); Chris@16: } Chris@16: Chris@16: template Chris@16: default_case::type> Chris@16: default_(A0 const& _0) Chris@16: { Chris@16: return default_case::type> Chris@16: (as_actor::convert(_0)); Chris@16: } Chris@16: Chris@16: template Chris@16: inline typename detail::compose_case_a::type Chris@16: operator,( Chris@16: switch_case_base const& _0 Chris@16: , switch_case_base const& _1 Chris@16: ) Chris@16: { Chris@16: return detail::compose_case_a::eval( Chris@16: static_cast(_0) Chris@16: , static_cast(_1) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: inline typename Chris@16: lazy_enable_if< Chris@16: fusion::traits::is_sequence Chris@16: , detail::compose_case_b Chris@16: >::type Chris@16: operator,(Seq const& seq, switch_case_base const& case_) Chris@16: { Chris@16: return detail::compose_case_b::eval( Chris@16: seq, static_cast(case_)); Chris@16: } Chris@16: Chris@16: // Implementation of routines in detail/switch.hpp that depend on Chris@16: // the completeness of default_case. Chris@16: namespace detail { Chris@16: template Chris@16: typename ensure_default::type Chris@16: ensure_default::eval(Cases const& cases, mpl::false_) Chris@16: { Chris@16: actor > > default_ Chris@16: = default_case >(nothing); Chris@16: return fusion::push_front(cases, default_); Chris@16: } Chris@16: } Chris@16: }} Chris@16: Chris@16: #endif