9#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_UTILITY_SAFE_COMPARISONS_HPP_
10#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_UTILITY_SAFE_COMPARISONS_HPP_
16#include "arene/base/compiler_support/attributes.hpp"
17#include "arene/base/compiler_support/cpp14_inline.hpp"
18#include "arene/base/constraints/constraints.hpp"
19#include "arene/base/stdlib_choice/enable_if.hpp"
20#include "arene/base/stdlib_choice/is_integral.hpp"
21#include "arene/base/stdlib_choice/is_signed.hpp"
22#include "arene/base/stdlib_choice/is_unsigned.hpp"
23#include "arene/base/stdlib_choice/make_unsigned.hpp"
31namespace safe_comparisons_detail {
40template <
typename T,
typename U>
41static constexpr bool is_same_signedness_v = std::is_signed<T>::value == std::is_signed<U>::value;
52template <
typename T,
typename U, constraints<std::enable_if_t<is_same_signedness_v<T, U>>> =
nullptr>
53ARENE_NODISCARD
constexpr auto do_cmp_equal(T
const lhs, U
const rhs)
noexcept ->
bool {
70 constraints<std::enable_if_t<std::is_signed<T>::value>, std::enable_if_t<std::is_unsigned<U>::value>> =
nullptr>
71ARENE_NODISCARD
constexpr auto do_cmp_equal(T
const lhs, U
const rhs)
noexcept ->
bool {
75 return static_cast<std::make_unsigned_t<T>>(lhs) == rhs;
91 constraints<std::enable_if_t<std::is_unsigned<T>::value>, std::enable_if_t<std::is_signed<U>::value>> =
nullptr>
92ARENE_NODISCARD
constexpr auto do_cmp_equal(T
const lhs, U
const rhs)
noexcept ->
bool {
93 return do_cmp_equal(rhs, lhs);
105template <
typename T,
typename U, constraints<std::enable_if_t<is_same_signedness_v<T, U>>> =
nullptr>
106ARENE_NODISCARD
constexpr auto do_cmp_less(T
const lhs, U
const rhs)
noexcept ->
bool {
127 constraints<std::enable_if_t<std::is_signed<T>::value>, std::enable_if_t<std::is_unsigned<U>::value>> =
nullptr>
128ARENE_NODISCARD
constexpr auto do_cmp_less(T
const lhs, U
const rhs)
noexcept ->
bool {
134 return static_cast<std::make_unsigned_t<T>>(lhs) < rhs;
152 constraints<std::enable_if_t<std::is_unsigned<T>::value>, std::enable_if_t<std::is_signed<U>::value>> =
nullptr>
153ARENE_NODISCARD
constexpr auto do_cmp_less(T
const lhs, U
const rhs)
noexcept ->
bool {
159 return lhs <
static_cast<std::make_unsigned_t<U>>(rhs);
186 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
187 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
188 return do_cmp_equal(lhs, rhs);
195class cmp_not_equal_fn {
214 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
215 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
216 return !do_cmp_equal(lhs, rhs);
241 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
242 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
243 return do_cmp_less(lhs, rhs);
250class cmp_greater_fn {
268 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
269 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
270 return do_cmp_less(rhs, lhs);
277class cmp_less_equal_fn {
295 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
296 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
297 return !do_cmp_less(rhs, lhs);
304class cmp_greater_equal_fn {
322 constraints<std::enable_if_t<std::is_integral<T>::value>, std::enable_if_t<std::is_integral<U>::value>> =
nullptr>
323 ARENE_NODISCARD
constexpr auto operator()(T
const lhs, U
const rhs)
const noexcept ->
bool {
324 return !do_cmp_less(lhs, rhs);
336ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_equal_fn, cmp_equal);
340ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_not_equal_fn, cmp_not_equal);
344ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_less_fn, cmp_less);
348ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_less_equal_fn, cmp_less_equal);
352ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_greater_fn, cmp_greater);
356ARENE_CPP14_INLINE_VARIABLE(safe_comparisons_detail::cmp_greater_equal_fn, cmp_greater_equal);
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10