114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================== | ||
|  |     Copyright (c) 2005-2007 Dan Marsden | ||
|  |     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) | ||
|  | ==============================================================================*/ | ||
|  | #ifndef BOOST_PHOENIX_STATEMENT_THROW_HPP | ||
|  | #define BOOST_PHOENIX_STATEMENT_THROW_HPP | ||
|  | 
 | ||
|  | #include <boost/phoenix/core/limits.hpp> | ||
|  | #include <boost/phoenix/core/actor.hpp> | ||
|  | #include <boost/phoenix/core/call.hpp> | ||
|  | #include <boost/phoenix/core/meta_grammar.hpp> | ||
|  | #include <boost/phoenix/core/expression.hpp> | ||
|  | #include <boost/phoenix/core/terminal.hpp> | ||
|  | #include <boost/phoenix/core/value.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace phoenix | ||
|  | { | ||
|  |     namespace tag | ||
|  |     { | ||
|  |         struct throw_ {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     namespace expression | ||
|  |     { | ||
|  |         template <typename A> | ||
|  |         struct throw_ | ||
|  |             : expr<tag::throw_, A> | ||
|  |         {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     namespace rule | ||
|  |     { | ||
|  |         struct throw_ | ||
|  |             : expression::throw_<meta_grammar> | ||
|  |         {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename Dummy> | ||
|  |     struct meta_grammar::case_<tag::throw_, Dummy> | ||
|  |         : enable_rule<rule::throw_, Dummy> | ||
|  |     {}; | ||
|  | 
 | ||
|  |     struct throw_eval | ||
|  |     { | ||
|  |         typedef void result_type; | ||
|  | 
 | ||
|  |         template <typename ThrowExpr, typename Context> | ||
|  |         result_type | ||
|  |         operator()(ThrowExpr const& throw_expr, Context const & ctx) const | ||
|  |         { | ||
|  |             throw boost::phoenix::eval(throw_expr, ctx); | ||
|  |         } | ||
|  |     }; | ||
|  |      | ||
|  |     template <typename Dummy> | ||
|  |     struct default_actions::when<rule::throw_, Dummy> | ||
|  |         : call<throw_eval> | ||
|  |     {}; | ||
|  | 
 | ||
|  |     template <typename ThrowExpr> | ||
|  |     inline | ||
|  |     typename expression::throw_<ThrowExpr>::type const | ||
|  |     throw_(ThrowExpr const& throw_expr) | ||
|  |     { | ||
|  |         return expression::throw_<ThrowExpr>::make(throw_expr); | ||
|  |     } | ||
|  |      | ||
|  |     namespace detail | ||
|  |     { | ||
|  |         struct rethrow {}; | ||
|  |     } | ||
|  |      | ||
|  |     namespace expression | ||
|  |     { | ||
|  |         struct rethrow | ||
|  |             : expression::value<detail::rethrow> | ||
|  |         {}; | ||
|  |     } | ||
|  |      | ||
|  |     template<typename Dummy> | ||
|  |     struct is_custom_terminal<detail::rethrow, Dummy> | ||
|  |       : mpl::true_ | ||
|  |     {}; | ||
|  | 
 | ||
|  |     template<typename Dummy> | ||
|  |     struct custom_terminal<detail::rethrow, Dummy> | ||
|  |     { | ||
|  |         typedef void result_type; | ||
|  |       //#ifndef BOOST_PHOENIX_NO_SPECIALIZE_CUSTOM_TERMINAL | ||
|  |         typedef void _is_throw_custom_terminal; // fix for #7730 | ||
|  |       //#endif | ||
|  | 
 | ||
|  |         template <typename Context> | ||
|  |         void operator()(detail::rethrow, Context &) const | ||
|  |         { | ||
|  |             throw; | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     inline | ||
|  |     expression::rethrow::type const | ||
|  |     throw_() | ||
|  |     { | ||
|  |         return expression::rethrow::make(detail::rethrow()); | ||
|  |     } | ||
|  | 
 | ||
|  | }} | ||
|  | 
 | ||
|  | #endif |