diff options
Diffstat (limited to 'absl/numeric/int128.h')
-rw-r--r-- | absl/numeric/int128.h | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/absl/numeric/int128.h b/absl/numeric/int128.h index a204ac4d9c3f..bd1b553ab2dc 100644 --- a/absl/numeric/int128.h +++ b/absl/numeric/int128.h @@ -71,8 +71,8 @@ namespace absl { // // Example: // -// float y = absl::kuint128max; // Error. uint128 cannot be implicitly -// // converted to float. +// float y = absl::Uint128Max(); // Error. uint128 cannot be implicitly +// // converted to float. // // absl::uint128 v; // absl::uint64_t i = v; // Error @@ -177,6 +177,11 @@ class alignas(16) uint128 { // absl::uint128 big = absl::MakeUint128(1, 0); friend constexpr uint128 MakeUint128(uint64_t high, uint64_t low); + // Uint128Max() + // + // Returns the highest value for a 128-bit unsigned integer. + friend constexpr uint128 Uint128Max(); + private: constexpr uint128(uint64_t high, uint64_t low); @@ -195,6 +200,9 @@ class alignas(16) uint128 { #endif // byte order }; +// Prefer to use the constexpr `Uint128Max()`. +// +// TODO(absl-team) deprecate kuint128max once migration tool is released. extern const uint128 kuint128max; // allow uint128 to be logged @@ -212,6 +220,11 @@ constexpr uint128 MakeUint128(uint64_t high, uint64_t low) { return uint128(high, low); } +constexpr uint128 Uint128Max() { + return uint128(std::numeric_limits<uint64_t>::max(), + std::numeric_limits<uint64_t>::max()); +} + // Assignment from integer types. inline uint128& uint128::operator=(int v) { return *this = uint128(v); } @@ -251,33 +264,19 @@ inline uint128& uint128::operator=(unsigned __int128 v) { // Shift and arithmetic operators. -inline uint128 operator<<(uint128 lhs, int amount) { - return uint128(lhs) <<= amount; -} +inline uint128 operator<<(uint128 lhs, int amount) { return lhs <<= amount; } -inline uint128 operator>>(uint128 lhs, int amount) { - return uint128(lhs) >>= amount; -} +inline uint128 operator>>(uint128 lhs, int amount) { return lhs >>= amount; } -inline uint128 operator+(uint128 lhs, uint128 rhs) { - return uint128(lhs) += rhs; -} +inline uint128 operator+(uint128 lhs, uint128 rhs) { return lhs += rhs; } -inline uint128 operator-(uint128 lhs, uint128 rhs) { - return uint128(lhs) -= rhs; -} +inline uint128 operator-(uint128 lhs, uint128 rhs) { return lhs -= rhs; } -inline uint128 operator*(uint128 lhs, uint128 rhs) { - return uint128(lhs) *= rhs; -} +inline uint128 operator*(uint128 lhs, uint128 rhs) { return lhs *= rhs; } -inline uint128 operator/(uint128 lhs, uint128 rhs) { - return uint128(lhs) /= rhs; -} +inline uint128 operator/(uint128 lhs, uint128 rhs) { return lhs /= rhs; } -inline uint128 operator%(uint128 lhs, uint128 rhs) { - return uint128(lhs) %= rhs; -} +inline uint128 operator%(uint128 lhs, uint128 rhs) { return lhs %= rhs; } constexpr uint64_t Uint128Low64(uint128 v) { return v.lo_; } |