| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | /*==============================================================================    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
 |