cnstr.variadic.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/assert.hpp>
  5. #include <boost/hana/at_key.hpp>
  6. #include <boost/hana/equal.hpp>
  7. #include <boost/hana/map.hpp>
  8. #include <boost/hana/pair.hpp>
  9. #include <laws/base.hpp>
  10. #include <support/constexpr_move_only.hpp>
  11. #include <support/minimal_product.hpp>
  12. #include <support/tracked_move_only.hpp>
  13. #include <string>
  14. #include <vector>
  15. namespace hana = boost::hana;
  16. template <int i>
  17. using pair = ::product_t<hana::test::ct_eq<i>, hana::test::ct_eq<-i>>;
  18. // Check with move-only literal types.
  19. constexpr bool in_constexpr_context() {
  20. hana::map<hana::pair<ConstexprMoveOnly<2>, ConstexprMoveOnly<20>>,
  21. hana::pair<ConstexprMoveOnly<3>, ConstexprMoveOnly<30>>> map{
  22. hana::make_pair(ConstexprMoveOnly<2>{}, ConstexprMoveOnly<20>{}),
  23. hana::make_pair(ConstexprMoveOnly<3>{}, ConstexprMoveOnly<30>{})
  24. };
  25. (void)map;
  26. return true;
  27. }
  28. static_assert(in_constexpr_context(), "");
  29. int main() {
  30. // Basic check with non trivial runtime state
  31. {
  32. std::vector<std::string> v{"Hello", "world", "!"};
  33. hana::map<
  34. hana::pair<hana::test::ct_eq<1>, std::string>,
  35. hana::pair<hana::test::ct_eq<2>, std::vector<std::string>>
  36. > map{
  37. hana::make_pair(hana::test::ct_eq<1>{}, std::string{"Hello world!"}),
  38. hana::make_pair(hana::test::ct_eq<2>{}, v)
  39. };
  40. BOOST_HANA_RUNTIME_CHECK(
  41. hana::at_key(map, hana::test::ct_eq<1>{}) == std::string{"Hello world!"}
  42. );
  43. BOOST_HANA_RUNTIME_CHECK(
  44. hana::at_key(map, hana::test::ct_eq<2>{}) == v
  45. );
  46. }
  47. {
  48. hana::map<> map{};
  49. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  50. map,
  51. hana::make_map()
  52. ));
  53. }
  54. {
  55. hana::map<pair<0>> map{pair<0>{}};
  56. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  57. map,
  58. hana::make_map(pair<0>{})
  59. ));
  60. }
  61. {
  62. hana::map<pair<0>, pair<1>> map{pair<0>{}, pair<1>{}};
  63. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  64. map,
  65. hana::make_map(pair<0>{}, pair<1>{})
  66. ));
  67. }
  68. {
  69. hana::map<pair<0>, pair<1>, pair<2>> map{pair<0>{}, pair<1>{}, pair<2>{}};
  70. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  71. map,
  72. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{})
  73. ));
  74. }
  75. {
  76. hana::map<pair<0>, pair<1>, pair<2>, pair<3>> map{
  77. pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}
  78. };
  79. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  80. map,
  81. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{})
  82. ));
  83. }
  84. {
  85. hana::map<pair<0>, pair<1>, pair<2>, pair<3>, pair<4>> map{
  86. pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}
  87. };
  88. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  89. map,
  90. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{})
  91. ));
  92. }
  93. {
  94. hana::map<pair<0>, pair<1>, pair<2>, pair<3>, pair<4>, pair<5>> map{
  95. pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}, pair<5>{}
  96. };
  97. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  98. map,
  99. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}, pair<5>{})
  100. ));
  101. }
  102. // Use parenthesis syntax instead of braces
  103. {
  104. hana::map<> map = hana::map<>();
  105. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  106. map,
  107. hana::make_map()
  108. ));
  109. }
  110. {
  111. hana::map<pair<0>> map(
  112. pair<0>{}
  113. );
  114. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  115. map,
  116. hana::make_map(pair<0>{})
  117. ));
  118. }
  119. {
  120. hana::map<pair<0>, pair<1>> map(
  121. pair<0>{}, pair<1>{}
  122. );
  123. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  124. map,
  125. hana::make_map(pair<0>{}, pair<1>{})
  126. ));
  127. }
  128. {
  129. hana::map<pair<0>, pair<1>, pair<2>> map(
  130. pair<0>{}, pair<1>{}, pair<2>{}
  131. );
  132. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  133. map,
  134. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{})
  135. ));
  136. }
  137. {
  138. hana::map<pair<0>, pair<1>, pair<2>, pair<3>> map(
  139. pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}
  140. );
  141. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  142. map,
  143. hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{})
  144. ));
  145. }
  146. // Check with move-only types
  147. {
  148. hana::map<hana::pair<TrackedMoveOnly<1>, TrackedMoveOnly<10>>,
  149. hana::pair<TrackedMoveOnly<2>, TrackedMoveOnly<20>>> map{
  150. hana::make_pair(TrackedMoveOnly<1>{}, TrackedMoveOnly<10>{}),
  151. hana::make_pair(TrackedMoveOnly<2>{}, TrackedMoveOnly<20>{})
  152. };
  153. }
  154. // The following used to fail when we did not constrain the
  155. // constructor properly:
  156. {
  157. hana::map<pair<1>> map{};
  158. hana::test::_injection<0> f{};
  159. auto x = f(map);
  160. }
  161. }