os/ossrv/ossrv_pub/boost_apis/boost/lambda/switch.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Boost Lambda Library -- switch.hpp -----------------------------------
sl@0
     2
//
sl@0
     3
// Copyright (C) 2000 Gary Powell (powellg@amazon.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 www.boost.org
sl@0
    11
sl@0
    12
// --------------------------------------------------------------------------
sl@0
    13
sl@0
    14
#if !defined(BOOST_LAMBDA_SWITCH_HPP)
sl@0
    15
#define BOOST_LAMBDA_SWITCH_HPP
sl@0
    16
sl@0
    17
#include "boost/lambda/core.hpp"
sl@0
    18
#include "boost/lambda/detail/control_constructs_common.hpp"
sl@0
    19
sl@0
    20
#include "boost/preprocessor/enum_shifted_params.hpp"
sl@0
    21
#include "boost/preprocessor/repeat_2nd.hpp"
sl@0
    22
#include "boost/preprocessor/tuple.hpp"
sl@0
    23
sl@0
    24
namespace boost { 
sl@0
    25
namespace lambda {
sl@0
    26
sl@0
    27
// Switch actions
sl@0
    28
template <int N, class Switch1 = null_type, class Switch2 = null_type, 
sl@0
    29
          class Switch3 = null_type, class Switch4 = null_type,
sl@0
    30
          class Switch5 = null_type, class Switch6 = null_type, 
sl@0
    31
          class Switch7 = null_type, class Switch8 = null_type, 
sl@0
    32
          class Switch9 = null_type>
sl@0
    33
struct switch_action {};
sl@0
    34
sl@0
    35
sl@0
    36
namespace detail {
sl@0
    37
sl@0
    38
  // templates to represent special lambda functors for the cases in 
sl@0
    39
  // switch statements
sl@0
    40
  
sl@0
    41
template <int Value> struct case_label {};
sl@0
    42
struct default_label {};
sl@0
    43
sl@0
    44
template<class Type> struct switch_case_tag {};
sl@0
    45
sl@0
    46
  // a normal case is represented as:
sl@0
    47
  // tagged_lambda_functor<switch_case_tag<case_label<N> > >, LambdaFunctor>
sl@0
    48
  
sl@0
    49
  // the default case as:
sl@0
    50
  // tagged_lambda_functor<switch_case_tag<default_label> >, LambdaFunctor>
sl@0
    51
sl@0
    52
sl@0
    53
} // end detail
sl@0
    54
sl@0
    55
sl@0
    56
/// create switch_case_tag tagged_lambda_functors
sl@0
    57
template <int CaseValue, class Arg>
sl@0
    58
inline const 
sl@0
    59
tagged_lambda_functor<
sl@0
    60
  detail::switch_case_tag<detail::case_label<CaseValue> >, 
sl@0
    61
  lambda_functor<Arg> 
sl@0
    62
> 
sl@0
    63
case_statement(const lambda_functor<Arg>& a) { 
sl@0
    64
  return 
sl@0
    65
    tagged_lambda_functor<
sl@0
    66
      detail::switch_case_tag<detail::case_label<CaseValue> >, 
sl@0
    67
      lambda_functor<Arg> 
sl@0
    68
    >(a); 
sl@0
    69
}
sl@0
    70
sl@0
    71
// No case body case.
sl@0
    72
template <int CaseValue>
sl@0
    73
inline const 
sl@0
    74
tagged_lambda_functor<
sl@0
    75
  detail::switch_case_tag<detail::case_label<CaseValue> >,
sl@0
    76
  lambda_functor< 
sl@0
    77
    lambda_functor_base< 
sl@0
    78
      do_nothing_action, 
sl@0
    79
      null_type
sl@0
    80
    > 
sl@0
    81
  > 
sl@0
    82
> 
sl@0
    83
case_statement() { 
sl@0
    84
return 
sl@0
    85
  tagged_lambda_functor<
sl@0
    86
    detail::switch_case_tag<detail::case_label<CaseValue> >,
sl@0
    87
    lambda_functor< 
sl@0
    88
      lambda_functor_base< 
sl@0
    89
        do_nothing_action, 
sl@0
    90
        null_type
sl@0
    91
      > 
sl@0
    92
    > 
sl@0
    93
  > () ;
sl@0
    94
}
sl@0
    95
sl@0
    96
// default label
sl@0
    97
template <class Arg>
sl@0
    98
inline const 
sl@0
    99
tagged_lambda_functor<
sl@0
   100
  detail::switch_case_tag<detail::default_label>, 
sl@0
   101
  lambda_functor<Arg> 
sl@0
   102
> 
sl@0
   103
default_statement(const lambda_functor<Arg>& a) { 
sl@0
   104
  return 
sl@0
   105
    tagged_lambda_functor<
sl@0
   106
      detail::switch_case_tag<detail::default_label>, 
sl@0
   107
      lambda_functor<Arg> 
sl@0
   108
    >(a); 
sl@0
   109
}
sl@0
   110
sl@0
   111
// default lable, no case body case.
sl@0
   112
inline const 
sl@0
   113
tagged_lambda_functor<
sl@0
   114
  detail::switch_case_tag<detail::default_label>,
sl@0
   115
  lambda_functor< 
sl@0
   116
    lambda_functor_base< 
sl@0
   117
      do_nothing_action, 
sl@0
   118
      null_type
sl@0
   119
    > 
sl@0
   120
  > 
sl@0
   121
> 
sl@0
   122
default_statement() { 
sl@0
   123
return 
sl@0
   124
      lambda_functor_base< 
sl@0
   125
        do_nothing_action, 
sl@0
   126
        null_type 
sl@0
   127
      > () ;
sl@0
   128
}
sl@0
   129
sl@0
   130
sl@0
   131
// Specializations for lambda_functor_base of case_statement -----------------
sl@0
   132
sl@0
   133
// 0 case type:
sl@0
   134
// useless (just the condition part) but provided for completeness.
sl@0
   135
template<class Args>
sl@0
   136
class 
sl@0
   137
lambda_functor_base<
sl@0
   138
  switch_action<1>, 
sl@0
   139
  Args
sl@0
   140
> 
sl@0
   141
{
sl@0
   142
public:
sl@0
   143
  Args args;
sl@0
   144
  template <class SigArgs> struct sig { typedef void type; };
sl@0
   145
public:
sl@0
   146
  explicit lambda_functor_base(const Args& a) : args(a) {}
sl@0
   147
sl@0
   148
  template<class RET, CALL_TEMPLATE_ARGS>
sl@0
   149
  RET call(CALL_FORMAL_ARGS) const {
sl@0
   150
    detail::select(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);  
sl@0
   151
  }
sl@0
   152
};
sl@0
   153
sl@0
   154
// 1 case type:
sl@0
   155
// template<class Args, int Case1>
sl@0
   156
// class 
sl@0
   157
// lambda_functor_base<
sl@0
   158
//   action<
sl@0
   159
//     2, 
sl@0
   160
//     return_void_action<switch_action<detail::case_label<Case1> > > 
sl@0
   161
//   >, 
sl@0
   162
//   Args
sl@0
   163
// > 
sl@0
   164
// {
sl@0
   165
//   Args args;
sl@0
   166
// public:
sl@0
   167
//   explicit lambda_functor_base(const Args& a) : args(a) {}
sl@0
   168
sl@0
   169
//   template<class RET, class A, class B, class C>
sl@0
   170
//   RET call(A& a, B& b, C& c) const {
sl@0
   171
//     switch( detail::select(::boost::tuples::get<0>(args), a, b, c) )  
sl@0
   172
//     {
sl@0
   173
//       case Case1:                
sl@0
   174
//         detail::select(::boost::tuples::get<1>(args), a, b, c);
sl@0
   175
//         break;
sl@0
   176
//     }
sl@0
   177
//   }
sl@0
   178
// };
sl@0
   179
sl@0
   180
// switch with default being the sole label - doesn't make much sense but
sl@0
   181
// it is there for completeness
sl@0
   182
// template<class Args>
sl@0
   183
// class
sl@0
   184
// lambda_functor_base<
sl@0
   185
//   action<
sl@0
   186
//     2,
sl@0
   187
//     return_void_action<switch_action<detail::default_label> >
sl@0
   188
//   >,
sl@0
   189
//   Args
sl@0
   190
// >
sl@0
   191
// {
sl@0
   192
//   Args args;
sl@0
   193
// public:
sl@0
   194
//   explicit lambda_functor_base(const Args& a) : args(a) {}
sl@0
   195
// 
sl@0
   196
//   template<class RET, class A, class B, class C>
sl@0
   197
//   RET call(A& a, B& b, C& c) const {
sl@0
   198
//     switch( detail::select(::boost::tuples::get<0>(args), a, b, c) )
sl@0
   199
//     {
sl@0
   200
//       default:
sl@0
   201
//         detail::select(::boost::tuples::get<1>(args), a, b, c);
sl@0
   202
//         break;
sl@0
   203
//     }
sl@0
   204
//   }
sl@0
   205
// };
sl@0
   206
sl@0
   207
sl@0
   208
sl@0
   209
// // 2 case type:
sl@0
   210
// The different specializations are generated with Vesa Karvonen's 
sl@0
   211
// preprocessor library.
sl@0
   212
sl@0
   213
// This is just a comment to show what the generated classes look like
sl@0
   214
sl@0
   215
// template<class Args, int Case1, int Case2>
sl@0
   216
// class 
sl@0
   217
// lambda_functor_base<
sl@0
   218
//   action<3, 
sl@0
   219
//     return_void_action< 
sl@0
   220
//       switch_action< 
sl@0
   221
//         detail::case_label<Case1>,
sl@0
   222
//         detail::case_label<Case2>
sl@0
   223
//       > 
sl@0
   224
//     > 
sl@0
   225
//   >, 
sl@0
   226
//   Args
sl@0
   227
// > 
sl@0
   228
// {
sl@0
   229
//   Args args;
sl@0
   230
// public:
sl@0
   231
//   explicit lambda_functor_base(const Args& a) : args(a) {}
sl@0
   232
sl@0
   233
//   template<class RET, class A, class B, class C>
sl@0
   234
//   RET call(A& a, B& b, C& c) const {
sl@0
   235
//     switch( detail::select(::boost::tuples::get<0>(args), a, b, c) )  
sl@0
   236
//     {
sl@0
   237
//       case Case1:                
sl@0
   238
//         detail::select(::boost::tuples::get<1>(args), a, b, c);
sl@0
   239
//         break;
sl@0
   240
//       case Case2:                
sl@0
   241
//         detail::select(::boost::tuples::get<2>(args), a, b, c);
sl@0
   242
//         break;
sl@0
   243
//     }
sl@0
   244
//   }
sl@0
   245
// };
sl@0
   246
sl@0
   247
// template<class Args, int Case1>
sl@0
   248
// class 
sl@0
   249
// lambda_functor_base<
sl@0
   250
//   action<3, 
sl@0
   251
//     return_void_action< 
sl@0
   252
//       switch_action< 
sl@0
   253
//         detail::case_label<Case1>,
sl@0
   254
//         detail::default_label 
sl@0
   255
//       > 
sl@0
   256
//     > 
sl@0
   257
//   >, 
sl@0
   258
//   Args
sl@0
   259
// > 
sl@0
   260
// {
sl@0
   261
//   Args args;
sl@0
   262
// public:
sl@0
   263
//   explicit lambda_functor_base(const Args& a) : args(a) {}
sl@0
   264
sl@0
   265
//   template<class RET, class A, class B, class C>
sl@0
   266
//   RET call(A& a, B& b, C& c) const {
sl@0
   267
//     switch( detail::select(::boost::tuples::get<0>(args), a, b, c) )  
sl@0
   268
//     {
sl@0
   269
//       case Case1:                
sl@0
   270
//         detail::select(::boost::tuples::get<1>(args), a, b, c);
sl@0
   271
//         break;
sl@0
   272
//       default:                
sl@0
   273
//         detail::select(::boost::tuples::get<2>(args), a, b, c);
sl@0
   274
//         break;
sl@0
   275
//     }
sl@0
   276
//   }
sl@0
   277
// };
sl@0
   278
// -------------------------
sl@0
   279
sl@0
   280
// Some helper preprocessor macros ---------------------------------
sl@0
   281
sl@0
   282
// BOOST_LAMBDA_A_I_LIST(N, X) is a list of form X0, X1, ..., XN
sl@0
   283
// BOOST_LAMBDA_A_I_B_LIST(N, X, Y) is a list of form X0 Y, X1 Y, ..., XN Y
sl@0
   284
sl@0
   285
#define BOOST_LAMBDA_A_I(z, i, A) \
sl@0
   286
BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(A,i)
sl@0
   287
sl@0
   288
#define BOOST_LAMBDA_A_I_B(z, i, T) \
sl@0
   289
BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2,0,T),i) BOOST_PP_TUPLE_ELEM(2,1,T)
sl@0
   290
