iterate_define.hpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*==============================================================================
  2. Copyright (c) 2010 Thomas Heller
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #if !BOOST_PHOENIX_IS_ITERATING
  7. #define BOOST_PHOENIX_typename_A(N) \
  8. BOOST_PP_ENUM_PARAMS(N, typename A) \
  9. /**/
  10. #define BOOST_PHOENIX_typename_A_void(N) \
  11. BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(N, typename A, void) \
  12. /**/
  13. #define BOOST_PHOENIX_A(N) \
  14. BOOST_PP_ENUM_PARAMS(N, A) \
  15. /**/
  16. #define BOOST_PHOENIX_A_ref(N) \
  17. BOOST_PP_ENUM_BINARY_PARAMS(N, A, & BOOST_PP_INTERCEPT) \
  18. /**/
  19. #define BOOST_PHOENIX_A_const_ref(N) \
  20. BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& BOOST_PP_INTERCEPT) \
  21. /**/
  22. #define BOOST_PHOENIX_A_a(N) \
  23. BOOST_PP_ENUM_BINARY_PARAMS(N, A, a) \
  24. /**/
  25. #define BOOST_PHOENIX_A_ref_a(N) \
  26. BOOST_PP_ENUM_BINARY_PARAMS(N, A, & a) \
  27. /**/
  28. #define BOOST_PHOENIX_A_const_ref_a(N) \
  29. BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) \
  30. /**/
  31. #define BOOST_PHOENIX_a(N) \
  32. BOOST_PP_ENUM_PARAMS(N, a) \
  33. /**/
  34. #else
  35. #include <boost/preprocessor/repetition/repeat.hpp>
  36. #include <boost/preprocessor/repetition/enum_binary_params.hpp>
  37. #include <boost/preprocessor/repetition/enum_params.hpp>
  38. #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
  39. #include <boost/preprocessor/seq/elem.hpp>
  40. #include <boost/preprocessor/seq/enum.hpp>
  41. #include <boost/preprocessor/seq/for_each_i.hpp>
  42. #include <boost/preprocessor/seq/for_each_product.hpp>
  43. #include <boost/preprocessor/seq/size.hpp>
  44. #include <boost/preprocessor/tuple/elem.hpp>
  45. #define BOOST_PHOENIX_ITERATION \
  46. BOOST_PP_ITERATION() \
  47. /**/
  48. #define BOOST_PHOENIX_typename_A \
  49. BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, typename A) \
  50. /**/
  51. #define BOOST_PHOENIX_typename_A_void \
  52. BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PHOENIX_ITERATION, typename A, void)
  53. /**/
  54. #define BOOST_PHOENIX_A \
  55. BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, A) \
  56. /**/
  57. #define BOOST_PHOENIX_A_ref \
  58. BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PHOENIX_ITERATION, A, & BOOST_PP_INTERCEPT)\
  59. /**/
  60. #define BOOST_PHOENIX_A_const_ref \
  61. BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PHOENIX_ITERATION, A, const& BOOST_PP_INTERCEPT)\
  62. /**/
  63. #define BOOST_PHOENIX_A_a \
  64. BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PHOENIX_ITERATION, A, a) \
  65. /**/
  66. #define BOOST_PHOENIX_A_ref_a \
  67. BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PHOENIX_ITERATION, A, & a) \
  68. /**/
  69. #define BOOST_PHOENIX_A_const_ref_a \
  70. BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PHOENIX_ITERATION, A, const& a) \
  71. /**/
  72. #define BOOST_PHOENIX_a \
  73. BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, a) \
  74. /**/
  75. /////////////////////////////////////////////////////////////////////////////
  76. // Begin Perfect Forward argument permutation calculation
  77. /////////////////////////////////////////////////////////////////////////////
  78. #define BOOST_PHOENIX_M0_R(_, N, __) \
  79. (((A ## N)(&))((A ## N)(const&))) \
  80. /**/
  81. #define BOOST_PHOENIX_M0 \
  82. BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_M0_R, _) \
  83. /**/
  84. #define BOOST_PHOENIX_M1_R_R(_, N, SEQ) \
  85. BOOST_PP_SEQ_ELEM(N, SEQ) \
  86. /**/
  87. #define BOOST_PHOENIX_M1_R(R, __, ___, ELEM) \
  88. (BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(ELEM), BOOST_PHOENIX_M1_R_R, ELEM)) \
  89. /**/
  90. #define BOOST_PHOENIX_M1(R, PRODUCT) \
  91. ((BOOST_PP_SEQ_ENUM \
  92. (BOOST_PP_SEQ_FOR_EACH_I_R \
  93. (R, BOOST_PHOENIX_M1_R, _, PRODUCT)))) \
  94. /**/
  95. #define BOOST_PHOENIX_PERM_SEQ \
  96. BOOST_PP_SEQ_FOR_EACH_PRODUCT(BOOST_PHOENIX_M1, BOOST_PHOENIX_M0) \
  97. /**/
  98. ////////////////////////////////////////////////////////////////////////////
  99. // End
  100. ////////////////////////////////////////////////////////////////////////////
  101. #define BOOST_PHOENIX_PERM_SIZE \
  102. BOOST_PP_SEQ_SIZE(BOOST_PHOENIX_PERM_SEQ) \
  103. /**/
  104. #define BOOST_PHOENIX_M2(_, N, TUPLE) \
  105. BOOST_PP_COMMA_IF(N) BOOST_PP_TUPLE_ELEM(BOOST_PHOENIX_ITERATION, N, TUPLE) \
  106. /**/
  107. #define BOOST_PHOENIX_M3(_, N, TUPLE) \
  108. BOOST_PP_COMMA_IF(N) BOOST_PP_TUPLE_ELEM(BOOST_PHOENIX_ITERATION, N, TUPLE) a ## N\
  109. /**/
  110. #define BOOST_PHOENIX_PERM_ELEM(N) \
  111. BOOST_PP_SEQ_ELEM(N, BOOST_PHOENIX_PERM_SEQ) \
  112. /**/
  113. #define BOOST_PHOENIX_PERM_A(N) \
  114. BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_M2, BOOST_PHOENIX_PERM_ELEM(N))\
  115. /**/
  116. #define BOOST_PHOENIX_PERM_A_a(N) \
  117. BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_M3, BOOST_PHOENIX_PERM_ELEM(N))\
  118. /**/
  119. #endif