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
 |