Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 17th, 2012  |  syntax: None  |  size: 1.19 KB  |  hits: 7  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <iostream>
  2. #include <boost/preprocessor.hpp>
  3.  
  4. #define VALUED_ENUM(unused, index, seq)                         \
  5.   BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_ELEM(index, seq))      \
  6.   = BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_ELEM(index, seq))
  7.  
  8. #define INSERT_TUPLE_HEAD(s, state, elem)                   \
  9.   BOOST_PP_SEQ_PUSH_BACK(state,                             \
  10.                          BOOST_PP_TUPLE_ELEM(2, 0, elem))
  11.  
  12. #define ENUM_TO_STR(unused, data, elem)             \
  13.   case BOOST_PP_CAT(data, elem):                    \
  14.   std::cerr << BOOST_PP_STRINGIZE(elem) << "\n";    \
  15.   break;
  16.  
  17. #define ENUM_KEY_VALUE ((VAL_A,0x3))((VAL_B,0x1))((VAL_C,0x4))
  18.  
  19. #define ENUM_KEY_TMP BOOST_PP_SEQ_FOLD_LEFT(INSERT_TUPLE_HEAD,  \
  20.                                             (),                 \
  21.                                             ENUM_KEY_VALUE)
  22.  
  23. #define ENUM_KEY BOOST_PP_SEQ_REST_N(1, ENUM_KEY_TMP)
  24.  
  25. enum TestEnum {
  26.   BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(ENUM_KEY_VALUE), \
  27.                 VALUED_ENUM, ENUM_KEY_VALUE)
  28. };
  29.  
  30. int main()
  31. {
  32.   for(int i=1; i < 5; ++i)
  33.   {
  34.     switch(i)
  35.     {
  36.       BOOST_PP_SEQ_FOR_EACH(ENUM_TO_STR, , ENUM_KEY);
  37.     default:
  38.       std::cerr << "(no hit)" << "\n";
  39.     }
  40.   }
  41. }