merge(3p/absl): subtree merge of Abseil up to e19260f
... notably, this includes Abseil's own StatusOr type, which conflicted with our implementation (that was taken from TensorFlow). Change-Id: Ie7d6764b64055caaeb8dc7b6b9d066291e6b538f
This commit is contained in:
parent
cc27324d02
commit
082c006c04
854 changed files with 11260 additions and 5296 deletions
|
|
@ -251,7 +251,7 @@ TEST(Numbers, TestFastPrints) {
|
|||
template <typename int_type, typename in_val_type>
|
||||
void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) {
|
||||
std::string s;
|
||||
// uint128 can be streamed but not StrCat'd
|
||||
// (u)int128 can be streamed but not StrCat'd.
|
||||
absl::strings_internal::OStringStream(&s) << in_value;
|
||||
int_type x = static_cast<int_type>(~exp_value);
|
||||
EXPECT_TRUE(SimpleAtoi(s, &x))
|
||||
|
|
@ -264,7 +264,9 @@ void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) {
|
|||
|
||||
template <typename int_type, typename in_val_type>
|
||||
void VerifySimpleAtoiBad(in_val_type in_value) {
|
||||
std::string s = absl::StrCat(in_value);
|
||||
std::string s;
|
||||
// (u)int128 can be streamed but not StrCat'd.
|
||||
absl::strings_internal::OStringStream(&s) << in_value;
|
||||
int_type x;
|
||||
EXPECT_FALSE(SimpleAtoi(s, &x));
|
||||
EXPECT_FALSE(SimpleAtoi(s.c_str(), &x));
|
||||
|
|
@ -347,6 +349,31 @@ TEST(NumbersTest, Atoi) {
|
|||
std::numeric_limits<absl::uint128>::max(),
|
||||
std::numeric_limits<absl::uint128>::max());
|
||||
|
||||
// SimpleAtoi(absl::string_view, absl::int128)
|
||||
VerifySimpleAtoiGood<absl::int128>(0, 0);
|
||||
VerifySimpleAtoiGood<absl::int128>(42, 42);
|
||||
VerifySimpleAtoiGood<absl::int128>(-42, -42);
|
||||
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int32_t>::min(),
|
||||
std::numeric_limits<int32_t>::min());
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int32_t>::max(),
|
||||
std::numeric_limits<int32_t>::max());
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<uint32_t>::max(),
|
||||
std::numeric_limits<uint32_t>::max());
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int64_t>::min(),
|
||||
std::numeric_limits<int64_t>::min());
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int64_t>::max(),
|
||||
std::numeric_limits<int64_t>::max());
|
||||
VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<uint64_t>::max(),
|
||||
std::numeric_limits<uint64_t>::max());
|
||||
VerifySimpleAtoiGood<absl::int128>(
|
||||
std::numeric_limits<absl::int128>::min(),
|
||||
std::numeric_limits<absl::int128>::min());
|
||||
VerifySimpleAtoiGood<absl::int128>(
|
||||
std::numeric_limits<absl::int128>::max(),
|
||||
std::numeric_limits<absl::int128>::max());
|
||||
VerifySimpleAtoiBad<absl::int128>(std::numeric_limits<absl::uint128>::max());
|
||||
|
||||
// Some other types
|
||||
VerifySimpleAtoiGood<int>(-42, -42);
|
||||
VerifySimpleAtoiGood<int32_t>(-42, -42);
|
||||
|
|
@ -359,6 +386,12 @@ TEST(NumbersTest, Atoi) {
|
|||
VerifySimpleAtoiGood<std::string::size_type>(42, 42);
|
||||
}
|
||||
|
||||
TEST(NumbersTest, Atod) {
|
||||
double d;
|
||||
EXPECT_TRUE(absl::SimpleAtod("nan", &d));
|
||||
EXPECT_TRUE(std::isnan(d));
|
||||
}
|
||||
|
||||
TEST(NumbersTest, Atoenum) {
|
||||
enum E01 {
|
||||
E01_zero = 0,
|
||||
|
|
@ -719,6 +752,51 @@ TEST(stringtest, safe_strtou128_random) {
|
|||
EXPECT_FALSE(parse_func(s, &parsed_value, base));
|
||||
}
|
||||
}
|
||||
TEST(stringtest, safe_strto128_random) {
|
||||
// random number generators don't work for int128, and
|
||||
// int128 can be streamed but not StrCat'd, so this code must be custom
|
||||
// implemented for int128, but is generally the same as what's above.
|
||||
// test_random_integer_parse_base<absl::int128>(
|
||||
// &absl::numbers_internal::safe_strto128_base);
|
||||
using RandomEngine = std::minstd_rand0;
|
||||
using IntType = absl::int128;
|
||||
constexpr auto parse_func = &absl::numbers_internal::safe_strto128_base;
|
||||
|
||||
std::random_device rd;
|
||||
RandomEngine rng(rd());
|
||||
std::uniform_int_distribution<int64_t> random_int64(
|
||||
std::numeric_limits<int64_t>::min());
|
||||
std::uniform_int_distribution<uint64_t> random_uint64(
|
||||
std::numeric_limits<uint64_t>::min());
|
||||
std::uniform_int_distribution<int> random_base(2, 35);
|
||||
|
||||
for (size_t i = 0; i < kNumRandomTests; ++i) {
|
||||
int64_t high = random_int64(rng);
|
||||
uint64_t low = random_uint64(rng);
|
||||
IntType value = absl::MakeInt128(high, low);
|
||||
|
||||
int base = random_base(rng);
|
||||
std::string str_value;
|
||||
EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
|
||||
IntType parsed_value;
|
||||
|
||||
// Test successful parse
|
||||
EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
|
||||
EXPECT_EQ(parsed_value, value);
|
||||
|
||||
// Test overflow
|
||||
std::string s;
|
||||
absl::strings_internal::OStringStream(&s)
|
||||
<< std::numeric_limits<IntType>::max() << value;
|
||||
EXPECT_FALSE(parse_func(s, &parsed_value, base));
|
||||
|
||||
// Test underflow
|
||||
s.clear();
|
||||
absl::strings_internal::OStringStream(&s)
|
||||
<< std::numeric_limits<IntType>::min() << value;
|
||||
EXPECT_FALSE(parse_func(s, &parsed_value, base));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(stringtest, safe_strtou32_base) {
|
||||
for (int i = 0; strtouint32_test_cases()[i].str != nullptr; ++i) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue