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