diff options
Diffstat (limited to 'absl/numeric/int128.h')
-rw-r--r-- | absl/numeric/int128.h | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/absl/numeric/int128.h b/absl/numeric/int128.h index 7530a793..5a067d17 100644 --- a/absl/numeric/int128.h +++ b/absl/numeric/int128.h @@ -38,6 +38,7 @@ #include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/base/port.h" +#include "absl/types/compare.h" #if defined(_MSC_VER) // In very old versions of MSVC and when the /Zc:wchar_t flag is off, wchar_t is @@ -244,11 +245,6 @@ class #endif // byte order }; -// Prefer to use the constexpr `Uint128Max()`. -// -// TODO(absl-team) deprecate kuint128max once migration tool is released. -ABSL_DLL extern const uint128 kuint128max; - // allow uint128 to be logged std::ostream& operator<<(std::ostream& os, uint128 v); @@ -274,7 +270,9 @@ class numeric_limits<absl::uint128> { static constexpr bool has_infinity = false; static constexpr bool has_quiet_NaN = false; static constexpr bool has_signaling_NaN = false; + ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING static constexpr float_denorm_style has_denorm = denorm_absent; + ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING static constexpr bool has_denorm_loss = false; static constexpr float_round_style round_style = round_toward_zero; static constexpr bool is_iec559 = false; @@ -517,7 +515,9 @@ class numeric_limits<absl::int128> { static constexpr bool has_infinity = false; static constexpr bool has_quiet_NaN = false; static constexpr bool has_signaling_NaN = false; + ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING static constexpr float_denorm_style has_denorm = denorm_absent; + ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING static constexpr bool has_denorm_loss = false; static constexpr float_round_style round_style = round_toward_zero; static constexpr bool is_iec559 = false; @@ -824,6 +824,36 @@ constexpr bool operator<=(uint128 lhs, uint128 rhs) { return !(rhs < lhs); } constexpr bool operator>=(uint128 lhs, uint128 rhs) { return !(lhs < rhs); } +#ifdef __cpp_impl_three_way_comparison +constexpr absl::strong_ordering operator<=>(uint128 lhs, uint128 rhs) { +#if defined(ABSL_HAVE_INTRINSIC_INT128) + if (auto lhs_128 = static_cast<unsigned __int128>(lhs), + rhs_128 = static_cast<unsigned __int128>(rhs); + lhs_128 < rhs_128) { + return absl::strong_ordering::less; + } else if (lhs_128 > rhs_128) { + return absl::strong_ordering::greater; + } else { + return absl::strong_ordering::equal; + } +#else + if (uint64_t lhs_high = Uint128High64(lhs), rhs_high = Uint128High64(rhs); + lhs_high < rhs_high) { + return absl::strong_ordering::less; + } else if (lhs_high > rhs_high) { + return absl::strong_ordering::greater; + } else if (uint64_t lhs_low = Uint128Low64(lhs), rhs_low = Uint128Low64(rhs); + lhs_low < rhs_low) { + return absl::strong_ordering::less; + } else if (lhs_low > rhs_low) { + return absl::strong_ordering::greater; + } else { + return absl::strong_ordering::equal; + } +#endif +} +#endif + // Unary operators. constexpr inline uint128 operator+(uint128 val) { return val; } |