unique.hpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. #ifndef BOOST_HANA_TEST_AUTO_UNIQUE_HPP
  5. #define BOOST_HANA_TEST_AUTO_UNIQUE_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/equal.hpp>
  8. #include <boost/hana/unique.hpp>
  9. #include "test_case.hpp"
  10. #include <laws/base.hpp>
  11. #include <support/equivalence_class.hpp>
  12. TestCase test_unique{[]{
  13. namespace hana = boost::hana;
  14. using hana::test::ct_eq;
  15. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  16. hana::unique(MAKE_TUPLE()),
  17. MAKE_TUPLE()
  18. ));
  19. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  20. hana::unique(MAKE_TUPLE(ct_eq<0>{})),
  21. MAKE_TUPLE(ct_eq<0>{})
  22. ));
  23. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  24. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{})),
  25. MAKE_TUPLE(ct_eq<0>{})
  26. ));
  27. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  28. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
  29. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  30. ));
  31. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  32. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<0>{})),
  33. MAKE_TUPLE(ct_eq<0>{})
  34. ));
  35. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  36. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{}, ct_eq<1>{})),
  37. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  38. ));
  39. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  40. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<0>{})),
  41. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<0>{})
  42. ));
  43. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  44. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<1>{})),
  45. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  46. ));
  47. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  48. hana::unique(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
  49. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
  50. ));
  51. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  52. hana::unique(MAKE_TUPLE(
  53. ct_eq<0>{}, ct_eq<0>{},
  54. ct_eq<1>{},
  55. ct_eq<2>{}, ct_eq<2>{}, ct_eq<2>{},
  56. ct_eq<3>{}, ct_eq<3>{}, ct_eq<3>{},
  57. ct_eq<0>{})),
  58. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<0>{})
  59. ));
  60. }};
  61. TestCase test_unique_by{[]{
  62. namespace hana = boost::hana;
  63. using hana::test::ct_eq;
  64. struct undefined { };
  65. auto a = [](auto z) { return ::equivalence_class(ct_eq<999>{}, z); };
  66. auto b = [](auto z) { return ::equivalence_class(ct_eq<888>{}, z); };
  67. auto c = [](auto z) { return ::equivalence_class(ct_eq<777>{}, z); };
  68. auto pred = [](auto x, auto y) {
  69. return hana::equal(x.unwrap, y.unwrap);
  70. };
  71. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  72. hana::unique(MAKE_TUPLE(), undefined{}),
  73. MAKE_TUPLE()
  74. ));
  75. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  76. hana::unique(MAKE_TUPLE(a(ct_eq<0>{})), pred),
  77. MAKE_TUPLE(a(ct_eq<0>{}))
  78. ));
  79. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  80. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{})), pred),
  81. MAKE_TUPLE(a(ct_eq<0>{}))
  82. ));
  83. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  84. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{})), pred),
  85. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}))
  86. ));
  87. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  88. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), c(ct_eq<0>{})), pred),
  89. MAKE_TUPLE(a(ct_eq<0>{}))
  90. ));
  91. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  92. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<0>{}), c(ct_eq<1>{})), pred),
  93. MAKE_TUPLE(a(ct_eq<0>{}), c(ct_eq<1>{}))
  94. ));
  95. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  96. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<0>{})), pred),
  97. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<0>{}))
  98. ));
  99. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  100. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<1>{}), b(ct_eq<1>{})), pred),
  101. MAKE_TUPLE(a(ct_eq<0>{}), b(ct_eq<1>{}))
  102. ));
  103. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  104. hana::unique(MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<2>{})), pred),
  105. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<2>{}))
  106. ));
  107. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  108. hana::unique(MAKE_TUPLE(
  109. a(ct_eq<0>{}), b(ct_eq<0>{}),
  110. a(ct_eq<1>{}),
  111. a(ct_eq<2>{}), b(ct_eq<2>{}), c(ct_eq<2>{}),
  112. a(ct_eq<3>{}), b(ct_eq<3>{}), c(ct_eq<3>{}),
  113. a(ct_eq<0>{})), pred),
  114. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<2>{}), a(ct_eq<3>{}), a(ct_eq<0>{}))
  115. ));
  116. // unique.by
  117. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  118. hana::unique.by(pred, MAKE_TUPLE(
  119. a(ct_eq<0>{}), b(ct_eq<0>{}),
  120. a(ct_eq<1>{}),
  121. a(ct_eq<2>{}), b(ct_eq<2>{}), c(ct_eq<2>{}),
  122. a(ct_eq<3>{}), b(ct_eq<3>{}), c(ct_eq<3>{}),
  123. a(ct_eq<0>{}))),
  124. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<2>{}), a(ct_eq<3>{}), a(ct_eq<0>{}))
  125. ));
  126. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  127. hana::unique.by(pred)(MAKE_TUPLE(
  128. a(ct_eq<0>{}), b(ct_eq<0>{}),
  129. a(ct_eq<1>{}),
  130. a(ct_eq<2>{}), b(ct_eq<2>{}), c(ct_eq<2>{}),
  131. a(ct_eq<3>{}), b(ct_eq<3>{}), c(ct_eq<3>{}),
  132. a(ct_eq<0>{}))),
  133. MAKE_TUPLE(a(ct_eq<0>{}), a(ct_eq<1>{}), a(ct_eq<2>{}), a(ct_eq<3>{}), a(ct_eq<0>{}))
  134. ));
  135. }};
  136. #endif // !BOOST_HANA_TEST_AUTO_UNIQUE_HPP