| |
| #if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES) |
| #ifndef BOOST_PHOENIX_STATEMENT_DETAIL_SWITCH_HPP |
| #define BOOST_PHOENIX_STATEMENT_DETAIL_SWITCH_HPP |
| |
| #include <boost/phoenix/support/iterate.hpp> |
| |
| #include <boost/phoenix/statement/detail/preprocessed/switch.hpp> |
| |
| #endif |
| #else |
| |
| #if !BOOST_PHOENIX_IS_ITERATING |
| |
| #ifndef BOOST_PHOENIX_STATEMENT_DETAIL_SWITCH_HPP |
| #define BOOST_PHOENIX_STATEMENT_DETAIL_SWITCH_HPP |
| |
| #include <boost/phoenix/support/iterate.hpp> |
| |
| #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) |
| #pragma wave option(preserve: 2, line: 0, output: "preprocessed/switch_" BOOST_PHOENIX_LIMIT_STR ".hpp") |
| #endif |
| |
| /*============================================================================== |
| Copyright (c) 2005-2010 Joel de Guzman |
| Copyright (c) 2010 Thomas Heller |
| |
| 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) |
| ==============================================================================*/ |
| |
| #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) |
| #pragma wave option(preserve: 1) |
| #endif |
| |
| #define BOOST_PHOENIX_SWITCH_EVAL_TYPEDEF_R(Z, N, DATA) \ |
| typedef \ |
| typename fusion::result_of::deref< \ |
| typename fusion::result_of::advance_c< \ |
| flat_view_begin \ |
| , N \ |
| >::type \ |
| >::type \ |
| BOOST_PP_CAT(case, N); \ |
| typedef \ |
| typename proto::detail::uncvref< \ |
| typename proto::result_of::value< \ |
| typename proto::result_of::child_c< \ |
| BOOST_PP_CAT(case, N) \ |
| , 0 \ |
| >::type \ |
| >::type \ |
| >::type \ |
| BOOST_PP_CAT(case_label, N); \ |
| /**/ |
| |
| #define BOOST_PHOENIX_SWITCH_EVAL_R(Z, N, DATA) \ |
| case BOOST_PP_CAT(case_label, N)::value : \ |
| boost::phoenix::eval( \ |
| proto::child_c<1>( \ |
| fusion::deref( \ |
| fusion::advance_c<N>(fusion::begin(flat_view)) \ |
| ) \ |
| ) \ |
| , ctx \ |
| ); \ |
| break; \ |
| /**/ |
| |
| #define BOOST_PHOENIX_ITERATION_PARAMS \ |
| (3, (2, BOOST_PHOENIX_LIMIT, \ |
| <boost/phoenix/statement/detail/switch.hpp>)) |
| #include BOOST_PHOENIX_ITERATE() |
| |
| #undef BOOST_PHOENIX_SWITCH_EVAL_R |
| #undef BOOST_PHOENIX_SWITCH_EVAL_TYPEDEF |
| |
| #if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) |
| #pragma wave option(output: null) |
| #endif |
| |
| #endif |
| |
| #else |
| template <typename Context, typename Cond, typename Cases> |
| result_type |
| evaluate( |
| Context & ctx |
| , Cond const & cond |
| , Cases const & cases |
| , mpl::int_<BOOST_PHOENIX_ITERATION> |
| , mpl::false_ |
| ) const |
| { |
| typedef |
| typename proto::result_of::flatten<Cases const&>::type |
| flat_view_type; |
| |
| typedef |
| typename fusion::result_of::begin<flat_view_type>::type |
| flat_view_begin; |
| |
| flat_view_type flat_view(proto::flatten(cases)); |
| |
| BOOST_PP_REPEAT( |
| BOOST_PHOENIX_ITERATION |
| , BOOST_PHOENIX_SWITCH_EVAL_TYPEDEF_R |
| , BOOST_PHOENIX_ITERATION |
| ) |
| |
| switch(boost::phoenix::eval(cond, ctx)) |
| { |
| BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_SWITCH_EVAL_R, _) |
| } |
| } |
| |
| template <typename Context, typename Cond, typename Cases> |
| result_type |
| evaluate( |
| Context & ctx |
| , Cond const & cond |
| , Cases const & cases |
| , mpl::int_<BOOST_PHOENIX_ITERATION> |
| , mpl::true_ |
| ) const |
| { |
| typedef |
| typename proto::result_of::flatten<Cases const&>::type |
| flat_view_type; |
| |
| typedef |
| typename fusion::result_of::begin<flat_view_type>::type |
| flat_view_begin; |
| |
| flat_view_type flat_view(proto::flatten(cases)); |
| |
| BOOST_PP_REPEAT( |
| BOOST_PP_DEC(BOOST_PHOENIX_ITERATION) |
| , BOOST_PHOENIX_SWITCH_EVAL_TYPEDEF_R |
| , BOOST_PHOENIX_ITERATION |
| ) |
| |
| switch(boost::phoenix::eval(cond, ctx)) |
| { |
| BOOST_PP_REPEAT( |
| BOOST_PP_DEC(BOOST_PHOENIX_ITERATION) |
| , BOOST_PHOENIX_SWITCH_EVAL_R, _ |
| ) |
| default: |
| boost::phoenix::eval( |
| proto::child_c<0>( |
| fusion::deref( |
| fusion::advance_c< |
| BOOST_PP_DEC(BOOST_PHOENIX_ITERATION) |
| >(fusion::begin(flat_view)) |
| ) |
| ) |
| , ctx |
| ); |
| } |
| } |
| |
| #endif |
| |
| #endif // BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES |