sort.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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_SORT_HPP
  5. #define BOOST_HANA_TEST_AUTO_SORT_HPP
  6. #include <boost/hana/all_of.hpp>
  7. #include <boost/hana/assert.hpp>
  8. #include <boost/hana/equal.hpp>
  9. #include <boost/hana/less.hpp>
  10. #include <boost/hana/permutations.hpp>
  11. #include <boost/hana/sort.hpp>
  12. #include <boost/hana/transform.hpp>
  13. #include "test_case.hpp"
  14. #include <laws/base.hpp>
  15. #include <support/equivalence_class.hpp>
  16. TestCase test_sort{[]{
  17. namespace hana = boost::hana;
  18. using hana::test::ct_eq;
  19. using hana::test::ct_ord;
  20. // Test without a custom predicate
  21. {
  22. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  23. hana::sort(MAKE_TUPLE()),
  24. MAKE_TUPLE()
  25. ));
  26. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  27. hana::sort(MAKE_TUPLE(ct_ord<0>{})),
  28. MAKE_TUPLE(ct_ord<0>{})
  29. ));
  30. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  31. hana::sort(MAKE_TUPLE(ct_ord<0>{}, ct_ord<1>{})),
  32. MAKE_TUPLE(ct_ord<0>{}, ct_ord<1>{})
  33. ));
  34. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  35. hana::sort(MAKE_TUPLE(ct_ord<1>{}, ct_ord<0>{})),
  36. MAKE_TUPLE(ct_ord<0>{}, ct_ord<1>{})
  37. ));
  38. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  39. hana::sort(MAKE_TUPLE(ct_ord<1>{}, ct_ord<0>{}, ct_ord<4>{}, ct_ord<2>{})),
  40. MAKE_TUPLE(ct_ord<0>{}, ct_ord<1>{}, ct_ord<2>{}, ct_ord<4>{})
  41. ));
  42. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  43. hana::sort(MAKE_TUPLE(ct_ord<1>{}, ct_ord<0>{}, ct_ord<-4>{}, ct_ord<2>{})),
  44. MAKE_TUPLE(ct_ord<-4>{}, ct_ord<0>{}, ct_ord<1>{}, ct_ord<2>{})
  45. ));
  46. }
  47. // Test with a custom predicate
  48. {
  49. auto pred = [](auto x, auto y) {
  50. return hana::less(x.unwrap, y.unwrap);
  51. };
  52. auto a = [](auto z) { return ::equivalence_class(ct_eq<999>{}, z); };
  53. auto b = [](auto z) { return ::equivalence_class(ct_eq<888>{}, z); };
  54. auto check = [=](auto ...sorted) {
  55. auto perms = hana::transform(
  56. hana::permutations(MAKE_TUPLE(a(sorted)...)),
  57. hana::sort.by(pred)
  58. );
  59. BOOST_HANA_CONSTANT_CHECK(hana::all_of(perms, [=](auto xs) {
  60. return hana::equal(xs, MAKE_TUPLE(a(sorted)...));
  61. }));
  62. };
  63. check();
  64. check(ct_ord<1>{});
  65. check(ct_ord<1>{}, ct_ord<2>{});
  66. check(ct_ord<1>{}, ct_ord<2>{}, ct_ord<3>{});
  67. // check stability
  68. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  69. hana::sort(MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{})), pred),
  70. MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{}))
  71. ));
  72. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  73. hana::sort(MAKE_TUPLE(b(ct_ord<1>{}), a(ct_ord<1>{})), pred),
  74. MAKE_TUPLE(b(ct_ord<1>{}), a(ct_ord<1>{}))
  75. ));
  76. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  77. hana::sort(MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{})), pred),
  78. MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{}))
  79. ));
  80. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  81. hana::sort(MAKE_TUPLE(a(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<1>{}), b(ct_ord<2>{})), pred),
  82. MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{}))
  83. ));
  84. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  85. hana::sort(MAKE_TUPLE(b(ct_ord<1>{}), a(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{})), pred),
  86. MAKE_TUPLE(b(ct_ord<1>{}), a(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{}))
  87. ));
  88. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  89. hana::sort(MAKE_TUPLE(a(ct_ord<2>{}), b(ct_ord<1>{}), b(ct_ord<2>{}), a(ct_ord<1>{})), pred),
  90. MAKE_TUPLE(b(ct_ord<1>{}), a(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<2>{}))
  91. ));
  92. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  93. hana::sort(MAKE_TUPLE(a(ct_ord<1>{}), a(ct_ord<3>{}), b(ct_ord<1>{}), a(ct_ord<2>{}), b(ct_ord<3>{})), pred),
  94. MAKE_TUPLE(a(ct_ord<1>{}), b(ct_ord<1>{}), a(ct_ord<2>{}), a(ct_ord<3>{}), b(ct_ord<3>{}))
  95. ));
  96. }
  97. }};
  98. #endif // !BOOST_HANA_TEST_AUTO_SORT_HPP