5#ifndef DUNE_COMMON_STD_COMPARE_HH
6#define DUNE_COMMON_STD_COMPARE_HH
24template <
class T,
class Cat>
26 std::same_as<std::common_comparison_category_t<T, Cat>, Cat>;
28template <
class T,
class U>
29concept weaklyEqualityComparableWith =
30 requires(
const std::remove_reference_t<T>& t,
31 const std::remove_reference_t<U>& u)
33 { t == u } -> std::convertible_to<bool>;
34 { t != u } -> std::convertible_to<bool>;
35 { u == t } -> std::convertible_to<bool>;
36 { u != t } -> std::convertible_to<bool>;
39template <
class T,
class U>
40concept partiallyOrderedWith =
41 requires(
const std::remove_reference_t<T>& t,
42 const std::remove_reference_t<U>& u)
44 { t < u } -> std::convertible_to<bool>;
45 { t > u } -> std::convertible_to<bool>;
46 { t <= u } -> std::convertible_to<bool>;
47 { t >= u } -> std::convertible_to<bool>;
48 { u < t } -> std::convertible_to<bool>;
49 { u > t } -> std::convertible_to<bool>;
50 { u <= t } -> std::convertible_to<bool>;
51 { u >= t } -> std::convertible_to<bool>;
54template <
class T,
class U,
class C = std::common_reference_t<const T&, const U&>>
55concept comparisonCommonTypeWithImpl =
56 std::same_as<std::common_reference_t<const T&, const U&>,
57 std::common_reference_t<const U&, const T&>> &&
60 requires std::convertible_to<const T&, const C&> ||
61 std::convertible_to<T, const C&>;
62 requires std::convertible_to<const U&, const C&> ||
63 std::convertible_to<U, const C&>;
66template <
class T,
class U>
67concept comparisonCommonTypeWith =
68 comparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
79template <
class T,
class Cat = std::partial_ordering>
81 Impl::weaklyEqualityComparableWith<T, T> &&
82 Impl::partiallyOrderedWith<T, T> &&
83 requires(
const std::remove_reference_t<T>& a,
84 const std::remove_reference_t<T>& b)
86 { a <=> b } -> Impl::comparesAs<Cat>;
99template <
class T,
class U,
class Cat = std::partial_ordering>
103 Impl::comparisonCommonTypeWith<T, U> &&
105 std::common_reference_t<
106 const std::remove_reference_t<T>&,
107 const std::remove_reference_t<U>&>, Cat> &&
108 Impl::weaklyEqualityComparableWith<T, U> &&
109 Impl::partiallyOrderedWith<T, U> &&
110 requires(
const std::remove_reference_t<T>& t,
111 const std::remove_reference_t<U>& u)
113 { t <=> u } -> Impl::comparesAs<Cat>;
114 { u <=> t } -> Impl::comparesAs<Cat>;
120 template <
class T,
class U>
121 constexpr auto operator() (T&& t, U&& u)
const
123 return std::forward<T>(t) <=> std::forward<U>(u);
The concept std::three_way_comparable_with specifies that the three way comparison operator <=> on (p...
Definition: compare.hh:100
The concept std::three_way_comparable specifies that the three way comparison operator <=> on T yield...
Definition: compare.hh:80
Namespace for features backported from new C++ standards.
Definition: algorithm.hh:19
A functor implementing the three-way comparison on the arguments.
Definition: compare.hh:119