Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2007 Dan Marsden Chris@16: Copyright (c) 2005-2007 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: Chris@16: #ifndef PHOENIX_STATEMENT_TRY_CATCH_HPP Chris@16: #define PHOENIX_STATEMENT_TRY_CATCH_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: # pragma warning(push) Chris@16: # pragma warning(disable:4355) Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace phoenix { Chris@16: Chris@16: template struct try_catch_composite; Chris@16: Chris@16: namespace meta Chris@16: { Chris@16: template Chris@16: struct try_catch_composite_push_back Chris@16: { Chris@16: typedef typename Composite::base_type actor_tuple; Chris@16: typedef try_catch_composite< Chris@16: typename fusion::result_of::as_vector< Chris@16: typename fusion::result_of::push_back< Chris@16: actor_tuple, Actor>::type>::type> type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct catch_all_composite_push_back Chris@16: { Chris@16: typedef typename Composite::base_type actor_tuple; Chris@16: Chris@16: typedef composite< Chris@16: catch_all_eval, Chris@16: typename fusion::result_of::as_vector< Chris@16: typename fusion::result_of::push_back< Chris@16: actor_tuple, Actor>::type>::type> type; Chris@16: }; Chris@16: } Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: struct try_catch_composite_push_back Chris@16: { Chris@16: template Chris@16: struct result Chris@16: : meta::try_catch_composite_push_back Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: operator()( Chris@16: const Composite& composite, const Actor& actor) const Chris@16: { Chris@16: typedef typename result::type result; Chris@16: return result( Chris@16: fusion::as_vector( Chris@16: fusion::push_back(composite, actor))); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct catch_all_composite_push_back Chris@16: { Chris@16: template Chris@16: struct result Chris@16: : meta::catch_all_composite_push_back Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: operator()( Chris@16: const Composite& composite, const Actor& actor) const Chris@16: { Chris@16: typedef typename result::type result; Chris@16: return result( Chris@16: fusion::as_vector( Chris@16: fusion::push_back(composite, actor))); Chris@16: } Chris@16: }; Chris@16: Chris@16: } Chris@16: Chris@16: detail::try_catch_composite_push_back const try_catch_composite_push_back Chris@16: = detail::try_catch_composite_push_back(); Chris@16: detail::catch_all_composite_push_back const catch_all_composite_push_back Chris@16: = detail::catch_all_composite_push_back(); Chris@16: Chris@16: template Chris@16: struct catch_gen Chris@16: { Chris@16: explicit catch_gen( Chris@16: const SourceComposite& sourceComposite) Chris@16: : mSourceComposite(sourceComposite) { } Chris@16: Chris@16: template Chris@16: actor >::type> Chris@16: operator[](const Actor& actor) const Chris@16: { Chris@16: return try_catch_composite_push_back( Chris@16: mSourceComposite, detail::catch_composite(actor)); Chris@16: } Chris@16: Chris@16: const SourceComposite& mSourceComposite; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct catch_all_gen Chris@16: { Chris@16: explicit catch_all_gen( Chris@16: const SourceComposite& sourceComposite) Chris@16: : mSourceComposite(sourceComposite) { } Chris@16: Chris@16: template Chris@16: actor::type> Chris@16: operator[](const Actor& actor) const Chris@16: { Chris@16: return catch_all_composite_push_back( Chris@16: mSourceComposite, actor); Chris@16: } Chris@16: Chris@16: const SourceComposite& mSourceComposite; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct try_catch_composite Chris@16: : composite Chris@16: { Chris@16: explicit try_catch_composite( Chris@16: const Tuple& t) Chris@16: : Chris@16: composite(t), Chris@16: catch_all(*this) { } Chris@16: Chris@16: try_catch_composite( Chris@16: const try_catch_composite& rhs) Chris@16: : composite(rhs), Chris@16: catch_all(*this) { } Chris@16: Chris@16: template Chris@16: catch_gen catch_() const Chris@16: { Chris@16: return catch_gen( Chris@16: *this); Chris@16: } Chris@16: Chris@16: const catch_all_gen catch_all; Chris@16: Chris@16: private: Chris@16: try_catch_composite& operator=(const try_catch_composite&); Chris@16: }; Chris@16: Chris@16: struct try_gen Chris@16: { Chris@16: template Chris@16: try_catch_composite > operator[]( Chris@16: const Try& try_) const Chris@16: { Chris@16: typedef fusion::vector tuple_type; Chris@16: return try_catch_composite( Chris@16: tuple_type(try_)); Chris@16: } Chris@16: }; Chris@16: Chris@16: try_gen const try_ = try_gen(); Chris@16: }} Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif