[857] | 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 |
|
---|