166 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | #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 const & 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 const & 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 |