sl@0
   291
#define BOOST_LAMBDA_A_I_LIST(i, A) \
sl@0
   292
BOOST_PP_REPEAT(i,BOOST_LAMBDA_A_I, A) 
sl@0
   293
sl@0
   294
#define BOOST_LAMBDA_A_I_B_LIST(i, A, B) \
sl@0
   295
BOOST_PP_REPEAT(i,BOOST_LAMBDA_A_I_B, (A,B)) 
sl@0
   296
sl@0
   297
sl@0
   298
// Switch related macros -------------------------------------------
sl@0
   299
#define BOOST_LAMBDA_SWITCH_CASE_BLOCK(z, N, A) \
sl@0
   300
  case Case##N: \
sl@0
   301
  detail::select(::boost::tuples::get<BOOST_PP_INC(N)>(args), CALL_ACTUAL_ARGS); \
sl@0
   302
  break;
sl@0
   303
sl@0
   304
#define BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(N) \
sl@0
   305
BOOST_PP_REPEAT(N, BOOST_LAMBDA_SWITCH_CASE_BLOCK, FOO)
sl@0
   306
// 2 case type:
sl@0
   307
sl@0
   308
#define BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE(N)                                \
sl@0
   309
template<class Args, BOOST_LAMBDA_A_I_LIST(N, int Case)>                      \
sl@0
   310
