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