From be40fdf1a86f4956d2f8125a7b6bd6d34e133c2d Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 12 Jan 2018 07:45:05 -0800 Subject: Changes imported from Abseil "staging" branch: - c01cbbc23470f60e54aa28f88faa49df17d26c9c Add constexpr function for max uint128 to replace global ... by Alex Strelnikov - 07491549940e51fb6a0c8aad0ce101cb2830ee8e fix __GNUC__ typo in ABSL_ATTRIBUTE_RETURNS_NONNULL test by Abseil Team - 1bc29bafa53c387b0e097856cffb2fb9ce56c331 Remove redundant uint128 function cast expressions. by Alex Strelnikov - e3dddbd7be9e85e1bac77648af35ddccdba4500e Add ABSL_ATTRIBUTE_RETURNS_NONNULL macro. by Chris Kennelly GitOrigin-RevId: c01cbbc23470f60e54aa28f88faa49df17d26c9c Change-Id: I7a5f608f58fb53bf013cdf56018f5b39842427fc --- absl/base/attributes.h | 12 ++++++++++++ absl/numeric/int128.h | 45 ++++++++++++++++++++++----------------------- absl/numeric/int128_test.cc | 6 ++++-- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/absl/base/attributes.h b/absl/base/attributes.h index 02bb030f5e5a..4e1fc8b550d1 100644 --- a/absl/base/attributes.h +++ b/absl/base/attributes.h @@ -281,6 +281,18 @@ #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI #endif +// ABSL_ATTRIBUTE_RETURNS_NONNULL +// +// Tells the compiler that a particular function never returns a null pointer. +#if ABSL_HAVE_ATTRIBUTE(returns_nonnull) || \ + (defined(__GNUC__) && \ + (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) && \ + !defined(__clang__)) +#define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) +#else +#define ABSL_ATTRIBUTE_RETURNS_NONNULL +#endif + // ABSL_HAVE_ATTRIBUTE_SECTION // // Indicates whether labeled sections are supported. Labeled sections are not 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::max(), + std::numeric_limits::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_; } diff --git a/absl/numeric/int128_test.cc b/absl/numeric/int128_test.cc index d674cb125f5e..79bcca907ae9 100644 --- a/absl/numeric/int128_test.cc +++ b/absl/numeric/int128_test.cc @@ -110,7 +110,7 @@ TEST(Uint128, AllTests) { absl::uint128 big = absl::MakeUint128(2000, 2); absl::uint128 big_minus_one = absl::MakeUint128(2000, 1); absl::uint128 bigger = absl::MakeUint128(2001, 1); - absl::uint128 biggest = absl::kuint128max; + absl::uint128 biggest = absl::Uint128Max(); absl::uint128 high_low = absl::MakeUint128(1, 0); absl::uint128 low_high = absl::MakeUint128(0, std::numeric_limits::max()); @@ -227,8 +227,10 @@ TEST(Uint128, AllTests) { EXPECT_EQ(big, -(-big)); EXPECT_EQ(two, -((-one) - 1)); - EXPECT_EQ(absl::kuint128max, -one); + EXPECT_EQ(absl::Uint128Max(), -one); EXPECT_EQ(zero, -zero); + + EXPECT_EQ(absl::Uint128Max(), absl::kuint128max); } TEST(Uint128, ConversionTests) { -- cgit 1.4.1