class                                                                         \
sl@0
   311
lambda_functor_base<                                                          \
sl@0
   312
      switch_action<BOOST_PP_INC(N),                                          \
sl@0
   313
        BOOST_LAMBDA_A_I_B_LIST(N, detail::case_label<Case,>)                 \
sl@0
   314
      >,                                                                      \
sl@0
   315
  Args                                                                        \
sl@0
   316
>                                                                             \
sl@0
   317
{                                                                             \
sl@0
   318
public:                                                                       \
sl@0
   319
  Args args;                                                                  \
sl@0
   320
  template <class SigArgs> struct sig { typedef void type; };                 \
sl@0
   321
public:                                                                       \
sl@0
   322
  explicit lambda_functor_base(const Args& a) : args(a) {}                    \
sl@0
   323
                                                                              \
sl@0
   324
  template<class RET, CALL_TEMPLATE_ARGS>                                     \
sl@0
   325
  RET call(CALL_FORMAL_ARGS) const {                                          \
sl@0
   326
    switch( detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) ) \
sl@0
   327
    {                                                                         \
sl@0
   328
      BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(N)                                  \
sl@0
   329
    }                                                                         \
sl@0
   330
  }                                                                           \
sl@0
   331
};
sl@0
   332
sl@0
   333
        
sl@0
   334
sl@0
   335
#define BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE(N)                              \
sl@0
   336
template<                                                                     \
sl@0
   337
  class Args BOOST_PP_COMMA_IF(BOOST_PP_DEC(N))                               \
sl@0
   338
  BOOST_LAMBDA_A_I_LIST(BOOST_PP_DEC(N), int Case)                            \
sl@0
   339
>                                                                             \
sl@0
   340
class                                                                         \
sl@0
   341
lambda_functor_base<                                                          \
sl@0
   342
      switch_action<BOOST_PP_INC(N),                                          \
sl@0
   343
        BOOST_LAMBDA_A_I_B_LIST(BOOST_PP_DEC(N),                              \
sl@0
   344
                                detail::case_label<Case, >)                   \
sl@0
   345
        BOOST_PP_COMMA_IF(BOOST_PP_DEC(N))                                    \
sl@0
   346
        detail::default_label                                                 \
sl@0
   347
      >,                                                                      \
sl@0
   348
  Args                                                                        \
sl@0
   349
>                                                                             \
sl@0
   350
{                                                                             \
sl@0
   351
public:                                                                       \
sl@0
   352
  Args args;                                                                  \
sl@0
   353
  template <class SigArgs> struct sig { typedef void type; };                 \
sl@0
   354
public:                                                                       \
sl@0
   355
  explicit lambda_functor_base(const Args& a) : args(a) {}                    \
sl@0
   356
                                                                              \
sl@0
   357
  template<class RET, CALL_TEMPLATE_ARGS>                                     \
sl@0
   358
  RET call(CALL_FORMAL_ARGS) const {                                          \
sl@0
   359
    switch( detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) ) \
sl@0
   360
    {                                                                         \
sl@0
   361
        BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(BOOST_PP_DEC(N))                  \
sl@0
   362
      default:                                                                \
sl@0
   363
        detail::select(::boost::tuples::get<N>(args), CALL_ACTUAL_ARGS);      \
sl@0
   364
        break;                                                                \
sl@0
   365
    }                                                                         \
sl@0
   366
  }                                                                           \
sl@0
   367
};
sl@0
   368
sl@0
   369
sl@0
   370
sl@0
   371
sl@0
   372
sl@0
   373
sl@0
   374
// switch_statement bind functions -------------------------------------
sl@0
   375
sl@0
   376
// The zero argument case, for completeness sake
sl@0
   377
inline const 
sl@0
   378
lambda_functor< 
sl@0
   379
  lambda_functor_base< 
sl@0
   380
    do_nothing_action, 
sl@0
   381
    null_type
sl@0
   382
  > 
sl@0
   383
>
sl@0
   384
switch_statement() { 
sl@0
   385
  return 
sl@0
   386
      lambda_functor_base< 
sl@0
   387
        do_nothing_action, 
sl@0
   388
        null_type
sl@0
   389
      > 
sl@0
   390
  ();
sl@0
   391
}
sl@0
   392
sl@0
   393
// 1 argument case, this is useless as well, just the condition part
sl@0
   394
template <class TestArg>
sl@0
   395
inline const 
sl@0
   396
lambda_functor< 
sl@0
   397
  lambda_functor_base< 
sl@0
   398
    switch_action<1>, 
sl@0
   399
    tuple<lambda_functor<TestArg> >
sl@0
   400
  > 
sl@0
   401
>
sl@0
   402
switch_statement(const lambda_functor<TestArg>& a1) { 
sl@0
   403
  return 
sl@0
   404
      lambda_functor_base< 
sl@0
   405
         switch_action<1>, 
sl@0
   406
         tuple< lambda_functor<TestArg> > 
sl@0
   407
      > 
sl@0
   408
    ( tuple<lambda_functor<TestArg> >(a1));
sl@0
   409
}
sl@0
   410
sl@0
   411
sl@0
   412
#define HELPER(z, N, FOO)                                      \
sl@0
   413
BOOST_PP_COMMA_IF(N)                                           \
sl@0
   414
BOOST_PP_CAT(                                                  \
sl@0
   415
  const tagged_lambda_functor<detail::switch_case_tag<TagData, \
sl@0
   416
  N>)                                                          \
sl@0
   417
BOOST_PP_COMMA() Arg##N>& a##N
sl@0
   418
sl@0
   419
#define HELPER_LIST(N) BOOST_PP_REPEAT(N, HELPER, FOO)
sl@0
   420
sl@0
   421
sl@0
   422
#define BOOST_LAMBDA_SWITCH_STATEMENT(N)                              \
sl@0
   423
template <class TestArg,                                              \
sl@0
   424
          BOOST_LAMBDA_A_I_LIST(N, class TagData),                    \
sl@0
   425
          BOOST_LAMBDA_A_I_LIST(N, class Arg)>                        \
sl@0
   426
inline const                                                          \
sl@0
   427
lambda_functor<                                                       \
sl@0
   428
  lambda_functor_base<                                                \
sl@0
   429
        switch_action<BOOST_PP_INC(N),                                \
sl@0
   430
          BOOST_LAMBDA_A_I_LIST(N, TagData)                           \
sl@0
   431
        >,                                                            \
sl@0
   432
    tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)>     \
sl@0
   433
  >                                                                   \
sl@0
   434
>                                                                     \
sl@0
   435
switch_statement(                                                     \
sl@0
   436
  const lambda_functor<TestArg>& ta,                                  \
sl@0
   437
  HELPER_LIST(N)                                                      \
sl@0
   438
)                                                                     \
sl@0
   439
{                                                                     \
sl@0
   440
  return                                                              \
sl@0
   441
      lambda_functor_base<                                            \
sl@0
   442
            switch_action<BOOST_PP_INC(N),                            \
sl@0
   443
              BOOST_LAMBDA_A_I_LIST(N, TagData)                       \
sl@0
   444
            >,                                                        \
sl@0
   445
        tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)> \
sl@0
   446
      >                                                               \
sl@0
   447
    ( tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)>   \
sl@0
   448
        (ta, BOOST_LAMBDA_A_I_LIST(N, a) ));                          \
sl@0
   449
}
sl@0
   450
sl@0
   451
sl@0
   452
sl@0
   453
sl@0
   454
// Here's the actual generation
sl@0
   455
sl@0
   456
#define BOOST_LAMBDA_SWITCH(N)           \
sl@0
   457
BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE(N)   \
sl@0
   458
BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE(N)        
sl@0
   459
sl@0
   460
// Use this to avoid case 0, these macros work only from case 1 upwards
sl@0
   461
#define BOOST_LAMBDA_SWITCH_HELPER(z, N, A) \
sl@0
   462
BOOST_LAMBDA_SWITCH( BOOST_PP_INC(N) )
sl@0
   463
sl@0
   464
// Use this to avoid cases 0 and 1, these macros work only from case 2 upwards
sl@0
   465
#define BOOST_LAMBDA_SWITCH_STATEMENT_HELPER(z, N, A) \
sl@0
   466
BOOST_LAMBDA_SWITCH_STATEMENT(BOOST_PP_INC(N))
sl@0
   467
sl@0
   468
sl@0
   469
sl@0
   470
  // up to 9 cases supported (counting default:)
sl@0
   471
BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_HELPER,FOO)
sl@0
   472
BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_STATEMENT_HELPER,FOO)
sl@0
   473
sl@0
   474
sl@0
   475
} // namespace lambda 
sl@0
   476
} // namespace boost
sl@0
   477
sl@0
   478
sl@0
   479
#undef HELPER
sl@0
   480
#undef HELPER_LIST
sl@0
   481
sl@0
   482
#undef BOOST_LAMBDA_SWITCH_HELPER
sl@0
   483
#undef BOOST_LAMBDA_SWITCH
sl@0
   484
#undef BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE
sl@0
   485
#undef BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE
sl@0
   486
sl@0
   487
#undef BOOST_LAMBDA_SWITCH_CASE_BLOCK
sl@0
   488
#undef BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST
sl@0
   489
sl@0
   490
#undef BOOST_LAMBDA_SWITCH_STATEMENT
sl@0
   491
#undef BOOST_LAMBDA_SWITCH_STATEMENT_HELPER
sl@0
   492
sl@0
   493
sl@0
   494
sl@0
   495
#endif
sl@0
   496
sl@0
   497
sl@0
   498
sl@0
   499
sl@0
   500
sl@0
   501
sl@0
   502