| 1 | // -- Boost Lambda Library -- exceptions.hpp ---------------- | 
|---|
| 2 | // | 
|---|
| 3 | // Copyright (C) 2000 Gary Powell (gwpowell@hotmail.com) | 
|---|
| 4 | // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) | 
|---|
| 5 | // | 
|---|
| 6 | // Distributed under the Boost Software License, Version 1.0. (See | 
|---|
| 7 | // accompanying file LICENSE_1_0.txt or copy at | 
|---|
| 8 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
| 9 | // | 
|---|
| 10 | // For more information, see http://www.boost.org  | 
|---|
| 11 |  | 
|---|
| 12 | // ----------------------------------------------------- | 
|---|
| 13 |  | 
|---|
| 14 | #if !defined(BOOST_LAMBDA_EXCEPTIONS_HPP) | 
|---|
| 15 | #define BOOST_LAMBDA_EXCEPTIONS_HPP | 
|---|
| 16 |  | 
|---|
| 17 | #include "boost/lambda/detail/control_constructs_common.hpp" | 
|---|
| 18 |  | 
|---|
| 19 | namespace boost {  | 
|---|
| 20 | namespace lambda { | 
|---|
| 21 |  | 
|---|
| 22 | typedef lambda_functor<placeholder<EXCEPTION> > placeholderE_type; | 
|---|
| 23 |  | 
|---|
| 24 | namespace { | 
|---|
| 25 |   boost::lambda::placeholderE_type freeE; | 
|---|
| 26 |   boost::lambda::placeholderE_type& _e = freeE;         | 
|---|
| 27 | } | 
|---|
| 28 |  | 
|---|
| 29 | // -- exception related actions ------------------- | 
|---|
| 30 |  | 
|---|
| 31 | // catch actions. | 
|---|
| 32 | template <class Catch1, class Catch2 = null_type, class Catch3 = null_type,  | 
|---|
| 33 |           class Catch4 = null_type, class Catch5 = null_type,  | 
|---|
| 34 |           class Catch6 = null_type, class Catch7 = null_type,  | 
|---|
| 35 |           class Catch8 = null_type, class Catch9 = null_type,  | 
|---|
| 36 |           class Catch10 = null_type> | 
|---|
| 37 | struct catch_action {}; | 
|---|
| 38 |  | 
|---|
| 39 | struct catch_all_action {}; | 
|---|
| 40 |  | 
|---|
| 41 | template<class CatchActions> | 
|---|
| 42 | struct return_try_catch_action {}; | 
|---|
| 43 |  | 
|---|
| 44 | template<class CatchActions> | 
|---|
| 45 | struct try_catch_action {}; | 
|---|
| 46 |  | 
|---|
| 47 | // rethrow actions | 
|---|
| 48 | struct throw_new_action {}; | 
|---|
| 49 | struct rethrow_action {}; | 
|---|
| 50 |  | 
|---|
| 51 | template<class ThrowType> struct throw_action; | 
|---|
| 52 |  | 
|---|
| 53 | template<> | 
|---|
| 54 | struct throw_action<rethrow_action> { | 
|---|
| 55 |   template<class RET> | 
|---|
| 56 |   static RET apply() { | 
|---|
| 57 |     throw; | 
|---|
| 58 |   } | 
|---|
| 59 | }; | 
|---|
| 60 |  | 
|---|
| 61 | template<> struct throw_action<throw_new_action> { | 
|---|
| 62 |   template<class RET, class T> | 
|---|
| 63 |   static RET apply(T& t) { | 
|---|
| 64 |     throw t; | 
|---|
| 65 |   } | 
|---|
| 66 | }; | 
|---|
| 67 |  | 
|---|
| 68 | // return types for throw_actions -------------------------------------------- | 
|---|
| 69 |  | 
|---|
| 70 | template<class T, class Any> | 
|---|
| 71 | struct  | 
|---|
| 72 | return_type_N<throw_action<T>, Any> { | 
|---|
| 73 |   typedef void type; | 
|---|
| 74 | }; | 
|---|
| 75 |  | 
|---|
| 76 |  | 
|---|
| 77 | // return types deductions ------------------------------------------------- | 
|---|
| 78 |  | 
|---|
| 79 | // the return type of try_catch is the return type of the try lambda_functor | 
|---|
| 80 | // (the return types of try and catch parts must match unless try returns void | 
|---|
| 81 | // or the catch part throws for sure) | 
|---|
| 82 |  | 
|---|
| 83 | // NOTE, the exception placeholder deduction rule is defined  | 
|---|
| 84 | // in return_type_traits.hpp | 
|---|
| 85 |  | 
|---|
| 86 |  | 
|---|
| 87 |  | 
|---|
| 88 | // defined in control_constructs | 
|---|
| 89 | class ifthenelse_action; | 
|---|
| 90 |  | 
|---|
| 91 | namespace detail { | 
|---|
| 92 |  | 
|---|
| 93 | // Templates for deducing, wether a lambda_functor throws inevitably of not - | 
|---|
| 94 | // This mechanism is needed to make the compiler happy about | 
|---|
| 95 | // return types of try and catch parts.  | 
|---|
| 96 |  | 
|---|
| 97 | // a lambda_functor throws for sure if: | 
|---|
| 98 | //  - it is a throw expression | 
|---|
| 99 | //  - it is a comma expression, and one of its arguments throws for sure | 
|---|
| 100 | //  - it is an if_then_else expression and either the if statement or both  | 
|---|
| 101 | //  the then and  else throw. | 
|---|
| 102 | // (there are other cases as well, but we do not cover them) | 
|---|
| 103 | // e.g. _1 + (rethrow(), 3) does throw for sure but this is not checked | 
|---|
| 104 | // This implies, that in such a case, the return types of try and catch parts  | 
|---|
| 105 | // must match if the try part returns other than void. | 
|---|
| 106 | // (Such checks could be done though) | 
|---|
| 107 |  | 
|---|
| 108 | template <class Arg>  | 
|---|
| 109 | struct throws_for_sure_phase2 { | 
|---|
| 110 |   static const bool value = false; | 
|---|
| 111 | }; | 
|---|
| 112 |  | 
|---|
| 113 | template <int N, class ThrowType, class Args>  | 
|---|
| 114 | struct throws_for_sure_phase2< | 
|---|
| 115 |   lambda_functor<  | 
|---|
| 116 |     lambda_functor_base<action<N, throw_action<ThrowType> >, Args>  | 
|---|
| 117 |   >  | 
|---|
| 118 | > | 
|---|
| 119 | { | 
|---|
| 120 |   static const bool value = true; | 
|---|
| 121 | }; | 
|---|
| 122 |  | 
|---|
| 123 | // Both then and else or the if throw of an if_then_else. | 
|---|
| 124 | template <class Args>  | 
|---|
| 125 | struct throws_for_sure_phase2< | 
|---|
| 126 |   lambda_functor< | 
|---|
| 127 |     lambda_functor_base< | 
|---|
| 128 |       ifthenelse_action, Args | 
|---|
| 129 |     >  | 
|---|
| 130 |   >  | 
|---|
| 131 | > | 
|---|
| 132 | { | 
|---|
| 133 |   static const bool value = | 
|---|
| 134 |     throws_for_sure_phase2< | 
|---|
| 135 |       typename boost::tuples::element<0, Args>::type>::value | 
|---|
| 136 |     ||   | 
|---|
| 137 |     ( | 
|---|
| 138 |        throws_for_sure_phase2< | 
|---|
| 139 |          typename boost::tuples::element<1, Args>::type | 
|---|
| 140 |        >::value | 
|---|
| 141 |        &&  | 
|---|
| 142 |        throws_for_sure_phase2< | 
|---|
| 143 |          typename boost::tuples::element<2, Args>::type | 
|---|
| 144 |        >::value | 
|---|
| 145 |     ); | 
|---|
| 146 | }; | 
|---|
| 147 |  | 
|---|
| 148 | template <class Args>  | 
|---|
| 149 | struct throws_for_sure_phase2< | 
|---|
| 150 |   lambda_functor<  | 
|---|
| 151 |     lambda_functor_base< other_action<comma_action>, Args>  | 
|---|
| 152 |   >  | 
|---|
| 153 | > | 
|---|
| 154 | { | 
|---|
| 155 |   static const bool value = | 
|---|
| 156 |     throws_for_sure_phase2< | 
|---|
| 157 |       typename boost::tuples::element<0, Args>::type | 
|---|
| 158 |     >::value | 
|---|
| 159 |     ||  | 
|---|
| 160 |     throws_for_sure_phase2< | 
|---|
| 161 |       typename boost::tuples::element<1, Args>::type | 
|---|
| 162 |     >::value; | 
|---|
| 163 | }; | 
|---|
| 164 |  | 
|---|
| 165 |   // get rid of any qualifiers and references | 
|---|
| 166 |   // lambda_functors should be stored like that, so this is to be extra sure  | 
|---|
| 167 | template <class Arg>  | 
|---|
| 168 | struct throws_for_sure { | 
|---|
| 169 |   static const bool value  | 
|---|
| 170 |     = throws_for_sure_phase2< | 
|---|
| 171 |         typename detail::remove_reference_and_cv<Arg>::type | 
|---|
| 172 |       >::value; | 
|---|
| 173 | }; | 
|---|
| 174 |  | 
|---|
| 175 |  | 
|---|
| 176 | // -- return_or_throw templates ----------------------------- | 
|---|
| 177 |  | 
|---|
| 178 | // false case, catch and try return types are incompatible | 
|---|
| 179 | // Now the catch part must throw for sure, otherwise a compile time error | 
|---|
| 180 | // occurs. | 
|---|
| 181 | template<bool is_conversion> | 
|---|
| 182 | struct return_or_throw_phase2 { | 
|---|
| 183 |   template<class RET, class Arg, CALL_TEMPLATE_ARGS> | 
|---|
| 184 |   static RET call(Arg& arg, CALL_FORMAL_ARGS) { | 
|---|
| 185 |     BOOST_STATIC_ASSERT(throws_for_sure<Arg>::value); | 
|---|
| 186 |     detail::select(arg, CALL_ACTUAL_ARGS); // this line throws | 
|---|
| 187 |     throw 1; // this line is never performed, hence 1 is just a dummy | 
|---|
| 188 |              // The line is needed to make compiler happy and not require | 
|---|
| 189 |              // a matching return type | 
|---|
| 190 |   } | 
|---|
| 191 | }; | 
|---|
| 192 |  | 
|---|
| 193 | // the try and catch return types are compatible | 
|---|
| 194 | template<> | 
|---|
| 195 | struct return_or_throw_phase2<true> { | 
|---|
| 196 |   template<class RET, class Arg, CALL_TEMPLATE_ARGS> | 
|---|
| 197 |   static RET call(Arg& arg, CALL_FORMAL_ARGS) { | 
|---|
| 198 |     return detail::select(arg, CALL_ACTUAL_ARGS); | 
|---|
| 199 |   } | 
|---|
| 200 | }; | 
|---|
| 201 |  | 
|---|
| 202 |  | 
|---|
| 203 | // the non-void case. Try part returns a value, so catch parts must  | 
|---|
| 204 | // return a value of the same type or throw | 
|---|
| 205 | template<class RET, class ARG> | 
|---|
| 206 | struct return_or_throw { | 
|---|
| 207 |   // Arg should be equal to ARG except that ARG may be a reference | 
|---|
| 208 |   // to be sure, that there are no suprises for peculiarly defined return types | 
|---|
| 209 |   // ARG is passed explicitely | 
|---|
| 210 |   template<class Arg, CALL_TEMPLATE_ARGS> | 
|---|
| 211 |   static RET call(Arg& arg, CALL_FORMAL_ARGS) | 
|---|
| 212 |   {         | 
|---|
| 213 |     //    typedef typename Arg::return_type<ARG, open_args<A&, B&, C&> >::type RT;         | 
|---|
| 214 |     typedef typename as_lambda_functor<ARG>::type lf_type; | 
|---|
| 215 |     typedef typename lf_type::inherited::template  | 
|---|
| 216 |       sig<tuple<CALL_REFERENCE_TYPES> >::type RT;   | 
|---|
| 217 |  | 
|---|
| 218 |     return  | 
|---|
| 219 |       return_or_throw_phase2< | 
|---|
| 220 |         ::boost::is_convertible<RT, RET>::value | 
|---|
| 221 |       >::template call<RET>(arg, CALL_ACTUAL_ARGS); | 
|---|
| 222 |   } | 
|---|
| 223 | }; | 
|---|
| 224 |  | 
|---|
| 225 | // if try part returns void, we do not return the catch parts either | 
|---|
| 226 | template<class ARG> | 
|---|
| 227 | struct return_or_throw<void, ARG> { | 
|---|
| 228 |   template<class Arg, CALL_TEMPLATE_ARGS> | 
|---|
| 229 |   static void call(Arg& arg, CALL_FORMAL_ARGS) { detail::select(arg, CALL_ACTUAL_ARGS); } | 
|---|
| 230 | }; | 
|---|
| 231 |  | 
|---|
| 232 | } // end detail | 
|---|
| 233 |  | 
|---|
| 234 | // Throwing exceptions --------------------------------------------- | 
|---|
| 235 |  | 
|---|
| 236 | namespace detail { | 
|---|
| 237 |  | 
|---|
| 238 | template <class T> struct catch_block {};  | 
|---|
| 239 | struct catch_all_block {}; | 
|---|
| 240 |  | 
|---|
| 241 | template <class T> struct exception_catch_tag {}; | 
|---|
| 242 |  | 
|---|
| 243 | // normal catch block is represented as | 
|---|
| 244 | // tagged_lambda_functor<exception_catch_tag<catch_type<T> > >, LambdaFunctor> | 
|---|
| 245 |    | 
|---|
| 246 | // the default catch all block as: | 
|---|
| 247 | // tagged_lambda_functor<exception_catch_tag<catch_all_block> >, LambdaFunctor> | 
|---|
| 248 |  | 
|---|
| 249 |  | 
|---|
| 250 | } // end detail | 
|---|
| 251 |  | 
|---|
| 252 | // the code is RETHROW, this ensures that a compile time error results,  | 
|---|
| 253 | // if this lambda_functor is used outside a delayed catch_expression | 
|---|
| 254 | inline const  | 
|---|
| 255 | lambda_functor<  | 
|---|
| 256 |   lambda_functor_base<  | 
|---|
| 257 |     action<0, throw_action<rethrow_action> >,  | 
|---|
| 258 |     null_type | 
|---|
| 259 |   >  | 
|---|
| 260 | > | 
|---|
| 261 | rethrow() {  | 
|---|
| 262 |   return  | 
|---|
| 263 |       lambda_functor_base<  | 
|---|
| 264 |         action<0, throw_action<rethrow_action> >, | 
|---|
| 265 |         null_type | 
|---|
| 266 |       >  | 
|---|
| 267 |     ( null_type() ); | 
|---|
| 268 | } | 
|---|
| 269 |  | 
|---|
| 270 | template <class Arg1> | 
|---|
| 271 | inline const  | 
|---|
| 272 | lambda_functor< | 
|---|
| 273 |   lambda_functor_base<  | 
|---|
| 274 |     action<1, throw_action<throw_new_action> >,  | 
|---|
| 275 |     tuple<typename const_copy_argument<const Arg1>::type> | 
|---|
| 276 |   >  | 
|---|
| 277 | > | 
|---|
| 278 | throw_exception(const Arg1& a1) {  | 
|---|
| 279 |   return  | 
|---|
| 280 |       lambda_functor_base<  | 
|---|
| 281 |         action<1, throw_action<throw_new_action> >,  | 
|---|
| 282 |         tuple<typename const_copy_argument<const Arg1>::type> | 
|---|
| 283 |       >  | 
|---|
| 284 |     ( tuple<typename const_copy_argument<const Arg1>::type>(a1)); | 
|---|
| 285 | } | 
|---|
| 286 |  | 
|---|
| 287 | // create catch blocks | 
|---|
| 288 | template <class CatchType, class Arg> | 
|---|
| 289 | inline const  | 
|---|
| 290 | tagged_lambda_functor< | 
|---|
| 291 |   detail::exception_catch_tag<detail::catch_block<CatchType> >,  | 
|---|
| 292 |   lambda_functor<Arg>  | 
|---|
| 293 | >  | 
|---|
| 294 | catch_exception(const lambda_functor<Arg>& a) {  | 
|---|
| 295 |   // the third placeholder cannot be used in catch_exception | 
|---|
| 296 |   //    BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value)); | 
|---|
| 297 |   return  | 
|---|
| 298 |     tagged_lambda_functor< | 
|---|
| 299 |       detail::exception_catch_tag<detail::catch_block<CatchType> >,  | 
|---|
| 300 |       lambda_functor<Arg>  | 
|---|
| 301 |     > (a); | 
|---|
| 302 | } | 
|---|
| 303 |  | 
|---|
| 304 | // catch and do nothing case. | 
|---|
| 305 | template <class CatchType> | 
|---|
| 306 | inline const  | 
|---|
| 307 | tagged_lambda_functor< | 
|---|
| 308 |   detail::exception_catch_tag<detail::catch_block<CatchType> >,  | 
|---|
| 309 |   lambda_functor< | 
|---|
| 310 |     lambda_functor_base< | 
|---|
| 311 |       do_nothing_action, | 
|---|
| 312 |       null_type | 
|---|
| 313 |     >  | 
|---|
| 314 |   > | 
|---|
| 315 | > | 
|---|
| 316 | catch_exception() {  | 
|---|
| 317 |   return  | 
|---|
| 318 |     tagged_lambda_functor< | 
|---|
| 319 |       detail::exception_catch_tag<detail::catch_block<CatchType> >,  | 
|---|
| 320 |       lambda_functor< | 
|---|
| 321 |         lambda_functor_base< | 
|---|
| 322 |           do_nothing_action, | 
|---|
| 323 |           null_type | 
|---|
| 324 |         >  | 
|---|
| 325 |       > | 
|---|
| 326 |     > (); | 
|---|
| 327 | } | 
|---|
| 328 |  | 
|---|
| 329 | // create catch(...) blocks | 
|---|
| 330 | template <class Arg> | 
|---|
| 331 | inline const  | 
|---|
| 332 | tagged_lambda_functor< | 
|---|
| 333 |   detail::exception_catch_tag<detail::catch_all_block>,  | 
|---|
| 334 |   lambda_functor<Arg>  | 
|---|
| 335 | >  | 
|---|
| 336 | catch_all(const lambda_functor<Arg>& a) {  | 
|---|
| 337 |   // the third placeholder cannot be used in catch_exception | 
|---|
| 338 |   BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value)); | 
|---|
| 339 |   return  | 
|---|
| 340 |     tagged_lambda_functor< | 
|---|
| 341 |       detail::exception_catch_tag<detail::catch_all_block>,  | 
|---|
| 342 |       lambda_functor<Arg>  | 
|---|
| 343 |     > (a); | 
|---|
| 344 | } | 
|---|
| 345 |  | 
|---|
| 346 | // catch(...) and do nothing case. | 
|---|
| 347 | inline const  | 
|---|
| 348 | tagged_lambda_functor< | 
|---|
| 349 |   detail::exception_catch_tag<detail::catch_all_block>,  | 
|---|
| 350 |   lambda_functor< | 
|---|
| 351 |     lambda_functor_base< | 
|---|
| 352 |       do_nothing_action, | 
|---|
| 353 |       null_type | 
|---|
| 354 |     >  | 
|---|
| 355 |   > | 
|---|
| 356 | > | 
|---|
| 357 | catch_all() {  | 
|---|
| 358 |   return  | 
|---|
| 359 |     tagged_lambda_functor< | 
|---|
| 360 |       detail::exception_catch_tag<detail::catch_all_block>,  | 
|---|
| 361 |       lambda_functor< | 
|---|
| 362 |         lambda_functor_base< | 
|---|
| 363 |           do_nothing_action, | 
|---|
| 364 |           null_type | 
|---|
| 365 |         >  | 
|---|
| 366 |       >  | 
|---|
| 367 |     > (); | 
|---|
| 368 | } | 
|---|
| 369 |  | 
|---|
| 370 | // try_catch functions -------------------------------- | 
|---|
| 371 | // The second -> N argument(s) are must be catch lambda_functors  | 
|---|
| 372 | template <class TryArg, class Catch1, class LF1> | 
|---|
| 373 | inline const  | 
|---|
| 374 | lambda_functor<  | 
|---|
| 375 |   lambda_functor_base<  | 
|---|
| 376 |     action<2, try_catch_action<catch_action<Catch1> > >,  | 
|---|
| 377 |     tuple<lambda_functor<TryArg>, LF1> | 
|---|
| 378 |   >  | 
|---|
| 379 | > | 
|---|
| 380 | try_catch( | 
|---|
| 381 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 382 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch1>, LF1>& a2)  | 
|---|
| 383 | {  | 
|---|
| 384 |   return  | 
|---|
| 385 |     lambda_functor_base<  | 
|---|
| 386 |       action<2, try_catch_action<catch_action<Catch1> > >,  | 
|---|
| 387 |       tuple<lambda_functor<TryArg>, LF1> | 
|---|
| 388 |     >  | 
|---|
| 389 |     ( tuple< lambda_functor<TryArg>, LF1>(a1, a2)); | 
|---|
| 390 | } | 
|---|
| 391 |  | 
|---|
| 392 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 393 |                         class Catch2, class LF2> | 
|---|
| 394 | inline const  | 
|---|
| 395 |   lambda_functor<  | 
|---|
| 396 |     lambda_functor_base<  | 
|---|
| 397 |       action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >,  | 
|---|
| 398 |       tuple<lambda_functor<TryArg>, LF1, LF2> | 
|---|
| 399 |     >  | 
|---|
| 400 | > | 
|---|
| 401 | try_catch( | 
|---|
| 402 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 403 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 404 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch2>, LF2>& a3)  | 
|---|
| 405 | {  | 
|---|
| 406 |   return  | 
|---|
| 407 |     lambda_functor_base< | 
|---|
| 408 |       action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >,  | 
|---|
| 409 |       tuple<lambda_functor<TryArg>, LF1, LF2> | 
|---|
| 410 |     >  | 
|---|
| 411 |     ( tuple<lambda_functor<TryArg>, LF1, LF2>(a1, a2, a3)); | 
|---|
| 412 | } | 
|---|
| 413 |  | 
|---|
| 414 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 415 |                         class Catch2, class LF2,  | 
|---|
| 416 |                         class Catch3, class LF3> | 
|---|
| 417 | inline const lambda_functor<  | 
|---|
| 418 |   lambda_functor_base<  | 
|---|
| 419 |     action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >,  | 
|---|
| 420 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3> | 
|---|
| 421 |   >  | 
|---|
| 422 | > | 
|---|
| 423 | try_catch( | 
|---|
| 424 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 425 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 426 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 427 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch3>, LF3>& a4)  | 
|---|
| 428 | {  | 
|---|
| 429 |   return  | 
|---|
| 430 |       lambda_functor_base<  | 
|---|
| 431 |         action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >,  | 
|---|
| 432 |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3> | 
|---|
| 433 |       >  | 
|---|
| 434 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3>(a1, a2, a3, a4)); | 
|---|
| 435 | } | 
|---|
| 436 |  | 
|---|
| 437 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 438 |                         class Catch2, class LF2,  | 
|---|
| 439 |                         class Catch3, class LF3,  | 
|---|
| 440 |                         class Catch4, class LF4> | 
|---|
| 441 | inline const  | 
|---|
| 442 | lambda_functor<  | 
|---|
| 443 |   lambda_functor_base<  | 
|---|
| 444 |     action< | 
|---|
| 445 |       5,  | 
|---|
| 446 |       try_catch_action< | 
|---|
| 447 |         catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4>  | 
|---|
| 448 |       >  | 
|---|
| 449 |     >,  | 
|---|
| 450 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4>  | 
|---|
| 451 |   >  | 
|---|
| 452 | > | 
|---|
| 453 | try_catch( | 
|---|
| 454 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 455 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 456 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 457 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 458 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch4>, LF4>& a5)  | 
|---|
| 459 | {  | 
|---|
| 460 |   return  | 
|---|
| 461 |       lambda_functor_base<  | 
|---|
| 462 |         action< | 
|---|
| 463 |           5,  | 
|---|
| 464 |           try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4> >  | 
|---|
| 465 |         >,  | 
|---|
| 466 |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4> | 
|---|
| 467 |       >  | 
|---|
| 468 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4>(a1, a2, a3, a4, a5)); | 
|---|
| 469 | } | 
|---|
| 470 |  | 
|---|
| 471 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 472 |                         class Catch2, class LF2,  | 
|---|
| 473 |                         class Catch3, class LF3,  | 
|---|
| 474 |                         class Catch4, class LF4,  | 
|---|
| 475 |                         class Catch5, class LF5> | 
|---|
| 476 | inline const  | 
|---|
| 477 | lambda_functor<  | 
|---|
| 478 |   lambda_functor_base<  | 
|---|
| 479 |     action< | 
|---|
| 480 |       6,  | 
|---|
| 481 |       try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5> > | 
|---|
| 482 |     >,  | 
|---|
| 483 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | 
|---|
| 484 |   >  | 
|---|
| 485 | > | 
|---|
| 486 | try_catch( | 
|---|
| 487 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 488 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 489 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 490 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 491 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | 
|---|
| 492 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch5>, LF5>& a6)  | 
|---|
| 493 | {  | 
|---|
| 494 |   return  | 
|---|
| 495 |       lambda_functor_base<  | 
|---|
| 496 |          action< | 
|---|
| 497 |            6,  | 
|---|
| 498 |            try_catch_action< | 
|---|
| 499 |              catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5>  | 
|---|
| 500 |            >  | 
|---|
| 501 |          >,  | 
|---|
| 502 |          tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | 
|---|
| 503 |       >  | 
|---|
| 504 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> | 
|---|
| 505 |         (a1, a2, a3, a4, a5, a6) | 
|---|
| 506 |     ); | 
|---|
| 507 | } | 
|---|
| 508 |  | 
|---|
| 509 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 510 |                         class Catch2, class LF2,  | 
|---|
| 511 |                         class Catch3, class LF3,  | 
|---|
| 512 |                         class Catch4, class LF4,  | 
|---|
| 513 |                         class Catch5, class LF5,  | 
|---|
| 514 |                         class Catch6, class LF6> | 
|---|
| 515 | inline const  | 
|---|
| 516 | lambda_functor<  | 
|---|
| 517 |   lambda_functor_base<  | 
|---|
| 518 |     action< | 
|---|
| 519 |       7,  | 
|---|
| 520 |       try_catch_action< | 
|---|
| 521 |         catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, Catch6>  | 
|---|
| 522 |       >  | 
|---|
| 523 |     >,  | 
|---|
| 524 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | 
|---|
| 525 |   >  | 
|---|
| 526 | > | 
|---|
| 527 | try_catch( | 
|---|
| 528 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 529 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 530 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 531 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 532 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | 
|---|
| 533 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | 
|---|
| 534 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch6>, LF6>& a7)  | 
|---|
| 535 | {  | 
|---|
| 536 |   return  | 
|---|
| 537 |       lambda_functor_base<  | 
|---|
| 538 |         action< | 
|---|
| 539 |           7,  | 
|---|
| 540 |           try_catch_action< | 
|---|
| 541 |             catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>,Catch6>  | 
|---|
| 542 |           >  | 
|---|
| 543 |         >,  | 
|---|
| 544 |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | 
|---|
| 545 |       >  | 
|---|
| 546 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> | 
|---|
| 547 |         (a1, a2, a3, a4, a5, a6, a7)); | 
|---|
| 548 | } | 
|---|
| 549 |  | 
|---|
| 550 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 551 |                         class Catch2, class LF2,  | 
|---|
| 552 |                         class Catch3, class LF3,  | 
|---|
| 553 |                         class Catch4, class LF4,  | 
|---|
| 554 |                         class Catch5, class LF5,  | 
|---|
| 555 |                         class Catch6, class LF6, | 
|---|
| 556 |                         class Catch7, class LF7> | 
|---|
| 557 | inline const  | 
|---|
| 558 | lambda_functor<  | 
|---|
| 559 |   lambda_functor_base<  | 
|---|
| 560 |     action< | 
|---|
| 561 |       8,  | 
|---|
| 562 |       try_catch_action< | 
|---|
| 563 |         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>  | 
|---|
| 564 |       >  | 
|---|
| 565 |     >,  | 
|---|
| 566 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | 
|---|
| 567 |   >  | 
|---|
| 568 | > | 
|---|
| 569 | try_catch( | 
|---|
| 570 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 571 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 572 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 573 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 574 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | 
|---|
| 575 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | 
|---|
| 576 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | 
|---|
| 577 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch7>, LF7>& a8)  | 
|---|
| 578 | {  | 
|---|
| 579 |   return  | 
|---|
| 580 |       lambda_functor_base<  | 
|---|
| 581 |         action< | 
|---|
| 582 |           8,  | 
|---|
| 583 |           try_catch_action< | 
|---|
| 584 |             catch_action< | 
|---|
| 585 |               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 | 
|---|
| 586 |             >  | 
|---|
| 587 |           >  | 
|---|
| 588 |         >,  | 
|---|
| 589 |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | 
|---|
| 590 |       >  | 
|---|
| 591 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> | 
|---|
| 592 |         (a1, a2, a3, a4, a5, a6, a7, a8)); | 
|---|
| 593 | } | 
|---|
| 594 |  | 
|---|
| 595 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 596 |                         class Catch2, class LF2,  | 
|---|
| 597 |                         class Catch3, class LF3,  | 
|---|
| 598 |                         class Catch4, class LF4,  | 
|---|
| 599 |                         class Catch5, class LF5,  | 
|---|
| 600 |                         class Catch6, class LF6,  | 
|---|
| 601 |                         class Catch7, class LF7,  | 
|---|
| 602 |                         class Catch8, class LF8> | 
|---|
| 603 | inline const  | 
|---|
| 604 | lambda_functor<  | 
|---|
| 605 |   lambda_functor_base<  | 
|---|
| 606 |     action< | 
|---|
| 607 |       9,  | 
|---|
| 608 |       try_catch_action< | 
|---|
| 609 |         catch_action< | 
|---|
| 610 |           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 | 
|---|
| 611 |         >  | 
|---|
| 612 |       >  | 
|---|
| 613 |     >,  | 
|---|
| 614 |     tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> | 
|---|
| 615 |   >  | 
|---|
| 616 | > | 
|---|
| 617 | try_catch( | 
|---|
| 618 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 619 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 620 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 621 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 622 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | 
|---|
| 623 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | 
|---|
| 624 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | 
|---|
| 625 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, | 
|---|
| 626 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch8>, LF8>& a9)  | 
|---|
| 627 | {  | 
|---|
| 628 |   return  | 
|---|
| 629 |       lambda_functor_base<  | 
|---|
| 630 |         action< | 
|---|
| 631 |           9, | 
|---|
| 632 |           try_catch_action< | 
|---|
| 633 |             catch_action< | 
|---|
| 634 |               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 | 
|---|
| 635 |             >  | 
|---|
| 636 |           >  | 
|---|
| 637 |         >,  | 
|---|
| 638 |         tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8>  | 
|---|
| 639 |       >  | 
|---|
| 640 |     ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> | 
|---|
| 641 |         (a1, a2, a3, a4, a5, a6, a7, a8, a9)); | 
|---|
| 642 | } | 
|---|
| 643 |  | 
|---|
| 644 | template <class TryArg, class Catch1, class LF1,  | 
|---|
| 645 |                         class Catch2, class LF2,  | 
|---|
| 646 |                         class Catch3, class LF3,  | 
|---|
| 647 |                         class Catch4, class LF4,  | 
|---|
| 648 |                         class Catch5, class LF5,  | 
|---|
| 649 |                         class Catch6, class LF6,  | 
|---|
| 650 |                         class Catch7, class LF7,  | 
|---|
| 651 |                         class Catch8, class LF8,  | 
|---|
| 652 |                         class Catch9, class LF9> | 
|---|
| 653 | inline const  | 
|---|
| 654 |   lambda_functor<  | 
|---|
| 655 |     lambda_functor_base<  | 
|---|
| 656 |       action<  | 
|---|
| 657 |         10,  | 
|---|
| 658 |         try_catch_action< | 
|---|
| 659 |           catch_action< | 
|---|
| 660 |              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>,  | 
|---|
| 661 |              Catch9 | 
|---|
| 662 |           >  | 
|---|
| 663 |         >  | 
|---|
| 664 |       >,  | 
|---|
| 665 |       tuple< | 
|---|
| 666 |         lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | 
|---|
| 667 |       > | 
|---|
| 668 |     >  | 
|---|
| 669 |   > | 
|---|
| 670 | try_catch( | 
|---|
| 671 |   const lambda_functor<TryArg>& a1,  | 
|---|
| 672 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, | 
|---|
| 673 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, | 
|---|
| 674 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, | 
|---|
| 675 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, | 
|---|
| 676 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, | 
|---|
| 677 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, | 
|---|
| 678 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, | 
|---|
| 679 |   const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch8> >, LF8>& a9, | 
|---|
| 680 |   const tagged_lambda_functor<detail::exception_catch_tag<Catch9>, LF9>& a10)  | 
|---|
| 681 | {  | 
|---|
| 682 |   return  | 
|---|
| 683 |       lambda_functor_base<  | 
|---|
| 684 |         action< | 
|---|
| 685 |           10,  | 
|---|
| 686 |           try_catch_action<  | 
|---|
| 687 |             catch_action< | 
|---|
| 688 |               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>,  | 
|---|
| 689 |               Catch9 | 
|---|
| 690 |             >  | 
|---|
| 691 |           >  | 
|---|
| 692 |         >,  | 
|---|
| 693 |         tuple< | 
|---|
| 694 |           lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | 
|---|
| 695 |         > | 
|---|
| 696 |       >  | 
|---|
| 697 |     ( tuple< | 
|---|
| 698 |         lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 | 
|---|
| 699 |       >(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); | 
|---|
| 700 | } | 
|---|
| 701 |  | 
|---|
| 702 |  | 
|---|
| 703 | // --------------------------------------------------------------------------- | 
|---|
| 704 | // Specializations for lambda_functor_base of try_catch ---------------------- | 
|---|
| 705 |  | 
|---|
| 706 | // 1 catch type case | 
|---|
| 707 |  | 
|---|
| 708 | template<class Args, class Catch1> | 
|---|
| 709 | class lambda_functor_base< | 
|---|
| 710 |   action<2, try_catch_action<catch_action<detail::catch_block<Catch1> > > >,  | 
|---|
| 711 |   Args | 
|---|
| 712 | >  | 
|---|
| 713 | { | 
|---|
| 714 | public: | 
|---|
| 715 |   Args args; | 
|---|
| 716 | public: | 
|---|
| 717 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 718 |  | 
|---|
| 719 | // the return type of try_catch is the return type of the try lambda_functor | 
|---|
| 720 | // (the return types of try and catch parts must match unless try returns void | 
|---|
| 721 | // or the catch part throws for sure) | 
|---|
| 722 |  | 
|---|
| 723 |   template <class SigArgs> struct sig { | 
|---|
| 724 |     typedef typename  | 
|---|
| 725 |       as_lambda_functor< | 
|---|
| 726 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 727 |       >::type lf_type; | 
|---|
| 728 |  | 
|---|
| 729 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 730 |   }; | 
|---|
| 731 |  | 
|---|
| 732 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 733 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 734 |     try  | 
|---|
| 735 |     { | 
|---|
| 736 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); | 
|---|
| 737 |     } | 
|---|
| 738 |     catch (Catch1& e) | 
|---|
| 739 |     {                 | 
|---|
| 740 |       return  | 
|---|
| 741 |        detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 742 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 743 |     } | 
|---|
| 744 |   } | 
|---|
| 745 | }; | 
|---|
| 746 |  | 
|---|
| 747 |  | 
|---|
| 748 |  | 
|---|
| 749 | template<class Args> | 
|---|
| 750 | class lambda_functor_base<action<2, try_catch_action<catch_action<detail::catch_all_block> > >, Args> { | 
|---|
| 751 | public: | 
|---|
| 752 |   Args args; | 
|---|
| 753 | public: | 
|---|
| 754 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 755 |  | 
|---|
| 756 |   template <class SigArgs> struct sig { | 
|---|
| 757 |     typedef typename  | 
|---|
| 758 |       as_lambda_functor< | 
|---|
| 759 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 760 |       >::type lf_type; | 
|---|
| 761 |  | 
|---|
| 762 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 763 |   }; | 
|---|
| 764 |  | 
|---|
| 765 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 766 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 767 |     try  | 
|---|
| 768 |     { | 
|---|
| 769 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 770 |     } | 
|---|
| 771 |     catch (...) | 
|---|
| 772 |     {                 | 
|---|
| 773 |       return  | 
|---|
| 774 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 775 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS); | 
|---|
| 776 |     } | 
|---|
| 777 |   } | 
|---|
| 778 | }; | 
|---|
| 779 |  | 
|---|
| 780 |  | 
|---|
| 781 | // 2 catch types case | 
|---|
| 782 | template<class Args, class Catch1, class Catch2> | 
|---|
| 783 | class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2> > > >, Args> { | 
|---|
| 784 | public: | 
|---|
| 785 |   Args args; | 
|---|
| 786 | public: | 
|---|
| 787 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 788 |  | 
|---|
| 789 |   template <class SigArgs> struct sig { | 
|---|
| 790 |     typedef typename  | 
|---|
| 791 |       as_lambda_functor< | 
|---|
| 792 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 793 |       >::type lf_type; | 
|---|
| 794 |  | 
|---|
| 795 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 796 |   }; | 
|---|
| 797 |  | 
|---|
| 798 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 799 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 800 |     try  | 
|---|
| 801 |     { | 
|---|
| 802 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 803 |     } | 
|---|
| 804 |     catch (Catch1& e) | 
|---|
| 805 |     {  | 
|---|
| 806 |       return  | 
|---|
| 807 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 808 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 809 |     } | 
|---|
| 810 |     catch (Catch2& e) | 
|---|
| 811 |     {           | 
|---|
| 812 |       return  | 
|---|
| 813 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 814 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 815 |     } | 
|---|
| 816 |   } | 
|---|
| 817 | }; | 
|---|
| 818 |  | 
|---|
| 819 | template<class Args, class Catch1> | 
|---|
| 820 | class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>,detail::catch_all_block> > >, Args> { | 
|---|
| 821 | public: | 
|---|
| 822 |   Args args; | 
|---|
| 823 | public: | 
|---|
| 824 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 825 |  | 
|---|
| 826 |   template <class SigArgs> struct sig { | 
|---|
| 827 |     typedef typename  | 
|---|
| 828 |       as_lambda_functor< | 
|---|
| 829 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 830 |       >::type lf_type; | 
|---|
| 831 |  | 
|---|
| 832 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 833 |   }; | 
|---|
| 834 |  | 
|---|
| 835 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 836 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 837 |     try  | 
|---|
| 838 |     { | 
|---|
| 839 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 840 |     } | 
|---|
| 841 |     catch (Catch1& e) | 
|---|
| 842 |     {                 | 
|---|
| 843 |       return  | 
|---|
| 844 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 845 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 846 |     } | 
|---|
| 847 |     catch (...) | 
|---|
| 848 |     {                 | 
|---|
| 849 |       return  | 
|---|
| 850 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 851 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS); | 
|---|
| 852 |     } | 
|---|
| 853 |   } | 
|---|
| 854 | }; | 
|---|
| 855 |  | 
|---|
| 856 | // 3 catch types case | 
|---|
| 857 | template<class Args, class Catch1, class Catch2, class Catch3> | 
|---|
| 858 | class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3> > > >, Args> { | 
|---|
| 859 | public: | 
|---|
| 860 |   Args args; | 
|---|
| 861 | public: | 
|---|
| 862 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 863 |  | 
|---|
| 864 |   template <class SigArgs> struct sig { | 
|---|
| 865 |     typedef typename  | 
|---|
| 866 |       as_lambda_functor< | 
|---|
| 867 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 868 |       >::type lf_type; | 
|---|
| 869 |  | 
|---|
| 870 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 871 |   }; | 
|---|
| 872 |  | 
|---|
| 873 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 874 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 875 |     try  | 
|---|
| 876 |     { | 
|---|
| 877 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 878 |     } | 
|---|
| 879 |     catch (Catch1& e) | 
|---|
| 880 |     {                 | 
|---|
| 881 |       return  | 
|---|
| 882 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 883 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 884 |  | 
|---|
| 885 |     } | 
|---|
| 886 |     catch (Catch2& e) | 
|---|
| 887 |     {                 | 
|---|
| 888 |       return  | 
|---|
| 889 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 890 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 891 |  | 
|---|
| 892 |     } | 
|---|
| 893 |     catch (Catch3& e) | 
|---|
| 894 |     { | 
|---|
| 895 |       return  | 
|---|
| 896 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 897 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 898 |     } | 
|---|
| 899 |   } | 
|---|
| 900 | }; | 
|---|
| 901 |  | 
|---|
| 902 | template<class Args, class Catch1, class Catch2> | 
|---|
| 903 | class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>,detail::catch_all_block> > >, Args> { | 
|---|
| 904 | public: | 
|---|
| 905 |   Args args; | 
|---|
| 906 | public: | 
|---|
| 907 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 908 |  | 
|---|
| 909 |   template <class SigArgs> struct sig { | 
|---|
| 910 |     typedef typename  | 
|---|
| 911 |       as_lambda_functor< | 
|---|
| 912 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 913 |       >::type lf_type; | 
|---|
| 914 |  | 
|---|
| 915 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 916 |   }; | 
|---|
| 917 |  | 
|---|
| 918 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 919 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 920 |     try  | 
|---|
| 921 |     { | 
|---|
| 922 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 923 |     } | 
|---|
| 924 |     catch (Catch1& e) | 
|---|
| 925 |     {                 | 
|---|
| 926 |       return  | 
|---|
| 927 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 928 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 929 |     } | 
|---|
| 930 |     catch (Catch2& e) | 
|---|
| 931 |     {                 | 
|---|
| 932 |       return  | 
|---|
| 933 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 934 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 935 |     } | 
|---|
| 936 |     catch (...) | 
|---|
| 937 |     {                 | 
|---|
| 938 |       return  | 
|---|
| 939 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 940 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS); | 
|---|
| 941 |     } | 
|---|
| 942 |   } | 
|---|
| 943 | }; | 
|---|
| 944 |  | 
|---|
| 945 | // 4 catch types case | 
|---|
| 946 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> | 
|---|
| 947 | 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> { | 
|---|
| 948 | public: | 
|---|
| 949 |   Args args; | 
|---|
| 950 | public: | 
|---|
| 951 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 952 |  | 
|---|
| 953 |   template <class SigArgs> struct sig { | 
|---|
| 954 |     typedef typename  | 
|---|
| 955 |       as_lambda_functor< | 
|---|
| 956 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 957 |       >::type lf_type; | 
|---|
| 958 |  | 
|---|
| 959 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 960 |   }; | 
|---|
| 961 |  | 
|---|
| 962 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 963 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 964 |     try  | 
|---|
| 965 |     { | 
|---|
| 966 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 967 |     } | 
|---|
| 968 |     catch (Catch1& e) | 
|---|
| 969 |     {                 | 
|---|
| 970 |       return  | 
|---|
| 971 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 972 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 973 |     } | 
|---|
| 974 |     catch (Catch2& e)  | 
|---|
| 975 |     {                 | 
|---|
| 976 |       return  | 
|---|
| 977 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 978 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 979 |     } | 
|---|
| 980 |     catch (Catch3& e) | 
|---|
| 981 |     { | 
|---|
| 982 |       return  | 
|---|
| 983 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 984 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 985 |     } | 
|---|
| 986 |     catch (Catch4& e) | 
|---|
| 987 |     { | 
|---|
| 988 |       return  | 
|---|
| 989 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 990 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 991 |     } | 
|---|
| 992 |   } | 
|---|
| 993 | }; | 
|---|
| 994 |  | 
|---|
| 995 | template<class Args, class Catch1, class Catch2, class Catch3> | 
|---|
| 996 | 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> { | 
|---|
| 997 | public: | 
|---|
| 998 |   Args args; | 
|---|
| 999 | public: | 
|---|
| 1000 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1001 |  | 
|---|
| 1002 |   template <class SigArgs> struct sig { | 
|---|
| 1003 |     typedef typename  | 
|---|
| 1004 |       as_lambda_functor< | 
|---|
| 1005 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1006 |       >::type lf_type; | 
|---|
| 1007 |  | 
|---|
| 1008 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1009 |   }; | 
|---|
| 1010 |  | 
|---|
| 1011 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1012 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1013 |     try  | 
|---|
| 1014 |     { | 
|---|
| 1015 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1016 |     } | 
|---|
| 1017 |     catch (Catch1& e) | 
|---|
| 1018 |     {                 | 
|---|
| 1019 |       return  | 
|---|
| 1020 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1021 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1022 |     } | 
|---|
| 1023 |     catch (Catch2& e)  | 
|---|
| 1024 |     {                 | 
|---|
| 1025 |       return  | 
|---|
| 1026 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1027 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1028 |     } | 
|---|
| 1029 |     catch (Catch3& e) | 
|---|
| 1030 |     { | 
|---|
| 1031 |       return  | 
|---|
| 1032 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1033 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1034 |     } | 
|---|
| 1035 |     catch (...) | 
|---|
| 1036 |     { | 
|---|
| 1037 |       return  | 
|---|
| 1038 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1039 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1040 |     } | 
|---|
| 1041 |   } | 
|---|
| 1042 | }; | 
|---|
| 1043 |  | 
|---|
| 1044 | // 5 catch types case | 
|---|
| 1045 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> | 
|---|
| 1046 | 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> { | 
|---|
| 1047 | public: | 
|---|
| 1048 |   Args args; | 
|---|
| 1049 | public: | 
|---|
| 1050 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1051 |  | 
|---|
| 1052 |   template <class SigArgs> struct sig { | 
|---|
| 1053 |     typedef typename  | 
|---|
| 1054 |       as_lambda_functor< | 
|---|
| 1055 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1056 |       >::type lf_type; | 
|---|
| 1057 |  | 
|---|
| 1058 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1059 |   }; | 
|---|
| 1060 |  | 
|---|
| 1061 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1062 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1063 |     try  | 
|---|
| 1064 |     { | 
|---|
| 1065 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1066 |     } | 
|---|
| 1067 |     catch (Catch1& e) | 
|---|
| 1068 |     {                 | 
|---|
| 1069 |       return  | 
|---|
| 1070 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1071 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1072 |     } | 
|---|
| 1073 |     catch (Catch2& e)  | 
|---|
| 1074 |     {                 | 
|---|
| 1075 |       return  | 
|---|
| 1076 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1077 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1078 |     } | 
|---|
| 1079 |     catch (Catch3& e) | 
|---|
| 1080 |     { | 
|---|
| 1081 |       return  | 
|---|
| 1082 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1083 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1084 |     } | 
|---|
| 1085 |     catch (Catch4& e) | 
|---|
| 1086 |     { | 
|---|
| 1087 |       return  | 
|---|
| 1088 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1089 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1090 |     } | 
|---|
| 1091 |     catch (Catch5& e) | 
|---|
| 1092 |     { | 
|---|
| 1093 |       return  | 
|---|
| 1094 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1095 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1096 |     } | 
|---|
| 1097 |   } | 
|---|
| 1098 | }; | 
|---|
| 1099 |  | 
|---|
| 1100 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> | 
|---|
| 1101 | 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> { | 
|---|
| 1102 | public: | 
|---|
| 1103 |   Args args; | 
|---|
| 1104 | public: | 
|---|
| 1105 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1106 |  | 
|---|
| 1107 |   template <class SigArgs> struct sig { | 
|---|
| 1108 |     typedef typename  | 
|---|
| 1109 |       as_lambda_functor< | 
|---|
| 1110 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1111 |       >::type lf_type; | 
|---|
| 1112 |  | 
|---|
| 1113 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1114 |   }; | 
|---|
| 1115 |  | 
|---|
| 1116 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1117 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1118 |     try  | 
|---|
| 1119 |     { | 
|---|
| 1120 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1121 |     } | 
|---|
| 1122 |     catch (Catch1& e) | 
|---|
| 1123 |     {                 | 
|---|
| 1124 |       return  | 
|---|
| 1125 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1126 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1127 |     } | 
|---|
| 1128 |     catch (Catch2& e)  | 
|---|
| 1129 |     {                 | 
|---|
| 1130 |       return  | 
|---|
| 1131 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1132 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1133 |     } | 
|---|
| 1134 |     catch (Catch3& e) | 
|---|
| 1135 |     { | 
|---|
| 1136 |       return  | 
|---|
| 1137 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1138 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1139 |     } | 
|---|
| 1140 |     catch (Catch4& e) | 
|---|
| 1141 |     { | 
|---|
| 1142 |       return  | 
|---|
| 1143 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1144 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1145 |     } | 
|---|
| 1146 |     catch (...) | 
|---|
| 1147 |     { | 
|---|
| 1148 |       return  | 
|---|
| 1149 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1150 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1151 |     } | 
|---|
| 1152 |   } | 
|---|
| 1153 | }; | 
|---|
| 1154 |  | 
|---|
| 1155 | // 6 catch types case | 
|---|
| 1156 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> | 
|---|
| 1157 | 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> { | 
|---|
| 1158 | public: | 
|---|
| 1159 |   Args args; | 
|---|
| 1160 | public: | 
|---|
| 1161 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1162 |  | 
|---|
| 1163 |   template <class SigArgs> struct sig { | 
|---|
| 1164 |     typedef typename  | 
|---|
| 1165 |       as_lambda_functor< | 
|---|
| 1166 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1167 |       >::type lf_type; | 
|---|
| 1168 |  | 
|---|
| 1169 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1170 |   }; | 
|---|
| 1171 |  | 
|---|
| 1172 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1173 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1174 |     try  | 
|---|
| 1175 |     { | 
|---|
| 1176 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1177 |     } | 
|---|
| 1178 |     catch (Catch1& e) | 
|---|
| 1179 |     {                 | 
|---|
| 1180 |       return  | 
|---|
| 1181 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1182 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1183 |     } | 
|---|
| 1184 |     catch (Catch2& e)  | 
|---|
| 1185 |     {                 | 
|---|
| 1186 |       return  | 
|---|
| 1187 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1188 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1189 |     } | 
|---|
| 1190 |     catch (Catch3& e) | 
|---|
| 1191 |     { | 
|---|
| 1192 |       return  | 
|---|
| 1193 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1194 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1195 |     } | 
|---|
| 1196 |     catch (Catch4& e) | 
|---|
| 1197 |     { | 
|---|
| 1198 |       return  | 
|---|
| 1199 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1200 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1201 |     } | 
|---|
| 1202 |     catch (Catch5& e) | 
|---|
| 1203 |     { | 
|---|
| 1204 |       return  | 
|---|
| 1205 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1206 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1207 |     } | 
|---|
| 1208 |     catch (Catch6& e) | 
|---|
| 1209 |     { | 
|---|
| 1210 |       return  | 
|---|
| 1211 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1212 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1213 |     } | 
|---|
| 1214 |   } | 
|---|
| 1215 | }; | 
|---|
| 1216 |  | 
|---|
| 1217 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> | 
|---|
| 1218 | 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> { | 
|---|
| 1219 | public: | 
|---|
| 1220 |   Args args; | 
|---|
| 1221 | public: | 
|---|
| 1222 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1223 |  | 
|---|
| 1224 |   template <class SigArgs> struct sig { | 
|---|
| 1225 |     typedef typename  | 
|---|
| 1226 |       as_lambda_functor< | 
|---|
| 1227 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1228 |       >::type lf_type; | 
|---|
| 1229 |  | 
|---|
| 1230 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1231 |   }; | 
|---|
| 1232 |  | 
|---|
| 1233 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1234 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1235 |     try  | 
|---|
| 1236 |     { | 
|---|
| 1237 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1238 |     } | 
|---|
| 1239 |     catch (Catch1& e) | 
|---|
| 1240 |     {                 | 
|---|
| 1241 |       return  | 
|---|
| 1242 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1243 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1244 |     } | 
|---|
| 1245 |     catch (Catch2& e)  | 
|---|
| 1246 |     {                 | 
|---|
| 1247 |       return  | 
|---|
| 1248 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1249 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1250 |     } | 
|---|
| 1251 |     catch (Catch3& e) | 
|---|
| 1252 |     { | 
|---|
| 1253 |       return  | 
|---|
| 1254 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1255 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1256 |     } | 
|---|
| 1257 |     catch (Catch4& e) | 
|---|
| 1258 |     { | 
|---|
| 1259 |       return  | 
|---|
| 1260 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1261 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1262 |     } | 
|---|
| 1263 |     catch (Catch5& e) | 
|---|
| 1264 |     { | 
|---|
| 1265 |       return  | 
|---|
| 1266 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1267 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1268 |     } | 
|---|
| 1269 |     catch (...) | 
|---|
| 1270 |     { | 
|---|
| 1271 |       return  | 
|---|
| 1272 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1273 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1274 |     } | 
|---|
| 1275 |   } | 
|---|
| 1276 | }; | 
|---|
| 1277 |  | 
|---|
| 1278 | // 7 catch types case | 
|---|
| 1279 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | 
|---|
| 1280 |                      class Catch7> | 
|---|
| 1281 | 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> { | 
|---|
| 1282 | public: | 
|---|
| 1283 |   Args args; | 
|---|
| 1284 | public: | 
|---|
| 1285 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1286 |  | 
|---|
| 1287 |   template <class SigArgs> struct sig { | 
|---|
| 1288 |     typedef typename  | 
|---|
| 1289 |       as_lambda_functor< | 
|---|
| 1290 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1291 |       >::type lf_type; | 
|---|
| 1292 |  | 
|---|
| 1293 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1294 |   }; | 
|---|
| 1295 |  | 
|---|
| 1296 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1297 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1298 |     try  | 
|---|
| 1299 |     { | 
|---|
| 1300 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1301 |     } | 
|---|
| 1302 |     catch (Catch1& e) | 
|---|
| 1303 |     {                 | 
|---|
| 1304 |       return  | 
|---|
| 1305 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1306 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1307 |     } | 
|---|
| 1308 |     catch (Catch2& e)  | 
|---|
| 1309 |     {                 | 
|---|
| 1310 |       return  | 
|---|
| 1311 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1312 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1313 |     } | 
|---|
| 1314 |     catch (Catch3& e) | 
|---|
| 1315 |     { | 
|---|
| 1316 |       return  | 
|---|
| 1317 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1318 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1319 |     } | 
|---|
| 1320 |     catch (Catch4& e) | 
|---|
| 1321 |     { | 
|---|
| 1322 |       return  | 
|---|
| 1323 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1324 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1325 |     } | 
|---|
| 1326 |     catch (Catch5& e) | 
|---|
| 1327 |     { | 
|---|
| 1328 |       return  | 
|---|
| 1329 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1330 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1331 |     } | 
|---|
| 1332 |     catch (Catch6& e) | 
|---|
| 1333 |     { | 
|---|
| 1334 |       return  | 
|---|
| 1335 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1336 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1337 |     } | 
|---|
| 1338 |     catch (Catch7& e) | 
|---|
| 1339 |     { | 
|---|
| 1340 |       return  | 
|---|
| 1341 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1342 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1343 |     } | 
|---|
| 1344 |   } | 
|---|
| 1345 | }; | 
|---|
| 1346 |  | 
|---|
| 1347 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> | 
|---|
| 1348 | 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>, | 
|---|
| 1349 |                                                                detail::catch_all_block> > >, Args> { | 
|---|
| 1350 | public: | 
|---|
| 1351 |   Args args; | 
|---|
| 1352 | public: | 
|---|
| 1353 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1354 |  | 
|---|
| 1355 |   template <class SigArgs> struct sig { | 
|---|
| 1356 |     typedef typename  | 
|---|
| 1357 |       as_lambda_functor< | 
|---|
| 1358 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1359 |       >::type lf_type; | 
|---|
| 1360 |  | 
|---|
| 1361 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1362 |   }; | 
|---|
| 1363 |  | 
|---|
| 1364 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1365 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1366 |     try  | 
|---|
| 1367 |     { | 
|---|
| 1368 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1369 |     } | 
|---|
| 1370 |     catch (Catch1& e) | 
|---|
| 1371 |     {                 | 
|---|
| 1372 |       return  | 
|---|
| 1373 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1374 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1375 |     } | 
|---|
| 1376 |     catch (Catch2& e)  | 
|---|
| 1377 |     {                 | 
|---|
| 1378 |       return  | 
|---|
| 1379 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1380 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1381 |     } | 
|---|
| 1382 |     catch (Catch3& e) | 
|---|
| 1383 |     { | 
|---|
| 1384 |       return  | 
|---|
| 1385 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1386 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1387 |     } | 
|---|
| 1388 |     catch (Catch4& e) | 
|---|
| 1389 |     { | 
|---|
| 1390 |       return  | 
|---|
| 1391 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1392 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1393 |     } | 
|---|
| 1394 |     catch (Catch5& e) | 
|---|
| 1395 |     { | 
|---|
| 1396 |       return  | 
|---|
| 1397 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1398 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1399 |     } | 
|---|
| 1400 |     catch (Catch6& e) | 
|---|
| 1401 |     { | 
|---|
| 1402 |       return  | 
|---|
| 1403 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1404 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1405 |     } | 
|---|
| 1406 |     catch (...) | 
|---|
| 1407 |     { | 
|---|
| 1408 |       return  | 
|---|
| 1409 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1410 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1411 |     } | 
|---|
| 1412 |   } | 
|---|
| 1413 | }; | 
|---|
| 1414 |  | 
|---|
| 1415 | // 8 catch types case | 
|---|
| 1416 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | 
|---|
| 1417 |                      class Catch7, class Catch8> | 
|---|
| 1418 | 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>, | 
|---|
| 1419 |     detail::catch_block<Catch7>, detail::catch_block<Catch8> > > >, Args> { | 
|---|
| 1420 | public: | 
|---|
| 1421 |   Args args; | 
|---|
| 1422 | public: | 
|---|
| 1423 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1424 |  | 
|---|
| 1425 |   template <class SigArgs> struct sig { | 
|---|
| 1426 |     typedef typename  | 
|---|
| 1427 |       as_lambda_functor< | 
|---|
| 1428 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1429 |       >::type lf_type; | 
|---|
| 1430 |  | 
|---|
| 1431 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1432 |   }; | 
|---|
| 1433 |  | 
|---|
| 1434 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1435 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1436 |     try  | 
|---|
| 1437 |     { | 
|---|
| 1438 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1439 |     } | 
|---|
| 1440 |     catch (Catch1& e) | 
|---|
| 1441 |     {                 | 
|---|
| 1442 |       return  | 
|---|
| 1443 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1444 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1445 |     } | 
|---|
| 1446 |     catch (Catch2& e)  | 
|---|
| 1447 |     {                 | 
|---|
| 1448 |       return  | 
|---|
| 1449 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1450 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1451 |     } | 
|---|
| 1452 |     catch (Catch3& e) | 
|---|
| 1453 |     { | 
|---|
| 1454 |       return  | 
|---|
| 1455 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1456 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1457 |     } | 
|---|
| 1458 |     catch (Catch4& e) | 
|---|
| 1459 |     { | 
|---|
| 1460 |       return  | 
|---|
| 1461 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1462 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1463 |     } | 
|---|
| 1464 |     catch (Catch5& e) | 
|---|
| 1465 |     { | 
|---|
| 1466 |       return  | 
|---|
| 1467 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1468 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1469 |     } | 
|---|
| 1470 |     catch (Catch6& e) | 
|---|
| 1471 |     { | 
|---|
| 1472 |       return  | 
|---|
| 1473 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1474 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1475 |     } | 
|---|
| 1476 |     catch (Catch7& e) | 
|---|
| 1477 |     { | 
|---|
| 1478 |       return  | 
|---|
| 1479 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1480 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1481 |     } | 
|---|
| 1482 |     catch (Catch8& e) | 
|---|
| 1483 |     { | 
|---|
| 1484 |       return  | 
|---|
| 1485 |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | 
|---|
| 1486 |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1487 |     } | 
|---|
| 1488 |   } | 
|---|
| 1489 | }; | 
|---|
| 1490 |  | 
|---|
| 1491 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | 
|---|
| 1492 |                      class Catch7> | 
|---|
| 1493 | 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>, | 
|---|
| 1494 |     detail::catch_block<Catch7>,detail::catch_all_block> > >, Args> { | 
|---|
| 1495 | public: | 
|---|
| 1496 |   Args args; | 
|---|
| 1497 | public: | 
|---|
| 1498 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1499 |  | 
|---|
| 1500 |   template <class SigArgs> struct sig { | 
|---|
| 1501 |     typedef typename  | 
|---|
| 1502 |       as_lambda_functor< | 
|---|
| 1503 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1504 |       >::type lf_type; | 
|---|
| 1505 |  | 
|---|
| 1506 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1507 |   }; | 
|---|
| 1508 |  | 
|---|
| 1509 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1510 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1511 |     try  | 
|---|
| 1512 |     { | 
|---|
| 1513 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1514 |     } | 
|---|
| 1515 |     catch (Catch1& e) | 
|---|
| 1516 |     {                 | 
|---|
| 1517 |       return  | 
|---|
| 1518 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1519 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1520 |     } | 
|---|
| 1521 |     catch (Catch2& e)  | 
|---|
| 1522 |     {                 | 
|---|
| 1523 |       return  | 
|---|
| 1524 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1525 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1526 |     } | 
|---|
| 1527 |     catch (Catch3& e) | 
|---|
| 1528 |     { | 
|---|
| 1529 |       return  | 
|---|
| 1530 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1531 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1532 |     } | 
|---|
| 1533 |     catch (Catch4& e) | 
|---|
| 1534 |     { | 
|---|
| 1535 |       return  | 
|---|
| 1536 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1537 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1538 |     } | 
|---|
| 1539 |     catch (Catch5& e) | 
|---|
| 1540 |     { | 
|---|
| 1541 |       return  | 
|---|
| 1542 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1543 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1544 |     } | 
|---|
| 1545 |     catch (Catch6& e) | 
|---|
| 1546 |     { | 
|---|
| 1547 |       return  | 
|---|
| 1548 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1549 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1550 |     } | 
|---|
| 1551 |     catch (Catch7& e) | 
|---|
| 1552 |     { | 
|---|
| 1553 |       return  | 
|---|
| 1554 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1555 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1556 |     } | 
|---|
| 1557 |     catch (...) | 
|---|
| 1558 |     { | 
|---|
| 1559 |       return  | 
|---|
| 1560 |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | 
|---|
| 1561 |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1562 |     } | 
|---|
| 1563 |   } | 
|---|
| 1564 | }; | 
|---|
| 1565 |  | 
|---|
| 1566 | // 9 catch types case | 
|---|
| 1567 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | 
|---|
| 1568 |                      class Catch7, class Catch8, class Catch9> | 
|---|
| 1569 | 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>, | 
|---|
| 1570 |     detail::catch_block<Catch7>, detail::catch_block<Catch8>, detail::catch_block<Catch9> > > >, Args> { | 
|---|
| 1571 | public: | 
|---|
| 1572 |   Args args; | 
|---|
| 1573 | public: | 
|---|
| 1574 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1575 |  | 
|---|
| 1576 |   template <class SigArgs> struct sig { | 
|---|
| 1577 |     typedef typename  | 
|---|
| 1578 |       as_lambda_functor< | 
|---|
| 1579 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1580 |       >::type lf_type; | 
|---|
| 1581 |  | 
|---|
| 1582 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1583 |   }; | 
|---|
| 1584 |  | 
|---|
| 1585 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1586 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1587 |     try  | 
|---|
| 1588 |     { | 
|---|
| 1589 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1590 |     } | 
|---|
| 1591 |     catch (Catch1& e) | 
|---|
| 1592 |     {                 | 
|---|
| 1593 |       return  | 
|---|
| 1594 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1595 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1596 |     } | 
|---|
| 1597 |     catch (Catch2& e)  | 
|---|
| 1598 |     {                 | 
|---|
| 1599 |       return  | 
|---|
| 1600 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1601 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1602 |     } | 
|---|
| 1603 |     catch (Catch3& e) | 
|---|
| 1604 |     { | 
|---|
| 1605 |       return  | 
|---|
| 1606 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1607 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1608 |     } | 
|---|
| 1609 |     catch (Catch4& e) | 
|---|
| 1610 |     { | 
|---|
| 1611 |       return  | 
|---|
| 1612 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1613 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1614 |     } | 
|---|
| 1615 |     catch (Catch5& e) | 
|---|
| 1616 |     { | 
|---|
| 1617 |       return  | 
|---|
| 1618 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1619 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1620 |     } | 
|---|
| 1621 |     catch (Catch6& e) | 
|---|
| 1622 |     { | 
|---|
| 1623 |       return  | 
|---|
| 1624 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1625 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1626 |     } | 
|---|
| 1627 |     catch (Catch7& e) | 
|---|
| 1628 |     { | 
|---|
| 1629 |       return  | 
|---|
| 1630 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1631 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1632 |     } | 
|---|
| 1633 |     catch (Catch8& e) | 
|---|
| 1634 |     { | 
|---|
| 1635 |       return  | 
|---|
| 1636 |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | 
|---|
| 1637 |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1638 |     } | 
|---|
| 1639 |     catch (Catch9& e) | 
|---|
| 1640 |     { | 
|---|
| 1641 |       return  | 
|---|
| 1642 |         detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> | 
|---|
| 1643 |                ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1644 |     } | 
|---|
| 1645 |   } | 
|---|
| 1646 | }; | 
|---|
| 1647 |  | 
|---|
| 1648 | template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, | 
|---|
| 1649 |                      class Catch7, class Catch8> | 
|---|
| 1650 | 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>, | 
|---|
| 1651 |     detail::catch_block<Catch7>, detail::catch_block<Catch8>,detail::catch_all_block> > >, Args> { | 
|---|
| 1652 | public: | 
|---|
| 1653 |   Args args; | 
|---|
| 1654 | public: | 
|---|
| 1655 |   explicit lambda_functor_base(const Args& a) : args(a) {} | 
|---|
| 1656 |  | 
|---|
| 1657 |   template <class SigArgs> struct sig { | 
|---|
| 1658 |     typedef typename  | 
|---|
| 1659 |       as_lambda_functor< | 
|---|
| 1660 |             typename boost::tuples::element<0, Args>::type  | 
|---|
| 1661 |       >::type lf_type; | 
|---|
| 1662 |  | 
|---|
| 1663 |     typedef typename lf_type::inherited::template sig<SigArgs>::type type;   | 
|---|
| 1664 |   }; | 
|---|
| 1665 |  | 
|---|
| 1666 |   template<class RET, CALL_TEMPLATE_ARGS> | 
|---|
| 1667 |   RET call(CALL_FORMAL_ARGS) const { | 
|---|
| 1668 |     try  | 
|---|
| 1669 |     { | 
|---|
| 1670 |       return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);   | 
|---|
| 1671 |     } | 
|---|
| 1672 |     catch (Catch1& e) | 
|---|
| 1673 |     {                 | 
|---|
| 1674 |       return  | 
|---|
| 1675 |         detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> | 
|---|
| 1676 |                ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1677 |     } | 
|---|
| 1678 |     catch (Catch2& e)  | 
|---|
| 1679 |     {                 | 
|---|
| 1680 |       return  | 
|---|
| 1681 |         detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> | 
|---|
| 1682 |                ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1683 |     } | 
|---|
| 1684 |     catch (Catch3& e) | 
|---|
| 1685 |     { | 
|---|
| 1686 |       return  | 
|---|
| 1687 |         detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> | 
|---|
| 1688 |                ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1689 |     } | 
|---|
| 1690 |     catch (Catch4& e) | 
|---|
| 1691 |     { | 
|---|
| 1692 |       return  | 
|---|
| 1693 |         detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> | 
|---|
| 1694 |                ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1695 |     } | 
|---|
| 1696 |     catch (Catch5& e) | 
|---|
| 1697 |     { | 
|---|
| 1698 |       return  | 
|---|
| 1699 |         detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> | 
|---|
| 1700 |                ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1701 |     } | 
|---|
| 1702 |     catch (Catch6& e) | 
|---|
| 1703 |     { | 
|---|
| 1704 |       return  | 
|---|
| 1705 |         detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> | 
|---|
| 1706 |                ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1707 |     } | 
|---|
| 1708 |     catch (Catch7& e) | 
|---|
| 1709 |     { | 
|---|
| 1710 |       return  | 
|---|
| 1711 |         detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> | 
|---|
| 1712 |                ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1713 |     } | 
|---|
| 1714 |     catch (Catch8& e) | 
|---|
| 1715 |     { | 
|---|
| 1716 |       return  | 
|---|
| 1717 |         detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> | 
|---|
| 1718 |                ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); | 
|---|
| 1719 |     } | 
|---|
| 1720 |     catch (...) | 
|---|
| 1721 |     { | 
|---|
| 1722 |       return  | 
|---|
| 1723 |         detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> | 
|---|
| 1724 |                ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS); | 
|---|
| 1725 |     } | 
|---|
| 1726 |   } | 
|---|
| 1727 | }; | 
|---|
| 1728 |  | 
|---|
| 1729 |  | 
|---|
| 1730 | } // namespace lambda  | 
|---|
| 1731 | } // namespace boost | 
|---|
| 1732 |  | 
|---|
| 1733 |  | 
|---|
| 1734 | #endif | 
|---|
| 1735 |  | 
|---|
| 1736 |  | 
|---|
| 1737 |  | 
|---|
| 1738 |  | 
|---|
| 1739 |  | 
|---|
| 1740 |  | 
|---|