/*============================================================================= 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_DETAIL_SWITCH_HPP #define PHOENIX_STATEMENT_DETAIL_SWITCH_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace phoenix { template struct switch_case; template struct default_case; namespace detail { template struct is_default_case : mpl::bool_ {}; template struct compose_case_a { // here, A0 and A1 are both switch cases typedef typename mpl::if_< is_default_case , fusion::vector, actor > , fusion::vector, actor > >::type type; static type eval(A0 const& _0, A1 const& _1, mpl::false_) { return type(_0, _1); } static type eval(A0 const& _0, A1 const& _1, mpl::true_) { return type(_1, _0); } static type eval(A0 const& _0, A1 const& _1) { return eval(_0, _1, is_default_case()); } }; template struct compose_case_b { typedef typename fusion::result_of::as_vector< typename mpl::eval_if< is_default_case , fusion::result_of::push_front > , fusion::result_of::push_back > >::type>::type type; static type eval(Seq const& seq, Case const& case_, mpl::false_) { return fusion::as_vector( fusion::push_back(seq, actor(case_))); } static type eval(Seq const& seq, Case const& case_, mpl::true_) { return fusion::as_vector( fusion::push_front(seq, actor(case_))); } static type eval(Seq const& seq, Case const& case_) { return eval(seq, case_, is_default_case()); } }; template struct ensure_default { typedef is_default_case< typename fusion::result_of::value_of< typename fusion::result_of::begin::type >::type > is_default_case_; typedef typename mpl::eval_if< is_default_case_ , mpl::identity , fusion::result_of::push_front< Cases const, actor > > > >::type type; static type eval(Cases const& cases, mpl::false_); static type eval(Cases const& cases, mpl::true_) { return cases; } static type eval(Cases const& cases) { return eval(cases, is_default_case_()); } }; template struct switch_composite { BOOST_STATIC_ASSERT(fusion::traits::is_sequence::value); typedef ensure_default ensure_default_; typedef typename fusion::result_of::as_vector< typename fusion::result_of::push_front< typename ensure_default_::type, Cond>::type >::type tuple_type; typedef composite< detail::switch_eval::value-2> , tuple_type> type; static type eval(Cond const& cond, Cases const& cases) { return fusion::as_vector( fusion::push_front(ensure_default_::eval(cases), cond)); } }; template struct switch_composite_actor { typedef actor::type> type; }; } }} #endif