11 template<
typename... Types>
12 struct CommonComparisonCategoryHelper : TypeConstant<void> {};
15 struct CommonComparisonCategoryHelper<> : TypeConstant<strong_ordering> {};
17 template<
typename... Types>
18 struct CommonComparisonCategoryHelper<partial_ordering, Types...> : TypeConstant<partial_ordering> {};
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>> {};
26 template<
typename... Types>
27 struct CommonComparisonCategoryHelper<strong_ordering, Types...> : CommonComparisonCategoryHelper<Types...> {};
30template<
typename... Types>
36 template<
typename T,
typename Category>
37 concept ComparesAs = SameAs<meta::CommonComparisonCategory<T, Category>, Category>;
39 template<
typename T,
typename U>
40 struct DefinitelyEqualityComparableWith {
41 constexpr static bool value =
false;
44 template<
typename T,
typename U>
45 struct DefinitelyThreeWayComparableWith {
49 template<
typename T,
typename U>
50 concept WeaklyEqualityComparableWith =
51 (detail::DefinitelyEqualityComparableWith<T, U>::value) ||
53 { a == b } -> SameAs<bool>;
54 { a != b } -> SameAs<bool>;
55 { b == a } -> SameAs<bool>;
56 { b != a } -> SameAs<bool>;
59 template<
typename T,
typename U>
60 concept PartiallyOrderedWith =
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>;
73 template<
typename T,
typename U,
typename Category>
74 concept WeaklyThreeWayComparableWith =
76 { a <=> b } -> ComparesAs<Category>;
77 { b <=> a } -> ComparesAs<Category>;
83 detail::DefinitelyEqualityComparableWith<T, T>::value || detail::WeaklyEqualityComparableWith<T, T>;
85template<
typename T,
typename U>
87 detail::DefinitelyEqualityComparableWith<T, U>::value ||
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>);
96template<
typename T,
typename U,
typename Category = partial_ordering>
98 (detail::ComparesAs<meta::Type<detail::DefinitelyThreeWayComparableWith<T, T>>, Category>) ||
100 detail::PartiallyOrderedWith<T, U> && detail::WeaklyThreeWayComparableWith<T, U, Category>);
105template<
typename T,
typename U>
111 template<
typename T,
typename U>
114 template<
typename T,
typename U>
122 struct CompareThreeWayResultHelper<T, U>
126 template<
typename T,
typename U>
128 struct CompareThreeWayResultHelper<T, U>
132template<
typename T,
typename U = T>
Definition any_storable.h:9
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8