test_doc_whyhow.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // (C) Copyright Edward Diener 2011-2015
  2. // Use, modification and distribution are subject to the Boost Software License,
  3. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt).
  5. #include <boost/vmd/elem.hpp>
  6. #include <boost/vmd/equal.hpp>
  7. #include <boost/vmd/get_type.hpp>
  8. #include <boost/vmd/is_identifier.hpp>
  9. #include <boost/vmd/is_seq.hpp>
  10. #include <boost/vmd/is_tuple.hpp>
  11. #include <boost/vmd/to_tuple.hpp>
  12. #include <boost/preprocessor/control/iif.hpp>
  13. #include <boost/detail/lightweight_test.hpp>
  14. int main()
  15. {
  16. #if BOOST_PP_VARIADICS
  17. #define BOOST_VMD_REGISTER_Seq (Seq)
  18. #define BOOST_VMD_REGISTER_Tuple (Tuple)
  19. #define BOOST_VMD_REGISTER_Unknown (Unknown)
  20. #define BOOST_VMD_DETECT_Seq_Seq
  21. #define BOOST_VMD_DETECT_Tuple_Tuple
  22. #define BOOST_VMD_DETECT_Unknown_Unknown
  23. #define AMACRO(param) \
  24. BOOST_PP_IIF \
  25. ( \
  26. BOOST_VMD_IS_SEQ(param), \
  27. Seq, \
  28. BOOST_PP_IIF \
  29. ( \
  30. BOOST_VMD_IS_TUPLE(param), \
  31. Tuple, \
  32. Unknown \
  33. ) \
  34. )
  35. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO((0)(1)),Seq));
  36. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO((0,1)),Tuple));
  37. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO(24),Unknown));
  38. #define BOOST_VMD_REGISTER_NAME (NAME)
  39. #define BOOST_VMD_REGISTER_ADDRESS (ADDRESS)
  40. #define AMACRO1(param) \
  41. BOOST_PP_IIF \
  42. ( \
  43. BOOST_VMD_IS_IDENTIFIER(param), \
  44. AMACRO1_IDENTIFIER, \
  45. AMACRO1_NO_IDENTIFIER \
  46. ) \
  47. (param)
  48. #define AMACRO1_IDENTIFIER(param) AMACRO1_ ## param
  49. #define AMACRO1_NO_IDENTIFIER(param) Parameter is not an identifier
  50. #define AMACRO1_NAME Identifier is a NAME
  51. #define AMACRO1_ADDRESS Identifier is an ADDRESS
  52. #define BOOST_VMD_REGISTER_Parameter (Parameter)
  53. #define BOOST_VMD_REGISTER_is (is)
  54. #define BOOST_VMD_REGISTER_not (not)
  55. #define BOOST_VMD_REGISTER_an (an)
  56. #define BOOST_VMD_REGISTER_identifier (identifier)
  57. #define BOOST_VMD_REGISTER_Identifier (Identifier)
  58. #define BOOST_VMD_REGISTER_a (a)
  59. #define BOOST_VMD_DETECT_NAME_NAME
  60. #define BOOST_VMD_DETECT_ADDRESS_ADDRESS
  61. #define BOOST_VMD_DETECT_Parameter_Parameter
  62. #define BOOST_VMD_DETECT_is_is
  63. #define BOOST_VMD_DETECT_not_not
  64. #define BOOST_VMD_DETECT_an_an
  65. #define BOOST_VMD_DETECT_identifier_identifier
  66. #define BOOST_VMD_DETECT_Identifier_Identifier
  67. #define BOOST_VMD_DETECT_a_a
  68. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1((44)),Parameter is not an identifier));
  69. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1(NAME),Identifier is a NAME));
  70. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1(ADDRESS),Identifier is an ADDRESS));
  71. #define AMACRO2(param) \
  72. BOOST_PP_IIF \
  73. ( \
  74. BOOST_VMD_IS_IDENTIFIER(param,NAME), \
  75. AMACRO2_NAME, \
  76. BOOST_PP_IIF \
  77. ( \
  78. BOOST_VMD_IS_IDENTIFIER(param,ADDRESS), \
  79. AMACRO2_ADDRESS, \
  80. AMACRO2_NO_IDENTIFIER \
  81. ) \
  82. ) \
  83. (param)
  84. #define BOOST_VMD_REGISTER_or (or)
  85. #define BOOST_VMD_DETECT_or_or
  86. #define AMACRO2_NO_IDENTIFIER(param) Parameter is not a NAME or ADDRESS identifier
  87. #define AMACRO2_NAME(param) Identifier is a NAME
  88. #define AMACRO2_ADDRESS(param) Identifier is an ADDRESS
  89. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2((44)),Parameter is not a NAME or ADDRESS identifier));
  90. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2(NAME),Identifier is a NAME));
  91. BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2(ADDRESS),Identifier is an ADDRESS));
  92. #define ASEQUENCE (1,2) NAME 147 BOOST_VMD_TYPE_NUMBER (a)(b)
  93. #define BOOST_VMD_REGISTER_b (b)
  94. #define BOOST_VMD_DETECT_b_b
  95. BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_TO_TUPLE(ASEQUENCE),((1,2),NAME,147,BOOST_VMD_TYPE_NUMBER,(a)(b))));
  96. BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_ELEM(2,ASEQUENCE),147));
  97. BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_GET_TYPE((1,2)),BOOST_VMD_TYPE_TUPLE));
  98. BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_GET_TYPE(235),BOOST_VMD_TYPE_NUMBER));
  99. #else
  100. BOOST_ERROR("No variadic macro support");
  101. #endif
  102. return boost::report_errors();
  103. }