You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							188 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							188 lines
						
					
					
						
							5.8 KiB
						
					
					
				| /*============================================================================= | |
|     Copyright (c) 2005-2007 Dan Marsden | |
|     Copyright (c) 2005-2007 Joel de Guzman | |
|  | |
|     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 PHOENIX_STATEMENT_TRY_CATCH_HPP | |
| #define PHOENIX_STATEMENT_TRY_CATCH_HPP | |
|  | |
| #include <boost/spirit/home/phoenix/core/actor.hpp> | |
| #include <boost/spirit/home/phoenix/core/composite.hpp> | |
|  | |
| #include <boost/fusion/include/push_back.hpp> | |
| #include <boost/fusion/include/as_vector.hpp> | |
|  | |
| #include <boost/spirit/home/phoenix/statement/detail/catch_composite.hpp> | |
| #include <boost/spirit/home/phoenix/statement/detail/catch_eval.hpp> | |
| #include <boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp> | |
|  | |
| #if defined(BOOST_MSVC) | |
| # pragma warning(push) | |
| # pragma warning(disable:4355) | |
| #endif | |
|  | |
| namespace boost { namespace phoenix { | |
| 
 | |
|     template<typename Tuple> struct try_catch_composite; | |
| 
 | |
|     namespace meta | |
|     { | |
|         template<typename Composite, typename Actor> | |
|         struct try_catch_composite_push_back | |
|         { | |
|             typedef typename Composite::base_type actor_tuple; | |
|             typedef try_catch_composite< | |
|                 typename fusion::result_of::as_vector< | |
|                 typename fusion::result_of::push_back< | |
|                 actor_tuple, Actor>::type>::type> type; | |
|         }; | |
| 
 | |
|         template<typename Composite, typename Actor> | |
|         struct catch_all_composite_push_back | |
|         { | |
|             typedef typename Composite::base_type actor_tuple; | |
| 
 | |
|             typedef composite< | |
|                 catch_all_eval, | |
|                 typename fusion::result_of::as_vector< | |
|                 typename fusion::result_of::push_back< | |
|                 actor_tuple, Actor>::type>::type> type; | |
|         }; | |
|     } | |
| 
 | |
|     namespace detail | |
|     { | |
|         struct try_catch_composite_push_back | |
|         { | |
|             template<typename Composite, typename Actor> | |
|             struct result | |
|                 : meta::try_catch_composite_push_back<Composite, Actor> | |
|             {}; | |
| 
 | |
|             template<typename Composite, typename Actor> | |
|             typename result<Composite, Actor>::type | |
|             operator()( | |
|                 const Composite& composite, const Actor& actor) const | |
|             { | |
|                 typedef typename result<Composite, Actor>::type result; | |
|                 return result( | |
|                     fusion::as_vector( | |
|                         fusion::push_back(composite, actor))); | |
|             } | |
|         }; | |
| 
 | |
|         struct catch_all_composite_push_back | |
|         { | |
|             template<typename Composite, typename Actor> | |
|             struct result | |
|                 : meta::catch_all_composite_push_back<Composite, Actor> | |
|             {}; | |
| 
 | |
|             template<typename Composite, typename Actor> | |
|             typename result<Composite, Actor>::type | |
|             operator()( | |
|                 const Composite& composite, const Actor& actor) const | |
|             { | |
|                 typedef typename result<Composite, Actor>::type result; | |
|                 return result( | |
|                     fusion::as_vector( | |
|                         fusion::push_back(composite, actor))); | |
|             } | |
|         }; | |
| 
 | |
|     } | |
| 
 | |
|     detail::try_catch_composite_push_back const try_catch_composite_push_back | |
|         = detail::try_catch_composite_push_back(); | |
|     detail::catch_all_composite_push_back const catch_all_composite_push_back | |
|         = detail::catch_all_composite_push_back(); | |
| 
 | |
|     template<typename Exception, typename SourceComposite> | |
|     struct catch_gen | |
|     { | |
|         explicit catch_gen( | |
|             const SourceComposite& sourceComposite) | |
|             : mSourceComposite(sourceComposite) { } | |
| 
 | |
|         template<typename Actor> | |
|         actor<typename meta::try_catch_composite_push_back< | |
|             SourceComposite, | |
|             detail::catch_composite<Exception, Actor> >::type> | |
|         operator[](const Actor& actor) const | |
|         { | |
|             return try_catch_composite_push_back( | |
|                 mSourceComposite, detail::catch_composite<Exception, Actor>(actor)); | |
|         } | |
| 
 | |
|         const SourceComposite& mSourceComposite; | |
|     }; | |
| 
 | |
|     template<typename SourceComposite> | |
|     struct catch_all_gen | |
|     { | |
|         explicit catch_all_gen( | |
|             const SourceComposite& sourceComposite) | |
|             : mSourceComposite(sourceComposite) { } | |
| 
 | |
|         template<typename Actor> | |
|         actor<typename meta::catch_all_composite_push_back<SourceComposite, Actor>::type> | |
|         operator[](const Actor& actor) const | |
|         { | |
|             return catch_all_composite_push_back( | |
|                 mSourceComposite, actor); | |
|         } | |
| 
 | |
|         const SourceComposite& mSourceComposite; | |
|     }; | |
| 
 | |
|     template<typename Tuple> | |
|     struct try_catch_composite | |
|         : composite<catch_eval, Tuple> | |
|     { | |
|         explicit try_catch_composite( | |
|             const Tuple& t) | |
|             : | |
|             composite<catch_eval, Tuple>(t), | |
|             catch_all(*this) { } | |
| 
 | |
|         try_catch_composite( | |
|             const try_catch_composite& rhs) | |
|             : composite<catch_eval, Tuple>(rhs), | |
|               catch_all(*this) { } | |
| 
 | |
|         template<typename Exception> | |
|         catch_gen<Exception, try_catch_composite> catch_() const | |
|         { | |
|             return catch_gen<Exception, try_catch_composite>( | |
|                 *this); | |
|         } | |
| 
 | |
|         const catch_all_gen<try_catch_composite> catch_all; | |
| 
 | |
|     private: | |
|         try_catch_composite& operator=(const try_catch_composite&); | |
|     }; | |
| 
 | |
|     struct try_gen | |
|     { | |
|         template<typename Try> | |
|         try_catch_composite<fusion::vector<Try> > operator[]( | |
|             const Try& try_) const | |
|         { | |
|             typedef fusion::vector<Try> tuple_type; | |
|             return try_catch_composite<tuple_type>( | |
|                 tuple_type(try_)); | |
|         } | |
|     }; | |
| 
 | |
|     try_gen const try_ = try_gen(); | |
| }} | |
| 
 | |
| #if defined(BOOST_MSVC) | |
| # pragma warning(pop) | |
| #endif | |
|  | |
| #endif
 | |
| 
 |