📄 switch.hpp
字号:
// 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 + -