1742 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			1742 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | // -- Boost Lambda Library -- exceptions.hpp ----------------
 | ||
|  | //
 | ||
|  | // Copyright (C) 2000 Gary Powell (gwpowell@hotmail.com)
 | ||
|  | // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
 | ||
|  | //
 | ||
|  | // 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)
 | ||
|  | //
 | ||
|  | // For more information, see http://www.boost.org 
 | ||
|  | 
 | ||
|  | // -----------------------------------------------------
 | ||
|  | 
 | ||
|  | #if !defined(BOOST_LAMBDA_EXCEPTIONS_HPP)
 | ||
|  | #define BOOST_LAMBDA_EXCEPTIONS_HPP
 | ||
|  | 
 | ||
|  | #include "boost/lambda/core.hpp"
 | ||
|  | #include "boost/lambda/detail/control_constructs_common.hpp"
 | ||
|  | 
 | ||
|  | namespace boost {  | ||
|  | namespace lambda { | ||
|  | 
 | ||
|  | typedef lambda_functor<placeholder<EXCEPTION> > placeholderE_type; | ||
|  | 
 | ||
|  | namespace { | ||
|  |   boost::lambda::placeholderE_type freeE; | ||
|  |   boost::lambda::placeholderE_type& _e = freeE;         | ||
|  | } | ||
|  | 
 | ||
|  | // -- exception related actions -------------------
 | ||
|  | 
 | ||
|  | // catch actions.
 | ||
|  | template <class Catch1, class Catch2 = null_type, class Catch3 = null_type,  | ||
|  |           class Catch4 = null_type, class Catch5 = null_type,  | ||
|  |           class Catch6 = null_type, class Catch7 = null_type,  | ||
|  |           class Catch8 = null_type, class Catch9 = null_type,  | ||
|  |           class Catch10 = null_type> | ||
|  | struct catch_action {}; | ||
|  | 
 | ||
|  | struct catch_all_action {}; | ||
|  | 
 | ||
|  | template<class CatchActions> | ||
|  | struct return_try_catch_action {}; | ||
|  | 
 | ||
|  | template<class CatchActions> | ||
|  | struct try_catch_action {}; | ||
|  | 
 | ||
|  | // rethrow actions
 | ||
|  | struct throw_new_action {}; | ||
|  | struct rethrow_action {}; | ||
|  | 
 | ||
|  | template<class ThrowType> struct throw_action; | ||
|  | 
 | ||
|  | template<> | ||
|  | struct throw_action<rethrow_action> { | ||
|  |   template<class RET> | ||
|  |   static RET apply() { | ||
|  |     throw; | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct throw_action<throw_new_action> { | ||
|  |   template<class RET, class T> | ||
|  |   static RET apply(T& t) { | ||
|  |     throw t; | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // return types for throw_actions --------------------------------------------
 | ||
|  | 
 | ||
|  | template<class T, class Any> | ||
|  | struct  | ||
|  | return_type_N<throw_action<T>, Any> { | ||
|  |   typedef void type; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // return types deductions -------------------------------------------------
 | ||
|  | 
 | ||
|  | // the return type of try_catch is the return type of the try lambda_functor
 | ||
|  | // (the return types of try and catch parts must match unless try returns void
 | ||
|  | // or the catch part throws for sure)
 | ||
|  | 
 | ||
|  | // NOTE, the exception placeholder deduction rule is defined 
 | ||
|  | // in return_type_traits.hpp
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // defined in control_constructs
 | ||
|  | class ifthenelse_action; | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | // Templates for deducing, wether a lambda_functor throws inevitably of not -
 | ||
|  | // This mechanism is needed to make the compiler happy about
 | ||
|  | // return types of try and catch parts. 
 | ||
|  | 
 | ||
|  | // a lambda_functor throws for sure if:
 | ||
|  | //  - it is a throw expression
 | ||
|  | //  - it is a comma expression, and one of its arguments throws for sure
 | ||
|  | //  - it is an if_then_else expression and either the if statement or both 
 | ||
|  | //  the then and  else throw.
 | ||
|  | // (there are other cases as well, but we do not cover them)
 | ||
|  | // e.g. _1 + (rethrow(), 3) does throw for sure but this is not checked
 | ||
|  | // This implies, that in such a case, the return types of try and catch parts 
 | ||
|  | // must match if the try part returns other than void.
 | ||
|  | // (Such checks could be done though)
 | ||
|  | 
 | ||
|  | template <class Arg>  | ||
|  | struct throws_for_sure_phase2 { | ||
|  |   static const bool value = false; | ||
|  | }; | ||
|  | 
 | ||
|  | template <int N, class ThrowType, class Args>  | ||
|  | struct throws_for_sure_phase2< | ||
|  |   lambda_functor<  | ||
|  |     lambda_functor_base<action<N, throw_action<ThrowType> >, Args>  | ||
|  |   >  | ||
|  | > | ||
|  | { | ||
|  |   static const bool value = true; | ||
|  | }; | ||
|  | 
 | ||
|  | // Both then and else or the if throw of an if_then_else.
 | ||
|  | template <class Args>  | ||
|  | struct throws_for_sure_phase2< | ||
|  |   lambda_functor< | ||
|  |     lambda_functor_base< | ||
|  |       ifthenelse_action, Args | ||
|  |     >  | ||
|  |   >  | ||
|  | > | ||
|  | { | ||
|  |   static const bool value = | ||
|  |     throws_for_sure_phase2< | ||
|  |       typename boost::tuples::element<0, Args>::type>::value | ||
|  |     ||   | ||
|  |     ( | ||
|  |        throws_for_sure_phase2< | ||
|  |          typename boost::tuples::element<1, Args>::type | ||
|  |        >::value | ||
|  |        &&  | ||
|  |        throws_for_sure_phase2< | ||
|  |          typename boost::tuples::element<2, Args>::type | ||
|  |        >::value | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | template <class Args>  | ||
|  | struct throws_for_sure_phase2< | ||
|  |   lambda_functor<  | ||
|  |     lambda_functor_base< other_action<comma_action>, Args>  | ||
|  |   >  | ||
|  | > | ||
|  | { | ||
|  |   static const bool value = | ||
|  |     throws_for_sure_phase2< | ||
|  |       typename boost::tuples::element<0, Args>::type | ||
|  |     >::value | ||
|  |     ||  | ||
|  |     throws_for_sure_phase2< | ||
|  |       typename boost::tuples::element<1, Args>::type | ||
|  |     >::value; | ||
|  | }; | ||
|  | 
 | ||
|  |   // get rid of any qualifiers and references
 | ||
|  |   // lambda_functors should be stored like that, so this is to be extra sure 
 | ||
|  | template <class Arg>  | ||
|  | struct throws_for_sure { | ||
|  |   static const bool value  | ||
|  |     = throws_for_sure_phase2< | ||
|  |         typename detail::remove_reference_and_cv<Arg>::type | ||
|  |       >::value; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // -- return_or_throw templates -----------------------------
 | ||
|  | 
 | ||
|  | // false case, catch and try return types are incompatible
 | ||
|  | // Now the catch part must throw for sure, otherwise a compile time error
 | ||
|  | // occurs.
 | ||
|  | template<bool is_conversion> | ||
|  | struct return_or_throw_phase2 { | ||
|  |   template<class RET, class Arg, CALL_TEMPLATE_ARGS> | ||
|  |   static RET call(Arg& arg, CALL_FORMAL_ARGS) { | ||
|  |     BOOST_STATIC_ASSERT(throws_for_sure<Arg>::value); | ||
|  |     detail::select(arg, CALL_ACTUAL_ARGS); // this line throws
 | ||
|  |     throw 1; // this line is never performed, hence 1 is just a dummy
 | ||
|  |              // The line is needed to make compiler happy and not require
 | ||
|  |              // a matching return type
 | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // the try and catch return types are compatible
 | ||
|  | template<> | ||
|  | struct return_or_throw_phase2<true> { | ||
|  |   template<class RET, class Arg, CALL_TEMPLATE_ARGS> | ||
|  |   static RET call(Arg& arg, CALL_FORMAL_ARGS) { | ||
|  |     return detail::select(arg, CALL_ACTUAL_ARGS); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // the non-void case. Try part returns a value, so catch parts must 
 | ||
|  | // return a value of the same type or throw
 | ||
|  | template<class RET, class ARG> | ||
|  | struct return_or_throw { | ||
|  |   // Arg should be equal to ARG except that ARG may be a reference
 | ||
|  |   // to be sure, that there are no suprises for peculiarly defined return types
 | ||
|  |   // ARG is passed explicitely
 | ||
|  |   template<class Arg, CALL_TEMPLATE_ARGS> | ||
|  |   static RET call(Arg& arg, CALL_FORMAL_ARGS) | ||
|  |   {         | ||
|  |     //    typedef typename Arg::return_type<ARG, open_args<A&, B&, C&> >::type RT;        
 | ||
|  |     typedef typename as_lambda_functor<ARG>::type lf_type; | ||
|  |     typedef typename lf_type::inherited::template  | ||
|  |       sig<tuple<CALL_REFERENCE_TYPES> >::type RT;   | ||
|  | 
 | ||
|  |     return  | ||
|  |       return_or_throw_phase2< | ||
|  |         ::boost::is_convertible<RT, RET>::value | ||
|  |       >::template call<RET>(arg, CALL_ACTUAL_ARGS); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // if try part returns void, we do not return the catch parts either
 | ||
|  | template<class ARG> | ||
|  | struct return_or_throw<void, ARG> { | ||
|  |   template<class Arg, CALL_TEMPLATE_ARGS> | ||
|  |   static void call(Arg& arg, CALL_FORMAL_ARGS) { detail::select(arg, CALL_ACTUAL_ARGS); } | ||
|  | }; | ||
|  | 
 | ||
|  | } // end detail
 | ||
|  | 
 | ||
|  | // Throwing exceptions ---------------------------------------------
 | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | template <class T> struct catch_block {};  | ||
|  | struct catch_all_block {}; | ||
|  | 
 | ||
|  | template <class T> struct exception_catch_tag {}; | ||
|  | 
 | ||
|  | // normal catch block is represented as
 | ||
|  | // tagged_lambda_functor<exception_catch_tag<catch_type<T> > >, LambdaFunctor>
 | ||
|  |    | ||
|  | // the default catch all block as:
 | ||
|  | // tagged_lambda_functor<exception_catch_tag<catch_all_block> >, LambdaFunctor>
 | ||
|  | 
 | ||
|  | 
 | ||
|  | } // end detail
 | ||
|  | 
 | ||
|  | // the code is RETHROW, this ensures that a compile time error results, 
 | ||
|  | // if this lambda_functor is used outside a delayed catch_expression
 | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action<0, throw_action<rethrow_action> >,  | ||
|  |     null_type | ||
|  |   >  | ||
|  | > | ||
|  | rethrow() {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action<0, throw_action<rethrow_action> >, | ||
|  |         null_type | ||
|  |       >  | ||
|  |     ( null_type() ); | ||
|  | } | ||
|  | 
 | ||
|  | template <class Arg1> | ||
|  | inline const  | ||
|  | lambda_functor< | ||
|  |   lambda_functor_base<  | ||
|  |     action<1, throw_action<throw_new_action> >,  | ||
|  |     tuple<typename const_copy_argument<const Arg1>::type> | ||
|  |   >  | ||
|  | > | ||
|  | throw_exception(const Arg1& a1) {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action<1, throw_action<throw_new_action> >,  | ||
|  |         tuple<typename const_copy_argument<const Arg1>::type> | ||
|  |       >  | ||
|  |     ( tuple<typename const_copy_argument<const Arg1>::type>(a1)); | ||
|  | } | ||
|  | 
 | ||
|  | // create catch blocks
 | ||
|  | template <class CatchType, class Arg> | ||
|  | inline const  | ||
|  | tagged_lambda_functor< | ||
|  |   detail::exception_catch_tag<detail::catch_block<CatchType> >,  | ||
|  |   lambda_functor<Arg>  | ||
|  | >  | ||
|  | catch_exception(const lambda_functor<Arg>& a) {  | ||
|  |   // the third placeholder cannot be used in catch_exception
 | ||
|  |   //    BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value));
 | ||
|  |   return  | ||
|  |     tagged_lambda_functor< | ||
|  |       detail::exception_catch_tag<detail::catch_block<CatchType> >,  | ||
|  |       lambda_functor<Arg>  | ||
|  |     > (a); | ||
|  | } | ||
|  | 
 | ||
|  | // catch and do nothing case.
 | ||
|  | template <class CatchType> | ||
|  | inline const  | ||
|  | tagged_lambda_functor< | ||
|  |   detail::exception_catch_tag<detail::catch_block<CatchType> >,  | ||
|  |   lambda_functor< | ||
|  |     lambda_functor_base< | ||
|  |       do_nothing_action, | ||
|  |       null_type | ||
|  |     >  | ||
|  |   > | ||
|  | > | ||
|  | catch_exception() {  | ||
|  |   return  | ||
|  |     tagged_lambda_functor< | ||
|  |       detail::exception_catch_tag<detail::catch_block<CatchType> >,  | ||
|  |       lambda_functor< | ||
|  |         lambda_functor_base< | ||
|  |           do_nothing_action, | ||
|  |           null_type | ||
|  |         >  | ||
|  |       > | ||
|  |     > (); | ||
|  | } | ||
|  | 
 | ||
|  | // create catch(...) blocks
 | ||
|  | template <class Arg> | ||
|  | inline const  | ||
|  | tagged_lambda_functor< | ||
|  |   detail::exception_catch_tag<detail::catch_all_block>,  | ||
|  |   lambda_functor<Arg>  | ||
|  | >  | ||
|  | catch_all(const lambda_functor<Arg>& a) {  | ||
|  |   // the third placeholder cannot be used in catch_exception
 | ||
|  |   BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value)); | ||
|  |   return  | ||
|  |     tagged_lambda_functor< | ||
|  |       detail::exception_catch_tag<detail::catch_all_block>,  | ||
|  |       lambda_functor<Arg>  | ||
|  |     > (a); | ||
|  | } | ||
|  | 
 | ||
|  | // catch(...) and do nothing case.
 | ||
|  | inline const  | ||
|  | tagged_lambda_functor< | ||
|  |   detail::exception_catch_tag<detail::catch_all_block>,  | ||
|  |   lambda_functor< | ||
|  |     lambda_functor_base< | ||
|  |       do_nothing_action, | ||
|  |       null_type | ||
|  |     >  | ||
|  |   > | ||
|  | > | ||
|  | catch_all() {  | ||
|  |   return  | ||
|  |     tagged_lambda_functor< | ||
|  |       detail::exception_catch_tag<detail::catch_all_block>,  | ||
|  |       lambda_functor< | ||
|  |         lambda_functor_base< | ||
|  |           do_nothing_action, | ||
|  |           null_type | ||
|  |         >  | ||
|  |       >  | ||
|  |     > (); | ||
|  | } | ||
|  | 
 | ||
|  | // try_catch functions --------------------------------
 | ||
|  | // The second -> N argument(s) are must be catch lambda_functors 
 | ||
|  | template <class TryArg, class Catch1, class LF1> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action<2, try_catch_action<catch_action<Catch1> > >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch1>, LF1>& a2)  | ||
|  | {  | ||
|  |   return  | ||
|  |     lambda_functor_base<  | ||
|  |       action<2, try_catch_action<catch_action<Catch1> > >,  | ||
|  |       tuple<lambda_functor<TryArg>, LF1> | ||
|  |     >  | ||
|  |     ( tuple< lambda_functor<TryArg>, LF1>(a1, a2)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2> | ||
|  | inline const  | ||
|  |   lambda_functor<  | ||
|  |     lambda_functor_base<  | ||
|  |       action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >,  | ||
|  |       tuple<lambda_functor<TryArg>, LF1, LF2> | ||
|  |     >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch2>, LF2>& a3)  | ||
|  | {  | ||
|  |   return  | ||
|  |     lambda_functor_base< | ||
|  |       action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >,  | ||
|  |       tuple<lambda_functor<TryArg>, LF1, LF2> | ||
|  |     >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2>(a1, a2, a3)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3> | ||
|  | inline const lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch3>, LF3>& a4)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >,  | ||
|  |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3> | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3>(a1, a2, a3, a4)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action< | ||
|  |       5,  | ||
|  |       try_catch_action< | ||
|  |         catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4>  | ||
|  |       >  | ||
|  |     >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4>  | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch4>, LF4>& a5)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action< | ||
|  |           5,  | ||
|  |           try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4> >  | ||
|  |         >,  | ||
|  |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4> | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4>(a1, a2, a3, a4, a5)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4,  | ||
|  |                         class Catch5, class LF5> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action< | ||
|  |       6,  | ||
|  |       try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5> > | ||
|  |     >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch5>, LF5>& a6)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |          action< | ||
|  |            6,  | ||
|  |            try_catch_action< | ||
|  |              catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5>  | ||
|  |            >  | ||
|  |          >,  | ||
|  |          tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | ||
|  |         (a1, a2, a3, a4, a5, a6) | ||
|  |     ); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4,  | ||
|  |                         class Catch5, class LF5,  | ||
|  |                         class Catch6, class LF6> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action< | ||
|  |       7,  | ||
|  |       try_catch_action< | ||
|  |         catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, Catch6>  | ||
|  |       >  | ||
|  |     >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch6>, LF6>& a7)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action< | ||
|  |           7,  | ||
|  |           try_catch_action< | ||
|  |             catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>,Catch6>  | ||
|  |           >  | ||
|  |         >,  | ||
|  |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | ||
|  |         (a1, a2, a3, a4, a5, a6, a7)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4,  | ||
|  |                         class Catch5, class LF5,  | ||
|  |                         class Catch6, class LF6, | ||
|  |                         class Catch7, class LF7> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action< | ||
|  |       8,  | ||
|  |       try_catch_action< | ||
|  |         catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, Catch7>  | ||
|  |       >  | ||
|  |     >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch7>, LF7>& a8)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action< | ||
|  |           8,  | ||
|  |           try_catch_action< | ||
|  |             catch_action< | ||
|  |               detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, Catch7 | ||
|  |             >  | ||
|  |           >  | ||
|  |         >,  | ||
|  |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | ||
|  |         (a1, a2, a3, a4, a5, a6, a7, a8)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4,  | ||
|  |                         class Catch5, class LF5,  | ||
|  |                         class Catch6, class LF6,  | ||
|  |                         class Catch7, class LF7,  | ||
|  |                         class Catch8, class LF8> | ||
|  | inline const  | ||
|  | lambda_functor<  | ||
|  |   lambda_functor_base<  | ||
|  |     action< | ||
|  |       9,  | ||
|  |       try_catch_action< | ||
|  |         catch_action< | ||
|  |           detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, Catch8 | ||
|  |         >  | ||
|  |       >  | ||
|  |     >,  | ||
|  |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> | ||
|  |   >  | ||
|  | > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch8>, LF8>& a9)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action< | ||
|  |           9, | ||
|  |           try_catch_action< | ||
|  |             catch_action< | ||
|  |               detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, Catch8 | ||
|  |             >  | ||
|  |           >  | ||
|  |         >,  | ||
|  |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8>  | ||
|  |       >  | ||
|  |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> | ||
|  |         (a1, a2, a3, a4, a5, a6, a7, a8, a9)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class TryArg, class Catch1, class LF1,  | ||
|  |                         class Catch2, class LF2,  | ||
|  |                         class Catch3, class LF3,  | ||
|  |                         class Catch4, class LF4,  | ||
|  |                         class Catch5, class LF5,  | ||
|  |                         class Catch6, class LF6,  | ||
|  |                         class Catch7, class LF7,  | ||
|  |                         class Catch8, class LF8,  | ||
|  |                         class Catch9, class LF9> | ||
|  | inline const  | ||
|  |   lambda_functor<  | ||
|  |     lambda_functor_base<  | ||
|  |       action<  | ||
|  |         10,  | ||
|  |         try_catch_action< | ||
|  |           catch_action< | ||
|  |              detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, detail::catch_block<Catch8>,  | ||
|  |              Catch9 | ||
|  |           >  | ||
|  |         >  | ||
|  |       >,  | ||
|  |       tuple< | ||
|  |         lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | ||
|  |       > | ||
|  |     >  | ||
|  |   > | ||
|  | try_catch( | ||
|  |   const lambda_functor<TryArg>& a1,  | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch8> >, LF8>& a9, | ||
|  |   const tagged_lambda_functor<detail::exception_catch_tag<Catch9>, LF9>& a10)  | ||
|  | {  | ||
|  |   return  | ||
|  |       lambda_functor_base<  | ||
|  |         action< | ||
|  |           10,  | ||
|  |           try_catch_action<  | ||
|  |             catch_action< | ||
|  |               detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, detail::catch_block<Catch8>,  | ||
|  |               Catch9 | ||
|  |             >  | ||
|  |           >  | ||
|  |         >,  | ||
|  |         tuple< | ||
|  |           lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | ||
|  |         > | ||
|  |       >  | ||
|  |     ( tuple< | ||
|  |         lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | ||
|  |       >(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | // ---------------------------------------------------------------------------
 | ||
|  | // Specializations for lambda_functor_base of try_catch ----------------------
 | ||
|  | 
 | ||
|  | // 1 catch type case
 | ||
|  | 
 | ||
|  | template<class Args, class Catch1> | ||
|  | class lambda_functor_base< | ||
|  |   action<2, try_catch_action<catch_action<detail::catch_block<Catch1> > > >,  | ||
|  |   Args | ||
|  | >  | ||
|  | { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  | // the return type of try_catch is the return type of the try lambda_functor
 | ||
|  | // (the return types of try and catch parts must match unless try returns void
 | ||
|  | // or the catch part throws for sure)
 | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |        detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<class Args> | ||
|  | class lambda_functor_base<action<2, try_catch_action<catch_action<detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // 2 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2> | ||
|  | class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {  | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e) | ||
|  |     {           | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1> | ||
|  | class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 3 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3> | ||
|  | class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  | 
 | ||
|  |     } | ||
|  |     catch (Catch2& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  | 
 | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2> | ||
|  | class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 4 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> | ||
|  | class lambda_functor_base<action<5, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3> | ||
|  | class lambda_functor_base<action<5, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 5 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> | ||
|  | class lambda_functor_base<action<6, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> | ||
|  | class lambda_functor_base<action<6, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 6 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> | ||
|  | class lambda_functor_base<action<7, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> | ||
|  | class lambda_functor_base<action<7, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 7 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | ||
|  |                      class Catch7> | ||
|  | class lambda_functor_base<action<8, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch7& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> | ||
|  | class lambda_functor_base<action<8, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, | ||
|  |                                                                detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 8 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | ||
|  |                      class Catch7, class Catch8> | ||
|  | class lambda_functor_base<action<9, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, | ||
|  |     detail::catch_block<Catch7>, detail::catch_block<Catch8> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch7& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch8& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | ||
|  |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | ||
|  |                      class Catch7> | ||
|  | class lambda_functor_base<action<9, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, | ||
|  |     detail::catch_block<Catch7>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch7& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | ||
|  |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // 9 catch types case
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | ||
|  |                      class Catch7, class Catch8, class Catch9> | ||
|  | class lambda_functor_base<action<10, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, | ||
|  |     detail::catch_block<Catch7>, detail::catch_block<Catch8>, detail::catch_block<Catch9> > > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch7& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch8& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | ||
|  |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch9& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> | ||
|  |                ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | ||
|  |                      class Catch7, class Catch8> | ||
|  | class lambda_functor_base<action<10, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, | ||
|  |     detail::catch_block<Catch7>, detail::catch_block<Catch8>,detail::catch_all_block> > >, Args> { | ||
|  | public: | ||
|  |   Args args; | ||
|  | public: | ||
|  |   explicit lambda_functor_base(const Args& a) : args(a) {} | ||
|  | 
 | ||
|  |   template <class SigArgs> struct sig { | ||
|  |     typedef typename  | ||
|  |       as_lambda_functor< | ||
|  |             typename boost::tuples::element<0, Args>::type  | ||
|  |       >::type lf_type; | ||
|  | 
 | ||
|  |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | ||
|  |   }; | ||
|  | 
 | ||
|  |   template<class RET, CALL_TEMPLATE_ARGS> | ||
|  |   RET call(CALL_FORMAL_ARGS) const { | ||
|  |     try  | ||
|  |     { | ||
|  |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | ||
|  |     } | ||
|  |     catch (Catch1& e) | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | ||
|  |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch2& e)  | ||
|  |     {                 | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | ||
|  |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch3& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | ||
|  |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch4& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | ||
|  |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch5& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | ||
|  |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch6& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | ||
|  |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch7& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | ||
|  |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (Catch8& e) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | ||
|  |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | ||
|  |     } | ||
|  |     catch (...) | ||
|  |     { | ||
|  |       return  | ||
|  |         detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> | ||
|  |                ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | } // namespace lambda 
 | ||
|  | } // namespace boost
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |