⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 switch.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//         detail::case_label<Case1>,//         detail::default_label //       > //     > //   >, //   Args// > // {//   Args args;// public://   explicit lambda_functor_base(const Args& a) : args(a) {}//   template<class RET, class A, class B, class C>//   RET call(A& a, B& b, C& c) const {//     switch( detail::select(::boost::tuples::get<0>(args), a, b, c) )  //     {//       case Case1:                //         detail::select(::boost::tuples::get<1>(args), a, b, c);//         break;//       default:                //         detail::select(::boost::tuples::get<2>(args), a, b, c);//         break;//     }//   }// };// -------------------------// Some helper preprocessor macros ---------------------------------// BOOST_LAMBDA_A_I_LIST(N, X) is a list of form X0, X1, ..., XN// BOOST_LAMBDA_A_I_B_LIST(N, X, Y) is a list of form X0 Y, X1 Y, ..., XN Y#define BOOST_LAMBDA_A_I(z, i, A) \BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(A,i)#define BOOST_LAMBDA_A_I_B(z, i, T) \BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2,0,T),i) BOOST_PP_TUPLE_ELEM(2,1,T)#define BOOST_LAMBDA_A_I_LIST(i, A) \BOOST_PP_REPEAT(i,BOOST_LAMBDA_A_I, A) #define BOOST_LAMBDA_A_I_B_LIST(i, A, B) \BOOST_PP_REPEAT(i,BOOST_LAMBDA_A_I_B, (A,B)) // Switch related macros -------------------------------------------#define BOOST_LAMBDA_SWITCH_CASE_BLOCK(z, N, A) \  case Case##N: \  detail::select(::boost::tuples::get<BOOST_PP_INC(N)>(args), CALL_ACTUAL_ARGS); \  break;#define BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(N) \BOOST_PP_REPEAT(N, BOOST_LAMBDA_SWITCH_CASE_BLOCK, FOO)// 2 case type:#define BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE(N)                                \template<class Args, BOOST_LAMBDA_A_I_LIST(N, int Case)>                      \class                                                                         \lambda_functor_base<                                                          \      switch_action<BOOST_PP_INC(N),                                          \        BOOST_LAMBDA_A_I_B_LIST(N, detail::case_label<Case,>)                 \      >,                                                                      \  Args                                                                        \>                                                                             \{                                                                             \public:                                                                       \  Args args;                                                                  \  template <class SigArgs> struct sig { typedef void type; };                 \public:                                                                       \  explicit lambda_functor_base(const Args& a) : args(a) {}                    \                                                                              \  template<class RET, CALL_TEMPLATE_ARGS>                                     \  RET call(CALL_FORMAL_ARGS) const {                                          \    switch( detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) ) \    {                                                                         \      BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(N)                                  \    }                                                                         \  }                                                                           \};        #define BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE(N)                              \template<                                                                     \  class Args BOOST_PP_COMMA_IF(BOOST_PP_DEC(N))                               \  BOOST_LAMBDA_A_I_LIST(BOOST_PP_DEC(N), int Case)                            \>                                                                             \class                                                                         \lambda_functor_base<                                                          \      switch_action<BOOST_PP_INC(N),                                          \        BOOST_LAMBDA_A_I_B_LIST(BOOST_PP_DEC(N),                              \                                detail::case_label<Case, >)                   \        BOOST_PP_COMMA_IF(BOOST_PP_DEC(N))                                    \        detail::default_label                                                 \      >,                                                                      \  Args                                                                        \>                                                                             \{                                                                             \public:                                                                       \  Args args;                                                                  \  template <class SigArgs> struct sig { typedef void type; };                 \public:                                                                       \  explicit lambda_functor_base(const Args& a) : args(a) {}                    \                                                                              \  template<class RET, CALL_TEMPLATE_ARGS>                                     \  RET call(CALL_FORMAL_ARGS) const {                                          \    switch( detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) ) \    {                                                                         \        BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST(BOOST_PP_DEC(N))                  \      default:                                                                \        detail::select(::boost::tuples::get<N>(args), CALL_ACTUAL_ARGS);      \        break;                                                                \    }                                                                         \  }                                                                           \};// switch_statement bind functions -------------------------------------// The zero argument case, for completeness sakeinline const lambda_functor<   lambda_functor_base<     do_nothing_action,     null_type  > >switch_statement() {   return       lambda_functor_base<         do_nothing_action,         null_type      >   ();}// 1 argument case, this is useless as well, just the condition parttemplate <class TestArg>inline const lambda_functor<   lambda_functor_base<     switch_action<1>,     tuple<lambda_functor<TestArg> >  > >switch_statement(const lambda_functor<TestArg>& a1) {   return       lambda_functor_base<          switch_action<1>,          tuple< lambda_functor<TestArg> >       >     ( tuple<lambda_functor<TestArg> >(a1));}#define HELPER(z, N, FOO)                                      \BOOST_PP_COMMA_IF(N)                                           \BOOST_PP_CAT(                                                  \  const tagged_lambda_functor<detail::switch_case_tag<TagData, \  N>)                                                          \BOOST_PP_COMMA() Arg##N>& a##N#define HELPER_LIST(N) BOOST_PP_REPEAT(N, HELPER, FOO)#define BOOST_LAMBDA_SWITCH_STATEMENT(N)                              \template <class TestArg,                                              \          BOOST_LAMBDA_A_I_LIST(N, class TagData),                    \          BOOST_LAMBDA_A_I_LIST(N, class Arg)>                        \inline const                                                          \lambda_functor<                                                       \  lambda_functor_base<                                                \        switch_action<BOOST_PP_INC(N),                                \          BOOST_LAMBDA_A_I_LIST(N, TagData)                           \        >,                                                            \    tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)>     \  >                                                                   \>                                                                     \switch_statement(                                                     \  const lambda_functor<TestArg>& ta,                                  \  HELPER_LIST(N)                                                      \)                                                                     \{                                                                     \  return                                                              \      lambda_functor_base<                                            \            switch_action<BOOST_PP_INC(N),                            \              BOOST_LAMBDA_A_I_LIST(N, TagData)                       \            >,                                                        \        tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)> \      >                                                               \    ( tuple<lambda_functor<TestArg>, BOOST_LAMBDA_A_I_LIST(N, Arg)>   \        (ta, BOOST_LAMBDA_A_I_LIST(N, a) ));                          \}// Here's the actual generation#define BOOST_LAMBDA_SWITCH(N)           \BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE(N)   \BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE(N)        // Use this to avoid case 0, these macros work only from case 1 upwards#define BOOST_LAMBDA_SWITCH_HELPER(z, N, A) \BOOST_LAMBDA_SWITCH( BOOST_PP_INC(N) )// Use this to avoid cases 0 and 1, these macros work only from case 2 upwards#define BOOST_LAMBDA_SWITCH_STATEMENT_HELPER(z, N, A) \BOOST_LAMBDA_SWITCH_STATEMENT(BOOST_PP_INC(N))  // up to 9 cases supported (counting default:)BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_HELPER,FOO)BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_STATEMENT_HELPER,FOO)} // namespace lambda } // namespace boost#undef HELPER#undef HELPER_LIST#undef BOOST_LAMBDA_SWITCH_HELPER#undef BOOST_LAMBDA_SWITCH#undef BOOST_LAMBDA_SWITCH_NO_DEFAULT_CASE#undef BOOST_LAMBDA_SWITCH_WITH_DEFAULT_CASE#undef BOOST_LAMBDA_SWITCH_CASE_BLOCK#undef BOOST_LAMBDA_SWITCH_CASE_BLOCK_LIST#undef BOOST_LAMBDA_SWITCH_STATEMENT#undef BOOST_LAMBDA_SWITCH_STATEMENT_HELPER#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -