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