Iros
 
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>
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...>
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>
32}
33
34namespace di::concepts {
35namespace detail {
36 template<typename T, typename Category>
38
39 template<typename T, typename U>
41 constexpr static bool value = false;
42 };
43
44 template<typename T, typename U>
46 using Type = void;
47 };
48
49 template<typename T, typename U>
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>
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>
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>
84
85template<typename T, typename U>
89
90template<typename T, typename Category = partial_ordering>
95
96template<typename T, typename U, typename Category = partial_ordering>
101
102template<typename T>
104
105template<typename T, typename U>
107}
108
109namespace di::meta {
110namespace detail {
111 template<typename T, typename U>
113
114 template<typename T, typename U>
116 requires {
117 {
120 };
121 })
122 struct CompareThreeWayResultHelper<T, U>
123 : meta::TypeConstant<decltype(util::declval<meta::RemoveReference<T> const&>() <=>
124 util::declval<meta::RemoveReference<U> const&>())> {};
125
126 template<typename T, typename U>
127 requires(!concepts::LanguageVoid<meta::Type<concepts::detail::DefinitelyThreeWayComparableWith<T, U>>>)
129 : meta::TypeConstant<meta::Type<concepts::detail::DefinitelyThreeWayComparableWith<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 compare.h:37
Definition impl.h:7
Definition any_storable.h:9
Definition json_deserializer.h:532
Definition const_sentinel.h:8
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
Definition vocab.h:96
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
static constexpr bool value
Definition compare.h:41
Definition core.h:18