|
19 | 19 |
|
20 | 20 | #include <utility> |
21 | 21 | #include <cassert> |
| 22 | +#include <concepts> |
22 | 23 |
|
23 | 24 | #include "test_macros.h" |
24 | 25 |
|
| 26 | +#if TEST_STD_VER >= 26 |
| 27 | + |
| 28 | +// template <typename T> |
| 29 | +// class EqualityComparable { |
| 30 | +// public: |
| 31 | +// constexpr EqualityComparable(T value) : value_{value} {}; |
| 32 | + |
| 33 | +// friend constexpr bool operator==(const EqualityComparable&, const EqualityComparable&) noexcept = default; |
| 34 | + |
| 35 | +// private: |
| 36 | +// T value_; |
| 37 | +// }; |
| 38 | + |
| 39 | +// static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>>); |
| 40 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, std::pair<int,int>>); |
| 41 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, EqualityComparable<std::pair<int,int>>>); |
| 42 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, std::pair<int,int>, std::pair<int,int>>); |
| 43 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, EqualityComparable<std::pair<int,int>>, std::pair<int,int>>); |
| 44 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, std::pair<int,int>, EqualityComparable<std::pair<int,int>>>); |
| 45 | +// // static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, EqualityComparable<std::pair<int,int>>, EqualityComparable<std::pair<int,int>>>); |
| 46 | +// static_assert(std::equality_comparable<EqualityComparable<std::pair<int,int>>, std::pair<int,int>, std::pair<int,int>, EqualityComparable<std::pair<int,int>>>); |
| 47 | +// static_assert(EqualityComparable<std::pair<int,int>>{std::pair{94, 82}} == EqualityComparable<std::pair<int,int>>{std::pair{94, 82}}); |
| 48 | +// static_assert(EqualityComparable<std::pair<int,int>>{std::pair{94, 82}} != EqualityComparable<std::pair<int,int>>{std::pair{82, 82}}); |
| 49 | + |
| 50 | +struct EqualityComparable { |
| 51 | + constexpr EqualityComparable(int value) : value_{value} {}; |
| 52 | + |
| 53 | + friend constexpr bool operator==(const EqualityComparable&, const EqualityComparable&) noexcept = default; |
| 54 | + |
| 55 | + int value_; |
| 56 | +}; |
| 57 | + |
| 58 | +static_assert(std::equality_comparable<EqualityComparable>); |
| 59 | +static_assert(EqualityComparable{94} == EqualityComparable{94}); |
| 60 | +static_assert(EqualityComparable{94} != EqualityComparable{82}); |
| 61 | + |
| 62 | +static_assert(std::equality_comparable<std::pair<EqualityComparable, EqualityComparable>>); |
| 63 | +static_assert(std::pair{EqualityComparable{94}, EqualityComparable{94}} == |
| 64 | + std::pair{EqualityComparable{94}, EqualityComparable{94}}); |
| 65 | +static_assert(std::pair{EqualityComparable{82}, EqualityComparable{94}} != |
| 66 | + std::pair{EqualityComparable{94}, EqualityComparable{94}}); |
| 67 | +static_assert(std::pair{EqualityComparable{94}, EqualityComparable{82}} != |
| 68 | + std::pair{EqualityComparable{94}, EqualityComparable{94}}); |
| 69 | + |
| 70 | +struct NonComparable {}; |
| 71 | + |
| 72 | +static_assert(!std::three_way_comparable<std::pair<NonComparable, NonComparable>>); |
| 73 | +static_assert(!std::three_way_comparable<std::pair<EqualityComparable, NonComparable>>); |
| 74 | +static_assert(!std::three_way_comparable<std::pair<NonComparable, EqualityComparable>>); |
| 75 | + |
| 76 | +static_assert(!std::equality_comparable<std::pair<EqualityComparable, NonComparable>>); |
| 77 | +static_assert(!std::equality_comparable<std::pair<NonComparable, EqualityComparable>>); |
| 78 | + |
| 79 | + |
| 80 | +template <typename T, typename U> |
| 81 | +concept HasCompare = requires(T t, U u) { |
| 82 | + { t == u } -> std::same_as<bool>; |
| 83 | + { t != u } -> std::same_as<bool>; |
| 84 | + { t < u } -> std::same_as<bool>; |
| 85 | + { t > u } -> std::same_as<bool>; |
| 86 | + { t <= u } -> std::same_as<bool>; |
| 87 | + { t >= u } -> std::same_as<bool>; |
| 88 | +}; |
| 89 | + |
| 90 | +template <typename T, typename U> |
| 91 | +concept HasCompare = requires(std::pair p1, std::pair p2) { |
| 92 | + { t == u } -> std::same_as<bool>; |
| 93 | + { t != u } -> std::same_as<bool>; |
| 94 | + { t < u } -> std::same_as<bool>; |
| 95 | + { t > u } -> std::same_as<bool>; |
| 96 | + { t <= u } -> std::same_as<bool>; |
| 97 | + { t >= u } -> std::same_as<bool>; |
| 98 | +}; |
| 99 | + |
| 100 | +#endif // TEST_STD_VER >= 26 |
| 101 | + |
25 | 102 | int main(int, char**) |
26 | 103 | { |
27 | 104 | { |
|
0 commit comments