macros_eval_category.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright Cromwell D. Enage 2017.
  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. #include <boost/parameter/config.hpp>
  6. #if (BOOST_PARAMETER_MAX_ARITY < 10)
  7. #error Define BOOST_PARAMETER_MAX_ARITY as 10 or greater.
  8. #endif
  9. #include <boost/parameter.hpp>
  10. namespace test {
  11. BOOST_PARAMETER_NAME(in(lrc0))
  12. BOOST_PARAMETER_NAME(out(lr0))
  13. BOOST_PARAMETER_NAME(in(rrc0))
  14. #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
  15. BOOST_PARAMETER_NAME(consume(rr0))
  16. #else
  17. BOOST_PARAMETER_NAME(rr0)
  18. #endif
  19. BOOST_PARAMETER_NAME(in(lrc1))
  20. BOOST_PARAMETER_NAME(out(lr1))
  21. BOOST_PARAMETER_NAME(in(rrc1))
  22. BOOST_PARAMETER_NAME(in(lrc2))
  23. BOOST_PARAMETER_NAME(out(lr2))
  24. BOOST_PARAMETER_NAME(rr2)
  25. struct g_parameters
  26. : boost::parameter::parameters<
  27. boost::parameter::required<test::tag::lrc0>
  28. , boost::parameter::required<test::tag::lr0>
  29. , boost::parameter::required<test::tag::rrc0>
  30. , boost::parameter::required<test::tag::rr0>
  31. , boost::parameter::required<test::tag::lrc1>
  32. , boost::parameter::required<test::tag::lr1>
  33. , boost::parameter::required<test::tag::rrc1>
  34. , boost::parameter::optional<test::tag::lrc2>
  35. , boost::parameter::optional<test::tag::lr2>
  36. , boost::parameter::optional<test::tag::rr2>
  37. >
  38. {
  39. };
  40. } // namespace test
  41. #include <boost/parameter/macros.hpp>
  42. #include <boost/core/lightweight_test.hpp>
  43. #include "evaluate_category.hpp"
  44. namespace test {
  45. struct C
  46. {
  47. BOOST_PARAMETER_MEMFUN(static int, evaluate, 7, 10, g_parameters)
  48. {
  49. BOOST_TEST_EQ(
  50. test::passed_by_lvalue_reference_to_const
  51. , U::evaluate_category<0>(p[test::_lrc0])
  52. );
  53. BOOST_TEST_EQ(
  54. test::passed_by_lvalue_reference
  55. , U::evaluate_category<0>(p[test::_lr0])
  56. );
  57. BOOST_TEST_EQ(
  58. test::passed_by_lvalue_reference_to_const
  59. , U::evaluate_category<1>(p[test::_lrc1])
  60. );
  61. BOOST_TEST_EQ(
  62. test::passed_by_lvalue_reference
  63. , U::evaluate_category<1>(p[test::_lr1])
  64. );
  65. BOOST_TEST_EQ(
  66. test::passed_by_lvalue_reference_to_const
  67. , U::evaluate_category<2>(
  68. p[test::_lrc2 | test::lvalue_const_bitset<2>()]
  69. )
  70. );
  71. BOOST_TEST_EQ(
  72. test::passed_by_lvalue_reference
  73. , U::evaluate_category<2>(
  74. p[test::_lr2 || test::lvalue_bitset_function<2>()]
  75. )
  76. );
  77. #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
  78. BOOST_TEST_EQ(
  79. test::passed_by_rvalue_reference_to_const
  80. , U::evaluate_category<0>(p[test::_rrc0])
  81. );
  82. BOOST_TEST_EQ(
  83. test::passed_by_rvalue_reference
  84. , U::evaluate_category<0>(p[test::_rr0])
  85. );
  86. BOOST_TEST_EQ(
  87. test::passed_by_rvalue_reference_to_const
  88. , U::evaluate_category<1>(p[test::_rrc1])
  89. );
  90. BOOST_TEST_EQ(
  91. test::passed_by_rvalue_reference
  92. , U::evaluate_category<2>(
  93. p[test::_rr2 || test::rvalue_bitset_function<2>()]
  94. )
  95. );
  96. #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
  97. BOOST_TEST_EQ(
  98. test::passed_by_lvalue_reference_to_const
  99. , U::evaluate_category<0>(p[test::_rrc0])
  100. );
  101. BOOST_TEST_EQ(
  102. test::passed_by_lvalue_reference_to_const
  103. , U::evaluate_category<0>(p[test::_rr0])
  104. );
  105. BOOST_TEST_EQ(
  106. test::passed_by_lvalue_reference_to_const
  107. , U::evaluate_category<1>(p[test::_rrc1])
  108. );
  109. BOOST_TEST_EQ(
  110. test::passed_by_lvalue_reference_to_const
  111. , U::evaluate_category<2>(
  112. p[test::_rr2 || test::rvalue_bitset_function<2>()]
  113. )
  114. );
  115. #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
  116. return 0;
  117. }
  118. };
  119. } // namespace test
  120. #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
  121. #include <boost/core/ref.hpp>
  122. #endif
  123. int main()
  124. {
  125. #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) || \
  126. (10 < BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY)
  127. test::C::evaluate(
  128. test::lvalue_const_bitset<0>()
  129. , test::lvalue_bitset<0>()
  130. , test::rvalue_const_bitset<0>()
  131. , test::rvalue_bitset<0>()
  132. , test::lvalue_const_bitset<1>()
  133. , test::lvalue_bitset<1>()
  134. , test::rvalue_const_bitset<1>()
  135. );
  136. test::C::evaluate(
  137. test::lvalue_const_bitset<0>()
  138. , test::lvalue_bitset<0>()
  139. , test::rvalue_const_bitset<0>()
  140. , test::rvalue_bitset<0>()
  141. , test::lvalue_const_bitset<1>()
  142. , test::lvalue_bitset<1>()
  143. , test::rvalue_const_bitset<1>()
  144. , test::lvalue_const_bitset<2>()
  145. , test::lvalue_bitset<2>()
  146. , test::rvalue_bitset<2>()
  147. );
  148. #else // no perfect forwarding support and no exponential overloads
  149. test::C::evaluate(
  150. test::lvalue_const_bitset<0>()
  151. , boost::ref(test::lvalue_bitset<0>())
  152. , test::rvalue_const_bitset<0>()
  153. , test::rvalue_bitset<0>()
  154. , test::lvalue_const_bitset<1>()
  155. , boost::ref(test::lvalue_bitset<1>())
  156. , test::rvalue_const_bitset<1>()
  157. );
  158. test::C::evaluate(
  159. test::lvalue_const_bitset<0>()
  160. , boost::ref(test::lvalue_bitset<0>())
  161. , test::rvalue_const_bitset<0>()
  162. , test::rvalue_bitset<0>()
  163. , test::lvalue_const_bitset<1>()
  164. , boost::ref(test::lvalue_bitset<1>())
  165. , test::rvalue_const_bitset<1>()
  166. , test::lvalue_const_bitset<2>()
  167. , boost::ref(test::lvalue_bitset<2>())
  168. , test::rvalue_bitset<2>()
  169. );
  170. #endif // perfect forwarding support, or exponential overloads
  171. return boost::report_errors();
  172. }