diff options
author | Abseil Team <absl-team@google.com> | 2018-01-12T15·45-0800 |
---|---|---|
committer | Derek Mauro <dmauro@google.com> | 2018-01-12T15·52-0500 |
commit | be40fdf1a86f4956d2f8125a7b6bd6d34e133c2d (patch) | |
tree | c6b5e1fa9df5114a350afdcd7334ed7ac4d44b77 /absl/numeric/int128.h | |
parent | c742b72354a84958b6a061755249822eeef87d06 (diff) |
Changes imported from Abseil "staging" branch:
- c01cbbc23470f60e54aa28f88faa49df17d26c9c Add constexpr function for max uint128 to replace global ... by Alex Strelnikov <strel@google.com> - 07491549940e51fb6a0c8aad0ce101cb2830ee8e fix __GNUC__ typo in ABSL_ATTRIBUTE_RETURNS_NONNULL test by Abseil Team <absl-team@google.com> - 1bc29bafa53c387b0e097856cffb2fb9ce56c331 Remove redundant uint128 function cast expressions. by Alex Strelnikov <strel@google.com> - e3dddbd7be9e85e1bac77648af35ddccdba4500e Add ABSL_ATTRIBUTE_RETURNS_NONNULL macro. by Chris Kennelly <ckennelly@google.com> GitOrigin-RevId: c01cbbc23470f60e54aa28f88faa49df17d26c9c Change-Id: I7a5f608f58fb53bf013cdf56018f5b39842427fc
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_; } |