flatten.hpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright Daniel Wallin 2005.
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FLATTEN_HPP
  6. #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FLATTEN_HPP
  7. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_required required,
  8. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_optional optional,
  9. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_deduced deduced,
  10. #define BOOST_PARAMETER_AUX_PP_FLATTEN_IDENTITY(x) x
  11. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0_DUMMY_ELEM(z, n, data) ~
  12. #include <boost/preprocessor/cat.hpp>
  13. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub) \
  14. BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_, sub)
  15. /**/
  16. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AS_DEDUCED(x) \
  17. BOOST_PP_CAT(deduced_, x)
  18. /**/
  19. #include <boost/preprocessor/detail/split.hpp>
  20. #define BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(sub) \
  21. BOOST_PP_SPLIT(0, BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub))
  22. /**/
  23. #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(sub) \
  24. BOOST_PP_SPLIT(1, BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub))
  25. /**/
  26. #include <boost/preprocessor/tuple/elem.hpp>
  27. #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_optional(arities) \
  28. BOOST_PP_TUPLE_ELEM(3, 0, arities)
  29. /**/
  30. #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_required(arities) \
  31. BOOST_PP_TUPLE_ELEM(3, 1, arities)
  32. /**/
  33. #include <boost/preprocessor/arithmetic/sub.hpp>
  34. #include <boost/preprocessor/repetition/enum_trailing.hpp>
  35. #include <boost/preprocessor/tuple/rem.hpp>
  36. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0(r, n, elem, data) \
  37. (( \
  38. BOOST_PP_TUPLE_ELEM(3, 2, data) \
  39. , BOOST_PP_TUPLE_REM(BOOST_PP_TUPLE_ELEM(3, 0, data)) elem \
  40. BOOST_PP_ENUM_TRAILING( \
  41. BOOST_PP_SUB( \
  42. BOOST_PP_TUPLE_ELEM(3, 1, data) \
  43. , BOOST_PP_TUPLE_ELEM(3, 0, data) \
  44. ) \
  45. , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0_DUMMY_ELEM \
  46. , ~ \
  47. ) \
  48. ))
  49. /**/
  50. #include <boost/parameter/aux_/preprocessor/impl/for_each.hpp>
  51. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \
  52. r, arity, max_arity, spec, xform \
  53. ) \
  54. BOOST_PARAMETER_AUX_PP_FOR_EACH_R( \
  55. r \
  56. , arity \
  57. , BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(spec) \
  58. , ( \
  59. arity \
  60. , max_arity \
  61. , xform(BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec)) \
  62. ) \
  63. , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0 \
  64. )
  65. /**/
  66. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_optional(r, arities, spec) \
  67. BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \
  68. r \
  69. , BOOST_PP_CAT( \
  70. BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_ \
  71. , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \
  72. )(arities) \
  73. , BOOST_PP_TUPLE_ELEM(3, 2, arities) \
  74. , spec \
  75. , BOOST_PARAMETER_AUX_PP_FLATTEN_IDENTITY \
  76. )
  77. /**/
  78. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_required(r, arities, spec) \
  79. BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_optional(r, arities, spec)
  80. /**/
  81. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced_M(r, arities, n, spec) \
  82. BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \
  83. r \
  84. , BOOST_PP_CAT( \
  85. BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_ \
  86. , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \
  87. )(arities) \
  88. , BOOST_PP_TUPLE_ELEM(3, 2, arities) \
  89. , spec \
  90. , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AS_DEDUCED \
  91. )
  92. /**/
  93. #include <boost/preprocessor/seq/for_each_i.hpp>
  94. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced(r, arities, spec) \
  95. BOOST_PP_SEQ_FOR_EACH_I_R( \
  96. r \
  97. , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced_M \
  98. , arities \
  99. , BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(spec) \
  100. )
  101. /**/
  102. #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC(r, arities, spec) \
  103. BOOST_PP_CAT( \
  104. BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_ \
  105. , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \
  106. )(r, arities, spec)
  107. /**/
  108. #include <boost/preprocessor/seq/for_each.hpp>
  109. #define BOOST_PARAMETER_AUX_PP_FLATTEN( \
  110. opt_arity, req_arity, wanted_arity, specs \
  111. ) \
  112. BOOST_PP_SEQ_FOR_EACH( \
  113. BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC \
  114. , (opt_arity, req_arity, wanted_arity) \
  115. , specs \
  116. )
  117. /**/
  118. #endif // include guard