orderable.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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/concept/orderable.hpp>
  6. #include <boost/hana/greater.hpp>
  7. #include <boost/hana/greater_equal.hpp>
  8. #include <boost/hana/less.hpp>
  9. #include <boost/hana/less_equal.hpp>
  10. #include <boost/hana/max.hpp>
  11. #include <boost/hana/min.hpp>
  12. #include <boost/hana/not.hpp>
  13. #include <boost/hana/tuple.hpp>
  14. #include <laws/base.hpp>
  15. #include <laws/comparable.hpp>
  16. #include <laws/orderable.hpp>
  17. #include <string>
  18. #include <type_traits>
  19. namespace hana = boost::hana;
  20. using namespace std::literals;
  21. // Minimal LessThanComparable types
  22. struct ord1 { int value; };
  23. struct ord2 {
  24. int value;
  25. constexpr operator ord1() const { return {value}; }
  26. };
  27. template <typename T, typename U, typename = std::enable_if_t<
  28. (std::is_same<T, ord1>{} || std::is_same<T, ord2>{}) &&
  29. (std::is_same<U, ord1>{} || std::is_same<U, ord2>{})
  30. >>
  31. constexpr bool operator<(T a, U b)
  32. { return a.value < b.value; }
  33. namespace boost { namespace hana {
  34. template <typename T, typename U>
  35. struct equal_impl<T, U, when<
  36. (std::is_same<T, ord1>{} || std::is_same<T, ord2>{}) &&
  37. (std::is_same<U, ord1>{} || std::is_same<U, ord2>{})
  38. >> {
  39. static constexpr bool apply(T a, U b)
  40. { return a.value == b.value; }
  41. };
  42. }}
  43. int main() {
  44. // laws
  45. hana::test::TestOrderable<int>{hana::make_tuple(0,1,2,3,4,5)};
  46. hana::test::TestOrderable<unsigned int>{hana::make_tuple(0u,1u,2u,3u,4u,5u)};
  47. hana::test::TestOrderable<long>{hana::make_tuple(0l,1l,2l,3l,4l,5l)};
  48. hana::test::TestOrderable<unsigned long>{hana::make_tuple(0ul,1ul,2ul,3ul,4ul,5ul)};
  49. hana::test::TestOrderable<ord1>{hana::make_tuple(ord1{0}, ord1{1}, ord1{2}, ord1{3}, ord1{4})};
  50. // Orderable => Comparable
  51. hana::test::TestComparable<ord1>{hana::make_tuple(ord1{0}, ord1{1}, ord1{2}, ord1{3}, ord1{4})};
  52. // less
  53. {
  54. BOOST_HANA_CONSTEXPR_CHECK(hana::less(5, 6));
  55. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(6, 6)));
  56. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(7, 6)));
  57. // Provided model for LessThanComparable types
  58. BOOST_HANA_CONSTEXPR_CHECK(hana::less(ord1{0}, ord1{1}));
  59. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord1{0}, ord1{0})));
  60. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord1{1}, ord1{0})));
  61. BOOST_HANA_CONSTEXPR_CHECK(hana::less(ord1{0}, ord2{1}));
  62. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord1{0}, ord2{0})));
  63. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord1{1}, ord2{0})));
  64. BOOST_HANA_CONSTEXPR_CHECK(hana::less(ord2{0}, ord1{1}));
  65. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord2{0}, ord1{0})));
  66. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less(ord2{1}, ord1{0})));
  67. BOOST_HANA_RUNTIME_CHECK(hana::less("ab", "abc"s));
  68. BOOST_HANA_RUNTIME_CHECK(hana::less("abc"s, "abcde"));
  69. }
  70. // greater
  71. {
  72. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::greater(5, 6)));
  73. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::greater(6, 6)));
  74. BOOST_HANA_CONSTEXPR_CHECK(hana::greater(7, 6));
  75. BOOST_HANA_RUNTIME_CHECK(hana::greater("abcd", "ab"s));
  76. BOOST_HANA_RUNTIME_CHECK(hana::greater("abc"s, "abb"));
  77. }
  78. // less_equal
  79. {
  80. BOOST_HANA_CONSTEXPR_CHECK(hana::less_equal(5, 6));
  81. BOOST_HANA_CONSTEXPR_CHECK(hana::less_equal(6, 6));
  82. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::less_equal(7, 6)));
  83. BOOST_HANA_RUNTIME_CHECK(hana::less_equal("ab", "abcd"s));
  84. BOOST_HANA_RUNTIME_CHECK(hana::less_equal("abc"s, "abc"));
  85. }
  86. // greater_equal
  87. {
  88. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::greater_equal(5, 6)));
  89. BOOST_HANA_CONSTEXPR_CHECK(hana::greater_equal(6, 6));
  90. BOOST_HANA_CONSTEXPR_CHECK(hana::greater_equal(7, 6));
  91. BOOST_HANA_RUNTIME_CHECK(hana::greater_equal("abcd", "ab"s));
  92. BOOST_HANA_RUNTIME_CHECK(hana::greater_equal("abc"s, "abc"));
  93. }
  94. // min
  95. {
  96. BOOST_HANA_CONSTEXPR_CHECK(hana::equal(hana::min(5, 6), 5));
  97. BOOST_HANA_CONSTEXPR_CHECK(hana::equal(hana::min(6, 5), 5));
  98. }
  99. // max
  100. {
  101. BOOST_HANA_CONSTEXPR_CHECK(hana::equal(hana::max(5, 6), 6));
  102. BOOST_HANA_CONSTEXPR_CHECK(hana::equal(hana::max(6, 5), 6));
  103. }
  104. }