di 0.1.0
Loading...
Searching...
No Matches
compare.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/core.h"
7#include "di/util/declval.h"
8
9namespace di::meta {
10namespace detail {
11 template<typename... Types>
12 struct CommonComparisonCategoryHelper : TypeConstant<void> {};
13
14 template<>
15 struct CommonComparisonCategoryHelper<> : TypeConstant<strong_ordering> {};
16
17 template<typename... Types>
18 struct CommonComparisonCategoryHelper<partial_ordering, Types...> : TypeConstant<partial_ordering> {};
19
20 template<typename... Types>
21 struct CommonComparisonCategoryHelper<weak_ordering, Types...>
22 : TypeConstant<
23 Conditional<concepts::SameAs<partial_ordering, typename CommonComparisonCategoryHelper<Types...>::Type>,
24 partial_ordering, weak_ordering>> {};
25
26 template<typename... Types>
27 struct CommonComparisonCategoryHelper<strong_ordering, Types...> : CommonComparisonCategoryHelper<Types...> {};
28}
29
30template<typename... Types>
31using CommonComparisonCategory = Type<detail::CommonComparisonCategoryHelper<Types...>>;
32}
33
34namespace di::concepts {
35namespace detail {
36 template<typename T, typename Category>
37 concept ComparesAs = SameAs<meta::CommonComparisonCategory<T, Category>, Category>;
38
39 template<typename T, typename U>
40 struct DefinitelyEqualityComparableWith {
41 constexpr static bool value = false;
42 };
43
44 template<typename T, typename U>
45 struct DefinitelyThreeWayComparableWith {
46 using Type = void;
47 };
48
49 template<typename T, typename U>
50 concept WeaklyEqualityComparableWith =
51 (detail::DefinitelyEqualityComparableWith<T, U>::value) ||
52 requires(meta::RemoveReference<T> const& a, meta::RemoveReference<U> const& b) {
53 { a == b } -> SameAs<bool>;
54 { a != b } -> SameAs<bool>;
55 { b == a } -> SameAs<bool>;
56 { b != a } -> SameAs<bool>;
57 };
58
59 template<typename T, typename U>
60 concept PartiallyOrderedWith =
62 requires(meta::RemoveReference<T> const& a, meta::RemoveReference<U> const& b) {
63 { a < b } -> SameAs<bool>;
64 { a > b } -> SameAs<bool>;
65 { a <= b } -> SameAs<bool>;
66 { a >= b } -> SameAs<bool>;
67 { b < a } -> SameAs<bool>;
68 { b > a } -> SameAs<bool>;
69 { b <= a } -> SameAs<bool>;
70 { b >= a } -> SameAs<bool>;
71 };
72
73 template<typename T, typename U, typename Category>
74 concept WeaklyThreeWayComparableWith =
75 requires(meta::RemoveReference<T> const& a, meta::RemoveReference<U> const& b) {
76 { a <=> b } -> ComparesAs<Category>;
77 { b <=> a } -> ComparesAs<Category>;
78 };
79}
80
81template<typename T>
83 detail::DefinitelyEqualityComparableWith<T, T>::value || detail::WeaklyEqualityComparableWith<T, T>;
84
85template<typename T, typename U>
87 detail::DefinitelyEqualityComparableWith<T, U>::value ||
88 (EqualityComparable<T> && EqualityComparable<U> && detail::WeaklyEqualityComparableWith<T, U>);
89
90template<typename T, typename Category = partial_ordering>
92 (detail::ComparesAs<meta::Type<detail::DefinitelyThreeWayComparableWith<T, T>>, Category>) ||
93 (detail::WeaklyEqualityComparableWith<T, T> && detail::PartiallyOrderedWith<T, T> &&
94 detail::WeaklyThreeWayComparableWith<T, T, Category>);
95
96template<typename T, typename U, typename Category = partial_ordering>
98 (detail::ComparesAs<meta::Type<detail::DefinitelyThreeWayComparableWith<T, T>>, Category>) ||
99 (ThreeWayComparable<T> && ThreeWayComparable<U> && detail::WeaklyEqualityComparableWith<T, U> &&
100 detail::PartiallyOrderedWith<T, U> && detail::WeaklyThreeWayComparableWith<T, U, Category>);
101
102template<typename T>
104
105template<typename T, typename U>
107}
108
109namespace di::meta {
110namespace detail {
111 template<typename T, typename U>
112 struct CompareThreeWayResultHelper : meta::TypeConstant<void> {};
113
114 template<typename T, typename U>
116 requires {
117 {
120 };
121 })
122 struct CompareThreeWayResultHelper<T, U>
125
126 template<typename T, typename U>
128 struct CompareThreeWayResultHelper<T, U>
130}
131
132template<typename T, typename U = T>
134}
Definition compare.h:82
Definition core.h:128
Definition core.h:114
Definition compare.h:91
Definition compare.h:106
Definition compare.h:103
Definition any_storable.h:9
Definition merge_interfaces.h:6
meta::Type< detail::CompareThreeWayResultHelper< T, U > > CompareThreeWayResult
Definition compare.h:133
T::Type Type
Definition core.h:26
Type< detail::RemoveReferenceHelper< T > > RemoveReference
Definition core.h:71
Type< detail::CommonComparisonCategoryHelper< Types... > > CommonComparisonCategory
Definition compare.h:31
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition core.h:18