10#include "concepts.hpp"
15namespace hi {
inline namespace v1 {
19template<
typename Lhs,
typename Rhs>
22template<std::
unsigned_
integral Lhs, std::
unsigned_
integral Rhs>
24 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
30template<std::
signed_
integral Lhs, std::
signed_
integral Rhs>
32 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
38template<std::
floating_po
int Lhs, std::
floating_po
int Rhs>
39struct three_way_comparison<Lhs, Rhs> {
40 [[nodiscard]]
constexpr std::partial_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
46template<std::
signed_
integral Lhs, std::
unsigned_
integral Rhs>
47struct three_way_comparison<Lhs, Rhs> {
48 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
49 requires(
sizeof(Rhs) <
sizeof(
long long))
51 return lhs <=>
static_cast<long long>(rhs);
54 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
55 requires(
sizeof(Rhs) ==
sizeof(
long long))
58 return std::strong_ordering::less;
60 return static_cast<unsigned long long>(lhs) <=> rhs;
65template<std::
unsigned_
integral Lhs, std::
signed_
integral Rhs>
66struct three_way_comparison<Lhs, Rhs> {
67 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
68 requires(
sizeof(Lhs) <
sizeof(
long long))
70 return static_cast<long long>(lhs) <=> rhs;
73 [[nodiscard]]
constexpr std::strong_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
74 requires(
sizeof(Lhs) ==
sizeof(
long long))
77 return std::strong_ordering::greater;
79 return lhs <=>
static_cast<unsigned long long>(rhs);
84template<std::
floating_po
int Lhs, std::
integral Rhs>
85struct three_way_comparison<Lhs, Rhs> {
86 [[nodiscard]]
constexpr std::partial_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
88 if constexpr (
sizeof(Rhs) <
sizeof(
float)) {
90 return lhs <=>
static_cast<float>(rhs);
91 }
else if constexpr (
sizeof(Rhs) <
sizeof(
double)) {
93 return lhs <=>
static_cast<double>(rhs);
95 return lhs <=>
static_cast<long double>(rhs);
100template<std::
integral Lhs, std::
floating_po
int Rhs>
101struct three_way_comparison<Lhs, Rhs> {
102 [[nodiscard]]
constexpr std::partial_ordering operator()(Lhs
const& lhs, Rhs
const& rhs)
const noexcept
104 if constexpr (
sizeof(Lhs) <
sizeof(
float)) {
106 return static_cast<float>(lhs) <=> rhs;
107 }
else if constexpr (
sizeof(Lhs) <
sizeof(
double)) {
109 return static_cast<double>(lhs) <=> rhs;
111 return static_cast<long double>(lhs) <=> rhs;
122template<arithmetic Lhs, arithmetic Rhs>
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
constexpr auto three_way_compare(Lhs const &lhs, Rhs const &rhs) noexcept
Safely compare two arithmetic values to each other.
Definition compare.hpp:123
A functor to safely compare two arithmetic values.
Definition compare.hpp:20