// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// This file contains string processing functions related to
// numeric values.

#include "absl/strings/numbers.h"

#include <algorithm>
#include <array>
#include <cassert>
#include <cfloat>  // for DBL_DIG and FLT_DIG
#include <clocale>  // for localeconv
#include <cmath>   // for HUGE_VAL
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iterator>
#include <limits>
#include <system_error>  // NOLINT(build/c++11)
#include <utility>

#include "absl/base/attributes.h"
#include "absl/base/config.h"
#include "absl/base/internal/endian.h"
#include "absl/base/internal/raw_logging.h"
#include "absl/base/macros.h"
#include "absl/base/nullability.h"
#include "absl/base/optimization.h"
#include "absl/numeric/bits.h"
#include "absl/numeric/int128.h"
#include "absl/strings/ascii.h"
#include "absl/strings/charconv.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"

namespace absl {
ABSL_NAMESPACE_BEGIN

bool SimpleAtof(absl::string_view str, float* absl_nonnull out) {
  *out = 0.0;
  str = StripAsciiWhitespace(str);
  if (str.empty()) {
    // absl::from_chars doesn't accept empty strings.
    return false;
  }
  // std::from_chars doesn't accept an initial +, but SimpleAtof does, so if one
  // is present, skip it, while avoiding accepting "+-0" as valid.
  if (str[0] == '+') {
    str.remove_prefix(1);
    if (str.empty() || str[0] == '-') {
      return false;
    }
  }
  auto result = absl::from_chars(str.data(), str.data() + str.size(), *out);
  if (result.ec == std::errc::invalid_argument) {
    return false;
  }
  if (result.ptr != str.data() + str.size()) {
    // not all non-whitespace characters consumed
    return false;
  }
  // from_chars() with DR 3081's current wording will return max() on
  // overflow.  SimpleAtof returns infinity instead.
  if (result.ec == std::errc::result_out_of_range) {
    if (*out > 1.0) {
      *out = std::numeric_limits<float>::infinity();
    } else if (*out < -1.0) {
      *out = -std::numeric_limits<float>::infinity();
    }
  }
  return true;
}

bool SimpleAtod(absl::string_view str, double* absl_nonnull out) {
  *out = 0.0;
  str = StripAsciiWhitespace(str);
  if (str.empty()) {
    // absl::from_chars doesn't accept empty strings.
    return false;
  }
  // std::from_chars doesn't accept an initial +, but SimpleAtod does, so if one
  // is present, skip it, while avoiding accepting "+-0" as valid.
  if (str[0] == '+') {
    str.remove_prefix(1);
    if (str.empty() || str[0] == '-') {
      return false;
    }
  }
  auto result = absl::from_chars(str.data(), str.data() + str.size(), *out);
  if (result.ec == std::errc::invalid_argument) {
    return false;
  }
  if (result.ptr != str.data() + str.size()) {
    // not all non-whitespace characters consumed
    return false;
  }
  // from_chars() with DR 3081's current wording will return max() on
  // overflow.  SimpleAtod returns infinity instead.
  if (result.ec == std::errc::result_out_of_range) {
    if (*out > 1.0) {
      *out = std::numeric_limits<double>::infinity();
    } else if (*out < -1.0) {
      *out = -std::numeric_limits<double>::infinity();
    }
  }
  return true;
}

bool SimpleAtob(absl::string_view str, bool* absl_nonnull out) {
  ABSL_RAW_CHECK(out != nullptr, "Output pointer must not be nullptr.");
  if (EqualsIgnoreCase(str, "true") || EqualsIgnoreCase(str, "t") ||
      EqualsIgnoreCase(str, "yes") || EqualsIgnoreCase(str, "y") ||
      EqualsIgnoreCase(str, "1")) {
    *out = true;
    return true;
  }
  if (EqualsIgnoreCase(str, "false") || EqualsIgnoreCase(str, "f") ||
      EqualsIgnoreCase(str, "no") || EqualsIgnoreCase(str, "n") ||
      EqualsIgnoreCase(str, "0")) {
    *out = false;
    return true;
  }
  return false;
}

// ----------------------------------------------------------------------
// FastIntToBuffer() overloads
//
// Like the Fast*ToBuffer() functions above, these are intended for speed.
// Unlike the Fast*ToBuffer() functions, however, these functions write
// their output to the beginning of the buffer.  The caller is responsible
// for ensuring that the buffer has enough space to hold the output.
//
// Returns a pointer to the end of the string (i.e. the null character
// terminating the string).
// ----------------------------------------------------------------------

namespace {

// Various routines to encode integers to strings.

// We split data encodings into a group of 2 digits, 4 digits, 8 digits as
// it's easier to combine powers of two into scalar arithmetic.

// Previous implementation used a lookup table of 200 bytes for every 2 bytes
// and it was memory bound, any L1 cache miss would result in a much slower
// result. When benchmarking with a cache eviction rate of several percent,
// this implementation proved to be better.

// These constants represent '00', '0000' and '00000000' as ascii strings in
// integers. We can add these numbers if we encode to bytes from 0 to 9. as
// 'i' = '0' + i for 0 <= i <= 9.
constexpr uint32_t kTwoZeroBytes = 0x0101 * '0';
constexpr uint64_t kFourZeroBytes = 0x01010101 * '0';
constexpr uint64_t kEightZeroBytes = 0x0101010101010101ull * '0';

// * 103 / 1024 is a division by 10 for values from 0 to 99. It's also a
// division of a structure [k takes 2 bytes][m takes 2 bytes], then * 103 / 1024
// will be [k / 10][m / 10]. It allows parallel division.
constexpr uint64_t kDivisionBy10Mul = 103u;
constexpr uint64_t kDivisionBy10Div = 1 << 10;

// * 10486 / 1048576 is a division by 100 for values from 0 to 9999.
constexpr uint64_t kDivisionBy100Mul = 10486u;
constexpr uint64_t kDivisionBy100Div = 1 << 20;

// Encode functions write the ASCII output of input `n` to `out_str`.
inline char* EncodeHundred(uint32_t n, char* absl_nonnull out_str) {
  int num_digits = static_cast<int>(n - 10) >> 8;
  uint32_t div10 = (n * kDivisionBy10Mul) / kDivisionBy10Div;
  uint32_t mod10 = n - 10u * div10;
  uint32_t base = kTwoZeroBytes + div10 + (mod10 << 8);
  base >>= num_digits & 8;
  little_endian::Store16(out_str, static_cast<uint16_t>(base));
  return out_str + 2 + num_digits;
}

inline char* EncodeTenThousand(uint32_t n, char* absl_nonnull out_str) {
  // We split lower 2 digits and upper 2 digits of n into 2 byte consecutive
  // blocks. 123 ->  [\0\1][\0\23]. We divide by 10 both blocks
  // (it's 1 division + zeroing upper bits), and compute modulo 10 as well "in
  // parallel". Then we combine both results to have both ASCII digits,
  // strip trailing zeros, add ASCII '0000' and return.
  uint32_t div100 = (n * kDivisionBy100Mul) / kDivisionBy100Div;
  uint32_t mod100 = n - 100ull * div100;
  uint32_t hundreds = (mod100 << 16) + div100;
  uint32_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
  tens &= (0xFull << 16) | 0xFull;
  tens += (hundreds - 10ull * tens) << 8;
  ABSL_ASSUME(tens != 0);
  // The result can contain trailing zero bits, we need to strip them to a first
  // significant byte in a final representation. For example, for n = 123, we
  // have tens to have representation \0\1\2\3. We do `& -8` to round
  // to a multiple to 8 to strip zero bytes, not all zero bits.
  // countr_zero to help.
  // 0 minus 8 to make MSVC happy.
  uint32_t zeroes = static_cast<uint32_t>(absl::countr_zero(tens)) & (0 - 8u);
  tens += kFourZeroBytes;
  tens >>= zeroes;
  little_endian::Store32(out_str, tens);
  return out_str + sizeof(tens) - zeroes / 8;
}

// Helper function to produce an ASCII representation of `i`.
//
// Function returns an 8-byte integer which when summed with `kEightZeroBytes`,
// can be treated as a printable buffer with ascii representation of `i`,
// possibly with leading zeros.
//
// Example:
//
//  uint64_t buffer = PrepareEightDigits(102030) + kEightZeroBytes;
//  char* ascii = reinterpret_cast<char*>(&buffer);
//  // Note two leading zeros:
//  EXPECT_EQ(absl::string_view(ascii, 8), "00102030");
//
// Pre-condition: `i` must be less than 100000000.
inline uint64_t PrepareEightDigits(uint32_t i) {
  ABSL_ASSUME(i < 10000'0000);
  // Prepare 2 blocks of 4 digits "in parallel".
  uint32_t hi = i / 10000;
  uint32_t lo = i % 10000;
  uint64_t merged = hi | (uint64_t{lo} << 32);
  uint64_t div100 = ((merged * kDivisionBy100Mul) / kDivisionBy100Div) &
                    ((0x7Full << 32) | 0x7Full);
  uint64_t mod100 = merged - 100ull * div100;
  uint64_t hundreds = (mod100 << 16) + div100;
  uint64_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
  tens &= (0xFull << 48) | (0xFull << 32) | (0xFull << 16) | 0xFull;
  tens += (hundreds - 10ull * tens) << 8;
  return tens;
}


// Encodes v to buffer as 16 digits padded with leading zeros.
// Pre-condition: v must be < 10^16.
inline char* EncodePadded16(uint64_t v, char* absl_nonnull buffer) {
  constexpr uint64_t k1e8 = 100000000;
  uint32_t hi = static_cast<uint32_t>(v / k1e8);
  uint32_t lo = static_cast<uint32_t>(v % k1e8);
  little_endian::Store64(buffer, PrepareEightDigits(hi) + kEightZeroBytes);
  little_endian::Store64(buffer + 8, PrepareEightDigits(lo) + kEightZeroBytes);
  return buffer + 16;
}

inline ABSL_ATTRIBUTE_ALWAYS_INLINE char* absl_nonnull EncodeFullU32(
    uint32_t n, char* absl_nonnull out_str) {
  if (n < 10) {
    *out_str = static_cast<char>('0' + n);
    return out_str + 1;
  }
  if (n < 100'000'000) {
    uint64_t bottom = PrepareEightDigits(n);
    ABSL_ASSUME(bottom != 0);
    // 0 minus 8 to make MSVC happy.
    uint32_t zeroes =
        static_cast<uint32_t>(absl::countr_zero(bottom)) & (0 - 8u);
    little_endian::Store64(out_str, (bottom + kEightZeroBytes) >> zeroes);
    return out_str + sizeof(bottom) - zeroes / 8;
  }
  uint32_t div08 = n / 100'000'000;
  uint32_t mod08 = n % 100'000'000;
  uint64_t bottom = PrepareEightDigits(mod08) + kEightZeroBytes;
  out_str = EncodeHundred(div08, out_str);
  little_endian::Store64(out_str, bottom);
  return out_str + sizeof(bottom);
}

inline ABSL_ATTRIBUTE_ALWAYS_INLINE char* absl_nonnull EncodeFullU64(
    uint64_t i, char* absl_nonnull buffer) {
  if (i <= std::numeric_limits<uint32_t>::max()) {
    return EncodeFullU32(static_cast<uint32_t>(i), buffer);
  }
  uint32_t mod08;
  if (i < 1'0000'0000'0000'0000ull) {
    uint32_t div08 = static_cast<uint32_t>(i / 100'000'000ull);
    mod08 = static_cast<uint32_t>(i % 100'000'000ull);
    buffer = EncodeFullU32(div08, buffer);
  } else {
    uint64_t div08 = i / 100'000'000ull;
    mod08 = static_cast<uint32_t>(i % 100'000'000ull);
    uint32_t div016 = static_cast<uint32_t>(div08 / 100'000'000ull);
    uint32_t div08mod08 = static_cast<uint32_t>(div08 % 100'000'000ull);
    uint64_t mid_result = PrepareEightDigits(div08mod08) + kEightZeroBytes;
    buffer = EncodeTenThousand(div016, buffer);
    little_endian::Store64(buffer, mid_result);
    buffer += sizeof(mid_result);
  }
  uint64_t mod_result = PrepareEightDigits(mod08) + kEightZeroBytes;
  little_endian::Store64(buffer, mod_result);
  return buffer + sizeof(mod_result);
}

inline ABSL_ATTRIBUTE_ALWAYS_INLINE char* absl_nonnull EncodeFullU128(
    uint128 i, char* absl_nonnull buffer) {
  if (absl::Uint128High64(i) == 0) {
    return EncodeFullU64(absl::Uint128Low64(i), buffer);
  }
  // We divide the number into 16-digit chunks because `EncodePadded16` is
  // optimized to handle 16 digits at a time (as two 8-digit chunks).
  constexpr uint64_t k1e16 = uint64_t{10'000'000'000'000'000};
  uint128 high = i / k1e16;
  uint64_t low = absl::Uint128Low64(i % k1e16);
  uint64_t mid = absl::Uint128Low64(high % k1e16);
  high /= k1e16;

  if (high == 0) {
    buffer = EncodeFullU64(mid, buffer);
    buffer = EncodePadded16(low, buffer);
  } else {
    buffer = EncodeFullU64(absl::Uint128Low64(high), buffer);
    buffer = EncodePadded16(mid, buffer);
    buffer = EncodePadded16(low, buffer);
  }
  return buffer;
}

}  // namespace

void numbers_internal::PutTwoDigits(uint32_t i, char* absl_nonnull buf) {
  assert(i < 100);
  uint32_t base = kTwoZeroBytes;
  uint32_t div10 = (i * kDivisionBy10Mul) / kDivisionBy10Div;
  uint32_t mod10 = i - 10u * div10;
  base += div10 + (mod10 << 8);
  little_endian::Store16(buf, static_cast<uint16_t>(base));
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    uint32_t n, char* absl_nonnull out_str) {
  out_str = EncodeFullU32(n, out_str);
  *out_str = '\0';
  return out_str;
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    int32_t i, char* absl_nonnull buffer) {
  uint32_t u = static_cast<uint32_t>(i);
  if (i < 0) {
    *buffer++ = '-';
    // We need to do the negation in modular (i.e., "unsigned")
    // arithmetic; MSVC++ apparently warns for plain "-u", so
    // we write the equivalent expression "0 - u" instead.
    u = 0 - u;
  }
  buffer = EncodeFullU32(u, buffer);
  *buffer = '\0';
  return buffer;
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    uint64_t i, char* absl_nonnull buffer) {
  buffer = EncodeFullU64(i, buffer);
  *buffer = '\0';
  return buffer;
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    int64_t i, char* absl_nonnull buffer) {
  uint64_t u = static_cast<uint64_t>(i);
  if (i < 0) {
    *buffer++ = '-';
    // We need to do the negation in modular (i.e., "unsigned")
    // arithmetic; MSVC++ apparently warns for plain "-u", so
    // we write the equivalent expression "0 - u" instead.
    u = 0 - u;
  }
  buffer = EncodeFullU64(u, buffer);
  *buffer = '\0';
  return buffer;
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    uint128 i, char* absl_nonnull buffer) {
  buffer = EncodeFullU128(i, buffer);
  *buffer = '\0';
  return buffer;
}

char* absl_nonnull numbers_internal::FastIntToBuffer(
    int128 i, char* absl_nonnull buffer) {
  uint128 u = static_cast<uint128>(i);
  if (i < 0) {
    *buffer++ = '-';
    u = -u;
  }
  buffer = EncodeFullU128(u, buffer);
  *buffer = '\0';
  return buffer;
}

// Although DBL_DIG is typically 15, DBL_MAX is normally represented with 17
// digits of precision. When converted to a string value with fewer digits
// of precision using strtod(), the result can be bigger than DBL_MAX due to
// a rounding error. Converting this value back to a double will produce an
// Inf which will trigger a SIGFPE if FP exceptions are enabled. We skip
// the precision check for sufficiently large values to avoid the SIGFPE.
static constexpr double kDoublePrecisionCheckMax =
    std::numeric_limits<double>::max() / 1.000000000000001;

char* absl_nonnull numbers_internal::RoundTripDoubleToBuffer(
    double d, char* absl_nonnull buffer) {
  // DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all
  // platforms these days.  Just in case some system exists where DBL_DIG
  // is significantly larger -- and risks overflowing our buffer -- we have
  // this assert.
  static_assert(std::numeric_limits<double>::digits10 < 20,
                "std::numeric_limits<double>::digits10 is too big");

  // We avoid snprintf for NaNs because it inconsistently outputs "-nan"
  // or "nan" when given a nan with the sign bit set.
  if (std::isnan(d)) {
    strcpy(buffer, "nan");  // NOLINT(runtime/printf)
    return buffer;
  }
  bool full_precision_needed = true;
  if (std::abs(d) <= kDoublePrecisionCheckMax) {
    int snprintf_result =
        snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
                 std::numeric_limits<double>::digits10, d);

    // The snprintf should never overflow because the buffer is significantly
    // larger than the precision we asked for.
    ABSL_ASSERT(snprintf_result > 0 &&
                snprintf_result < numbers_internal::kFastToBufferSize);

    full_precision_needed = strtod(buffer, nullptr) != d;
  }

  if (full_precision_needed) {
    int snprintf_result =
        snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
                 std::numeric_limits<double>::digits10 + 2, d);

    // Should never overflow; see above.
    ABSL_ASSERT(snprintf_result > 0 &&
                snprintf_result < numbers_internal::kFastToBufferSize);
  }

  // snprintf() writes the radix character chosen by the global C locale's
  // LC_NUMERIC category, so a process that has called setlocale() can end up
  // with a separator other than '.' here. The rest of Abseil's float formatting
  // (RoundTripFloatToBuffer, SixDigitsToBuffer) is locale- independent and
  // SimpleAtod() only accepts '.', so rewrite the radix back to '.' to keep
  // absl::HighPrecision(double) locale-independent and round-trippable through
  // SimpleAtod().
  // TODO: b/526633099 - Once all supported compilers ship std::to_chars with
  // floating-point support, use it here for inherent locale independence.
  const char* radix = localeconv()->decimal_point;
  // Skip an empty decimal_point (some minimal environments leave it ""), which
  // would otherwise match the beginning of the buffer and corrupt it.
  if (radix[0] != '\0' && std::strcmp(radix, ".") != 0) {
    if (char* p = std::strstr(buffer, radix)) {
      const size_t radix_len = std::strlen(radix);
      *p = '.';
      // A multibyte radix (rare, but possible in some locales) leaves trailing
      // bytes behind; collapse them so the output is a single '.'.
      if (radix_len > 1) {
        std::memmove(p + 1, p + radix_len, std::strlen(p + radix_len) + 1);
      }
    }
  }
  return buffer;
}

namespace {

// This table is used to quickly calculate the base-ten exponent of a given
// float, and then to provide a multiplier to bring that number into the
// range 1-999,999,999, that is, into uint32_t range.  Finally, the exp
// string is made available so there is one less int-to-string conversion
// to be done.
struct Spec {
  double min_range;
  double multiplier;
  const char expstr[5];
};

// clang-format off
constexpr Spec kNegExpTable[] = {
    Spec{1.4e-45f, 1e+55, "e-45"},
    Spec{1e-44f, 1e+54, "e-44"},
    Spec{1e-43f, 1e+53, "e-43"},
    Spec{1e-42f, 1e+52, "e-42"},
    Spec{1e-41f, 1e+51, "e-41"},
    Spec{1e-40f, 1e+50, "e-40"},
    Spec{1e-39f, 1e+49, "e-39"},
    Spec{1e-38f, 1e+48, "e-38"},
    Spec{1e-37f, 1e+47, "e-37"},
    Spec{1e-36f, 1e+46, "e-36"},
    Spec{1e-35f, 1e+45, "e-35"},
    Spec{1e-34f, 1e+44, "e-34"},
    Spec{1e-33f, 1e+43, "e-33"},
    Spec{1e-32f, 1e+42, "e-32"},
    Spec{1e-31f, 1e+41, "e-31"},
    Spec{1e-30f, 1e+40, "e-30"},
    Spec{1e-29f, 1e+39, "e-29"},
    Spec{1e-28f, 1e+38, "e-28"},
    Spec{1e-27f, 1e+37, "e-27"},
    Spec{1e-26f, 1e+36, "e-26"},
    Spec{1e-25f, 1e+35, "e-25"},
    Spec{1e-24f, 1e+34, "e-24"},
    Spec{1e-23f, 1e+33, "e-23"},
    Spec{1e-22f, 1e+32, "e-22"},
    Spec{1e-21f, 1e+31, "e-21"},
    Spec{1e-20f, 1e+30, "e-20"},
    Spec{1e-19f, 1e+29, "e-19"},
    Spec{1e-18f, 1e+28, "e-18"},
    Spec{1e-17f, 1e+27, "e-17"},
    Spec{1e-16f, 1e+26, "e-16"},
    Spec{1e-15f, 1e+25, "e-15"},
    Spec{1e-14f, 1e+24, "e-14"},
    Spec{1e-13f, 1e+23, "e-13"},
    Spec{1e-12f, 1e+22, "e-12"},
    Spec{1e-11f, 1e+21, "e-11"},
    Spec{1e-10f, 1e+20, "e-10"},
    Spec{1e-09f, 1e+19, "e-09"},
    Spec{1e-08f, 1e+18, "e-08"},
    Spec{1e-07f, 1e+17, "e-07"},
    Spec{1e-06f, 1e+16, "e-06"},
    Spec{1e-05f, 1e+15, "e-05"},
    Spec{1e-04f, 1e+14, "e-04"},
};
// clang-format on

// clang-format off
constexpr Spec kPosExpTable[] = {
    Spec{1e+08f, 1e+02, "e+08"},
    Spec{1e+09f, 1e+01, "e+09"},
    Spec{1e+10f, 1e+00, "e+10"},
    Spec{1e+11f, 1e-01, "e+11"},
    Spec{1e+12f, 1e-02, "e+12"},
    Spec{1e+13f, 1e-03, "e+13"},
    Spec{1e+14f, 1e-04, "e+14"},
    Spec{1e+15f, 1e-05, "e+15"},
    Spec{1e+16f, 1e-06, "e+16"},
    Spec{1e+17f, 1e-07, "e+17"},
    Spec{1e+18f, 1e-08, "e+18"},
    Spec{1e+19f, 1e-09, "e+19"},
    Spec{1e+20f, 1e-10, "e+20"},
    Spec{1e+21f, 1e-11, "e+21"},
    Spec{1e+22f, 1e-12, "e+22"},
    Spec{1e+23f, 1e-13, "e+23"},
    Spec{1e+24f, 1e-14, "e+24"},
    Spec{1e+25f, 1e-15, "e+25"},
    Spec{1e+26f, 1e-16, "e+26"},
    Spec{1e+27f, 1e-17, "e+27"},
    Spec{1e+28f, 1e-18, "e+28"},
    Spec{1e+29f, 1e-19, "e+29"},
    Spec{1e+30f, 1e-20, "e+30"},
    Spec{1e+31f, 1e-21, "e+31"},
    Spec{1e+32f, 1e-22, "e+32"},
    Spec{1e+33f, 1e-23, "e+33"},
    Spec{1e+34f, 1e-24, "e+34"},
    Spec{1e+35f, 1e-25, "e+35"},
    Spec{1e+36f, 1e-26, "e+36"},
    Spec{1e+37f, 1e-27, "e+37"},
    Spec{1e+38f, 1e-28, "e+38"},
    Spec{1e+39,  1e-29, "e+39"},
};
// clang-format on

struct ExpCompare {
  bool operator()(const Spec& spec, double d) const {
    return spec.min_range < d;
  }
};

}  // namespace

// Utility routine(s) for RoundTripFloatToBuffer:
// OutputNecessaryDigits takes two 11-digit numbers, whose integer portion
// represents the fractional part of a floating-point number, and outputs a
// number that is in-between them, with the fewest digits possible. For
// instance, given 12345678900 and 12345876900, it would output "0123457".
// When there are multiple final digits that would satisfy this requirement,
// this routine attempts to use a digit that would represent the average of
// lower_double and upper_double.
//
// Although the routine works using integers, all callers use doubles, so
// for their convenience this routine accepts doubles.
static char* absl_nonnull OutputNecessaryDigits(double lower_double,
                                                double upper_double,
                                                char* absl_nonnull out) {
  assert(lower_double > 0);
  assert(lower_double < upper_double - 10);
  assert(upper_double < 100000000000.0);

  // Narrow the range a bit; without this bias, an input of lower=87654320010.0
  // and upper=87654320100.0 would produce an output of 876543201
  //
  // We do this in three steps: first, we lower the upper bound and truncate it
  // to an integer.  Then, we increase the lower bound by exactly the amount we
  // just decreased the upper bound by - at that point, the midpoint is exactly
  // where it used to be.  Then we truncate the lower bound.

  uint64_t upper64 = static_cast<uint64_t>(upper_double - (1.0 / 1024));
  double shrink = upper_double - upper64;
  uint64_t lower64 = static_cast<uint64_t>(lower_double + shrink);

  // Theory of operation: we convert the lower number to ascii representation,
  // two digits at a time.  As we go, we remove the same digits from the upper
  // number.  When we see the upper number does not share those same digits, we
  // know we can stop converting. When we stop, the last digit we output is
  // taken from the average of upper and lower values, rounded up.
  char buf[2];
  uint32_t lodigits =
      static_cast<uint32_t>(lower64 / 1000000000);  // 1,000,000,000
  uint64_t mul64 = lodigits * uint64_t{1000000000};

  numbers_internal::PutTwoDigits(lodigits, out);
  out += 2;
  if (upper64 - mul64 >= 1000000000) {  // digit mismatch!
    numbers_internal::PutTwoDigits(static_cast<uint32_t>(upper64 / 1000000000),
                                   buf);
    if (out[-2] != buf[0]) {
      out[-2] = static_cast<char>('0' + (upper64 + lower64 + 10000000000) /
                                            20000000000);
      --out;
    } else {
      numbers_internal::PutTwoDigits(
          static_cast<uint32_t>((upper64 + lower64 + 1000000000) / 2000000000),
          out - 2);
    }
    *out = '\0';
    return out;
  }
  uint32_t lower = static_cast<uint32_t>(lower64 - mul64);
  uint32_t upper = static_cast<uint32_t>(upper64 - mul64);

  lodigits = lower / 10000000;  // 10,000,000
  uint32_t mul = lodigits * 10000000;
  numbers_internal::PutTwoDigits(lodigits, out);
  out += 2;
  if (upper - mul >= 10000000) {  // digit mismatch!
    numbers_internal::PutTwoDigits(upper / 10000000, buf);
    if (out[-2] != buf[0]) {
      out[-2] = '0' + (upper + lower + 100000000) / 200000000;
      --out;
    } else {
      numbers_internal::PutTwoDigits((upper + lower + 10000000) / 20000000,
                                      out - 2);
    }
    *out = '\0';
    return out;
  }
  lower -= mul;
  upper -= mul;

  lodigits = lower / 100000;  // 100,000
  mul = lodigits * 100000;
  numbers_internal::PutTwoDigits(lodigits, out);
  out += 2;
  if (upper - mul >= 100000) {  // digit mismatch!
    numbers_internal::PutTwoDigits(upper / 100000, buf);
    if (out[-2] != buf[0]) {
      out[-2] = static_cast<char>('0' + (upper + lower + 1000000) / 2000000);
      --out;
    } else {
      numbers_internal::PutTwoDigits((upper + lower + 100000) / 200000,
                                      out - 2);
    }
    *out = '\0';
    return out;
  }
  lower -= mul;
  upper -= mul;

  lodigits = lower / 1000;
  mul = lodigits * 1000;
  numbers_internal::PutTwoDigits(lodigits, out);
  out += 2;
  if (upper - mul >= 1000) {  // digit mismatch!
    numbers_internal::PutTwoDigits(upper / 1000, buf);
    if (out[-2] != buf[0]) {
      out[-2] = static_cast<char>('0' + (upper + lower + 10000) / 20000);
      --out;
    } else {
      numbers_internal::PutTwoDigits((upper + lower + 1000) / 2000, out - 2);
    }
    *out = '\0';
    return out;
  }
  lower -= mul;
  upper -= mul;

  numbers_internal::PutTwoDigits(lower / 10, out);
  out += 2;
  numbers_internal::PutTwoDigits(upper / 10, buf);
  if (out[-2] != buf[0]) {
    out[-2] = static_cast<char>('0' + (upper + lower + 100) / 200);
    --out;
  } else {
    numbers_internal::PutTwoDigits((upper + lower + 10) / 20, out - 2);
  }
  *out = '\0';
  return out;
}

// RoundTripFloatToBuffer converts the given float into a string which, if
// passed to strtof, will produce the exact same original float.  It does this
// by computing the range of possible doubles which map to the given float, and
// then examining the digits of the doubles in that range.  If all the doubles
// in the range start with "2.37", then clearly our float does, too.  As soon as
// they diverge, only one more digit is needed.
char* absl_nonnull numbers_internal::RoundTripFloatToBuffer(
    float f, char* absl_nonnull buffer) {
  static_assert(std::numeric_limits<float>::is_iec559,
                "IEEE-754/IEC-559 support only");

  // We write data to out, incrementing as we go, but FloatToBuffer always
  // returns the address of the buffer passed in.
  char* out = buffer;

  if (std::isnan(f)) {
    strcpy(out, "nan");  // NOLINT(runtime/printf)
    return buffer;
  }
  if (f == 0) {  // +0 and -0 are handled here
    if (std::signbit(f)) {
      strcpy(out, "-0");  // NOLINT(runtime/printf)
    } else {
      strcpy(out, "0");  // NOLINT(runtime/printf)
    }
    return buffer;
  }
  if (f < 0) {
    *out++ = '-';
    f = -f;
  }
  if (f > std::numeric_limits<float>::max()) {
    strcpy(out, "inf");  // NOLINT(runtime/printf)
    return buffer;
  }

  double next_lower = nextafterf(f, 0.0f);
  // For all doubles in the range lower_bound < f < upper_bound, the
  // nearest float is f.
  double lower_bound = (f + next_lower) * 0.5;
  double upper_bound = f + (f - lower_bound);
  // Note: because std::nextafter is slow, we calculate upper_bound
  // assuming that it is the same distance from f as lower_bound is.
  // For exact powers of two, upper_bound is actually twice as far
  // from f as lower_bound is, but this turns out not to matter.

  // Most callers pass floats that are either 0 or within the
  // range 0.0001 through 100,000,000, so handle those first,
  // since they don't need exponential notation.
  const Spec* spec = nullptr;
  if (f < 1.0) {
    if (f >= 0.0001f) {
      // For fractional values, we set up the multiplier at the same
      // time as we output the leading "0." / "0.0" / "0.00" / "0.000"
      double multiplier = 1e+11;
      *out++ = '0';
      *out++ = '.';
      if (f < 0.1f) {
        multiplier = 1e+12;
        *out++ = '0';
        if (f < 0.01f) {
          multiplier = 1e+13;
          *out++ = '0';
          if (f < 0.001f) {
            multiplier = 1e+14;
            *out++ = '0';
          }
        }
      }
      OutputNecessaryDigits(lower_bound * multiplier, upper_bound * multiplier,
                            out);
      return buffer;
    }
    spec = std::lower_bound(std::begin(kNegExpTable), std::end(kNegExpTable),
                            double{f}, ExpCompare());
    if (spec == std::end(kNegExpTable)) --spec;
  } else if (f < 1e8) {
    // Handling non-exponential format greater than 1.0 is similar to the above,
    // but instead of 0.0 / 0.00 / 0.000, the prefix is simply the truncated
    // integer part of f.
    int32_t as_int = static_cast<int32_t>(f);
    out = numbers_internal::FastIntToBuffer(as_int, out);
    // Easy: if the integer part is within (lower_bound, upper_bound), then we
    // are already done.
    if (as_int > lower_bound && as_int < upper_bound) {
      return buffer;
    }
    *out++ = '.';
    OutputNecessaryDigits((lower_bound - as_int) * 1e11,
                          (upper_bound - as_int) * 1e11, out);
    return buffer;
  } else {
    spec = std::lower_bound(std::begin(kPosExpTable), std::end(kPosExpTable),
                            double{f}, ExpCompare());
    if (spec == std::end(kPosExpTable)) --spec;
  }
  // Exponential notation from here on.  "spec" was computed using lower_bound,
  // which means it's the first spec from the table where min_range is greater
  // or equal to f.
  // Unfortunately that's not quite what we want; we want a min_range that is
  // less or equal.  So first thing, if it was greater, back up one entry.
  if (spec->min_range > f) --spec;

  // The digits might be "237000123", but we want "2.37000123",
  // so we output the digits one character later, and then move the first
  // digit back so we can stick the "." in.
  char* start = out;
  out = OutputNecessaryDigits(lower_bound * spec->multiplier,
                              upper_bound * spec->multiplier, start + 1);
  start[0] = start[1];
  start[1] = '.';

  // If it turns out there was only one digit output, then back up over the '.'
  if (out == &start[2]) --out;

  // Now add the "e+NN" part.
  memcpy(out, spec->expstr, 4);
  out[4] = '\0';
  return buffer;
}

// Given a 128-bit number expressed as a pair of uint64_t, high half first,
// return that number multiplied by the given 32-bit value.  If the result is
// too large to fit in a 128-bit number, divide it by 2 until it fits.
static std::pair<uint64_t, uint64_t> Mul32(std::pair<uint64_t, uint64_t> num,
                                           uint32_t mul) {
  uint64_t bits0_31 = num.second & 0xFFFFFFFF;
  uint64_t bits32_63 = num.second >> 32;
  uint64_t bits64_95 = num.first & 0xFFFFFFFF;
  uint64_t bits96_127 = num.first >> 32;

  // The picture so far: each of these 64-bit values has only the lower 32 bits
  // filled in.
  // bits96_127:          [ 00000000 xxxxxxxx ]
  // bits64_95:                    [ 00000000 xxxxxxxx ]
  // bits32_63:                             [ 00000000 xxxxxxxx ]
  // bits0_31:                                       [ 00000000 xxxxxxxx ]

  bits0_31 *= mul;
  bits32_63 *= mul;
  bits64_95 *= mul;
  bits96_127 *= mul;

  // Now the top halves may also have value, though all 64 of their bits will
  // never be set at the same time, since they are a result of a 32x32 bit
  // multiply.  This makes the carry calculation slightly easier.
  // bits96_127:          [ mmmmmmmm | mmmmmmmm ]
  // bits64_95:                    [ | mmmmmmmm mmmmmmmm | ]
  // bits32_63:                      |        [ mmmmmmmm | mmmmmmmm ]
  // bits0_31:                       |                 [ | mmmmmmmm mmmmmmmm ]
  // eventually:        [ bits128_up | ...bits64_127.... | ..bits0_63... ]

  uint64_t bits0_63 = bits0_31 + (bits32_63 << 32);
  uint64_t bits64_127 = bits64_95 + (bits96_127 << 32) + (bits32_63 >> 32) +
                        (bits0_63 < bits0_31);
  uint64_t bits128_up = (bits96_127 >> 32) + (bits64_127 < bits64_95);
  if (bits128_up == 0) return {bits64_127, bits0_63};

  auto shift = static_cast<unsigned>(bit_width(bits128_up));
  uint64_t lo = (bits0_63 >> shift) + (bits64_127 << (64 - shift));
  uint64_t hi = (bits64_127 >> shift) + (bits128_up << (64 - shift));
  return {hi, lo};
}

// Compute num * 5 ^ expfive, and return the first 128 bits of the result,
// where the first bit is always a one.  So PowFive(1, 0) starts 0b100000,
// PowFive(1, 1) starts 0b101000, PowFive(1, 2) starts 0b110010, etc.
static std::pair<uint64_t, uint64_t> PowFive(uint64_t num, int expfive) {
  std::pair<uint64_t, uint64_t> result = {num, 0};
  while (expfive >= 13) {
    // 5^13 is the highest power of five that will fit in a 32-bit integer.
    result = Mul32(result, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5);
    expfive -= 13;
  }
  constexpr uint32_t powers_of_five[13] = {
      1,
      5,
      5 * 5,
      5 * 5 * 5,
      5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
      5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5};
  result = Mul32(result, powers_of_five[expfive & 15]);
  int shift = countl_zero(result.first);
  if (shift != 0) {
    result.first = (result.first << shift) + (result.second >> (64 - shift));
    result.second = (result.second << shift);
  }
  return result;
}

struct ExpDigits {
  int32_t exponent;
  char digits[6];
};

// SplitToSix converts value, a positive double-precision floating-point number,
// into a base-10 exponent and 6 ASCII digits, where the first digit is never
// zero.  For example, SplitToSix(1) returns an exponent of zero and a digits
// array of {'1', '0', '0', '0', '0', '0'}.  If value is exactly halfway between
// two possible representations, e.g. value = 100000.5, then "round to even" is
// performed.
static ExpDigits SplitToSix(const double value) {
  ExpDigits exp_dig;
  int exp = 5;
  double d = value;
  // First step: calculate a close approximation of the output, where the
  // value d will be between 100,000 and 999,999, representing the digits
  // in the output ASCII array, and exp is the base-10 exponent.  It would be
  // faster to use a table here, and to look up the base-2 exponent of value,
  // however value is an IEEE-754 64-bit number, so the table would have 2,000
  // entries, which is not cache-friendly.
  if (d >= 999999.5) {
    if (d >= 1e+261) exp += 256, d *= 1e-256;
    if (d >= 1e+133) exp += 128, d *= 1e-128;
    if (d >= 1e+69) exp += 64, d *= 1e-64;
    if (d >= 1e+37) exp += 32, d *= 1e-32;
    if (d >= 1e+21) exp += 16, d *= 1e-16;
    if (d >= 1e+13) exp += 8, d *= 1e-8;
    if (d >= 1e+9) exp += 4, d *= 1e-4;
    if (d >= 1e+7) exp += 2, d *= 1e-2;
    if (d >= 1e+6) exp += 1, d *= 1e-1;
  } else {
    if (d < 1e-250) exp -= 256, d *= 1e256;
    if (d < 1e-122) exp -= 128, d *= 1e128;
    if (d < 1e-58) exp -= 64, d *= 1e64;
    if (d < 1e-26) exp -= 32, d *= 1e32;
    if (d < 1e-10) exp -= 16, d *= 1e16;
    if (d < 1e-2) exp -= 8, d *= 1e8;
    if (d < 1e+2) exp -= 4, d *= 1e4;
    if (d < 1e+4) exp -= 2, d *= 1e2;
    if (d < 1e+5) exp -= 1, d *= 1e1;
  }
  // At this point, d is in the range [99999.5..999999.5) and exp is in the
  // range [-324..308]. Since we need to round d up, we want to add a half
  // and truncate.
  // However, the technique above may have lost some precision, due to its
  // repeated multiplication by constants that each may be off by half a bit
  // of precision.  This only matters if we're close to the edge though.
  // Since we'd like to know if the fractional part of d is close to a half,
  // we multiply it by 65536 and see if the fractional part is close to 32768.
  // (The number doesn't have to be a power of two,but powers of two are faster)
  uint64_t d64k = static_cast<uint64_t>(d * 65536);
  uint32_t dddddd;  // A 6-digit decimal integer.
  if ((d64k % 65536) == 32767 || (d64k % 65536) == 32768) {
    // OK, it's fairly likely that precision was lost above, which is
    // not a surprise given only 52 mantissa bits are available.  Therefore
    // redo the calculation using 128-bit numbers.  (64 bits are not enough).

    // Start out with digits rounded down; maybe add one below.
    dddddd = static_cast<uint32_t>(d64k / 65536);

    // mantissa is a 64-bit integer representing M.mmm... * 2^63.  The actual
    // value we're representing, of course, is M.mmm... * 2^exp2.
    int exp2;
    double m = std::frexp(value, &exp2);
    uint64_t mantissa =
        static_cast<uint64_t>(m * (32768.0 * 65536.0 * 65536.0 * 65536.0));
    // std::frexp returns an m value in the range [0.5, 1.0), however we
    // can't multiply it by 2^64 and convert to an integer because some FPUs
    // throw an exception when converting an number higher than 2^63 into an
    // integer - even an unsigned 64-bit integer!  Fortunately it doesn't matter
    // since m only has 52 significant bits anyway.
    mantissa <<= 1;
    exp2 -= 64;  // not needed, but nice for debugging

    // OK, we are here to compare:
    //     (dddddd + 0.5) * 10^(exp-5)  vs.  mantissa * 2^exp2
    // so we can round up dddddd if appropriate.  Those values span the full
    // range of 600 orders of magnitude of IEE 64-bit floating-point.
    // Fortunately, we already know they are very close, so we don't need to
    // track the base-2 exponent of both sides.  This greatly simplifies the
    // the math since the 2^exp2 calculation is unnecessary and the power-of-10
    // calculation can become a power-of-5 instead.

    std::pair<uint64_t, uint64_t> edge, val;
    if (exp >= 6) {
      // Compare (dddddd + 0.5) * 5 ^ (exp - 5) to mantissa
      // Since we're tossing powers of two, 2 * dddddd + 1 is the
      // same as dddddd + 0.5
      edge = PowFive(2 * dddddd + 1, exp - 5);

      val.first = mantissa;
      val.second = 0;
    } else {
      // We can't compare (dddddd + 0.5) * 5 ^ (exp - 5) to mantissa as we did
      // above because (exp - 5) is negative.  So we compare (dddddd + 0.5) to
      // mantissa * 5 ^ (5 - exp)
      edge = PowFive(2 * dddddd + 1, 0);

      val = PowFive(mantissa, 5 - exp);
    }
    // printf("exp=%d %016lx %016lx vs %016lx %016lx\n", exp, val.first,
    //        val.second, edge.first, edge.second);
    if (val > edge) {
      dddddd++;
    } else if (val == edge) {
      dddddd += (dddddd & 1);
    }
  } else {
    // Here, we are not close to the edge.
    dddddd = static_cast<uint32_t>((d64k + 32768) / 65536);
  }
  if (dddddd == 1000000) {
    dddddd = 100000;
    exp += 1;
  }
  exp_dig.exponent = exp;

  uint32_t two_digits = dddddd / 10000;
  dddddd -= two_digits * 10000;
  numbers_internal::PutTwoDigits(two_digits, &exp_dig.digits[0]);

  two_digits = dddddd / 100;
  dddddd -= two_digits * 100;
  numbers_internal::PutTwoDigits(two_digits, &exp_dig.digits[2]);

  numbers_internal::PutTwoDigits(dddddd, &exp_dig.digits[4]);
  return exp_dig;
}

// Helper function for fast formatting of floating-point.
// The result is the same as "%g", a.k.a. "%.6g".
size_t numbers_internal::SixDigitsToBuffer(double d,
                                           char* absl_nonnull const buffer) {
  static_assert(std::numeric_limits<float>::is_iec559,
                "IEEE-754/IEC-559 support only");

  char* out = buffer;  // we write data to out, incrementing as we go, but
                       // FloatToBuffer always returns the address of the buffer
                       // passed in.

  if (std::isnan(d)) {
    strcpy(out, "nan");  // NOLINT(runtime/printf)
    return 3;
  }
  if (d == 0) {  // +0 and -0 are handled here
    if (std::signbit(d)) *out++ = '-';
    *out++ = '0';
    *out = 0;
    return static_cast<size_t>(out - buffer);
  }
  if (d < 0) {
    *out++ = '-';
    d = -d;
  }
  if (d > std::numeric_limits<double>::max()) {
    strcpy(out, "inf");  // NOLINT(runtime/printf)
    return static_cast<size_t>(out + 3 - buffer);
  }

  auto exp_dig = SplitToSix(d);
  int exp = exp_dig.exponent;
  const char* digits = exp_dig.digits;
  out[0] = '0';
  out[1] = '.';
  switch (exp) {
    case 5:
      memcpy(out, &digits[0], 6), out += 6;
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case 4:
      memcpy(out, &digits[0], 5), out += 5;
      if (digits[5] != '0') {
        *out++ = '.';
        *out++ = digits[5];
      }
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case 3:
      memcpy(out, &digits[0], 4), out += 4;
      if ((digits[5] | digits[4]) != '0') {
        *out++ = '.';
        *out++ = digits[4];
        if (digits[5] != '0') *out++ = digits[5];
      }
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case 2:
      memcpy(out, &digits[0], 3), out += 3;
      *out++ = '.';
      memcpy(out, &digits[3], 3);
      out += 3;
      while (out[-1] == '0') --out;
      if (out[-1] == '.') --out;
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case 1:
      memcpy(out, &digits[0], 2), out += 2;
      *out++ = '.';
      memcpy(out, &digits[2], 4);
      out += 4;
      while (out[-1] == '0') --out;
      if (out[-1] == '.') --out;
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case 0:
      memcpy(out, &digits[0], 1), out += 1;
      *out++ = '.';
      memcpy(out, &digits[1], 5);
      out += 5;
      while (out[-1] == '0') --out;
      if (out[-1] == '.') --out;
      *out = 0;
      return static_cast<size_t>(out - buffer);
    case -4:
      out[2] = '0';
      ++out;
      ABSL_FALLTHROUGH_INTENDED;
    case -3:
      out[2] = '0';
      ++out;
      ABSL_FALLTHROUGH_INTENDED;
    case -2:
      out[2] = '0';
      ++out;
      ABSL_FALLTHROUGH_INTENDED;
    case -1:
      out += 2;
      memcpy(out, &digits[0], 6);
      out += 6;
      while (out[-1] == '0') --out;
      *out = 0;
      return static_cast<size_t>(out - buffer);
  }
  assert(exp < -4 || exp >= 6);
  out[0] = digits[0];
  assert(out[1] == '.');
  out += 2;
  memcpy(out, &digits[1], 5), out += 5;
  while (out[-1] == '0') --out;
  if (out[-1] == '.') --out;
  *out++ = 'e';
  if (exp > 0) {
    *out++ = '+';
  } else {
    *out++ = '-';
    exp = -exp;
  }
  if (exp > 99) {
    int dig1 = exp / 100;
    exp -= dig1 * 100;
    *out++ = '0' + static_cast<char>(dig1);
  }
  PutTwoDigits(static_cast<uint32_t>(exp), out);
  out += 2;
  *out = 0;
  return static_cast<size_t>(out - buffer);
}

namespace {
// Represents integer values of digits.
// Uses 36 to indicate an invalid character since we support
// bases up to 36.
static constexpr std::array<int8_t, 256> kAsciiToInt = {
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  // 16 36s.
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0,  1,  2,  3,  4,  5,
    6,  7,  8,  9,  36, 36, 36, 36, 36, 36, 36, 10, 11, 12, 13, 14, 15, 16, 17,
    18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
    36, 36, 36, 36, 36, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36};

// Parse the sign and optional hex or oct prefix in text.
inline bool safe_parse_sign_and_base(
    absl::string_view* absl_nonnull text /*inout*/,
    int* absl_nonnull base_ptr /*inout*/,
    bool* absl_nonnull negative_ptr /*output*/) {
  if (text->data() == nullptr) {
    return false;
  }

  const char* start = text->data();
  const char* end = start + text->size();
  int base = *base_ptr;

  // Consume whitespace.
  while (start < end &&
         absl::ascii_isspace(static_cast<unsigned char>(start[0]))) {
    ++start;
  }
  while (start < end &&
         absl::ascii_isspace(static_cast<unsigned char>(end[-1]))) {
    --end;
  }
  if (start >= end) {
    return false;
  }

  // Consume sign.
  *negative_ptr = (start[0] == '-');
  if (*negative_ptr || start[0] == '+') {
    ++start;
    if (start >= end) {
      return false;
    }
  }

  // Consume base-dependent prefix.
  //  base 0: "0x" -> base 16, "0" -> base 8, default -> base 10
  //  base 16: "0x" -> base 16
  // Also validate the base.
  if (base == 0) {
    if (end - start >= 2 && start[0] == '0' &&
        (start[1] == 'x' || start[1] == 'X')) {
      base = 16;
      start += 2;
      if (start >= end) {
        // "0x" with no digits after is invalid.
        return false;
      }
    } else if (end - start >= 1 && start[0] == '0') {
      base = 8;
      start += 1;
    } else {
      base = 10;
    }
  } else if (base == 16) {
    if (end - start >= 2 && start[0] == '0' &&
        (start[1] == 'x' || start[1] == 'X')) {
      start += 2;
      if (start >= end) {
        // "0x" with no digits after is invalid.
        return false;
      }
    }
  } else if (base >= 2 && base <= 36) {
    // okay
  } else {
    return false;
  }
  *text = absl::string_view(start, static_cast<size_t>(end - start));
  *base_ptr = base;
  return true;
}

// Consume digits.
//
// The classic loop:
//
//   for each digit
//     value = value * base + digit
//   value *= sign
//
// The classic loop needs overflow checking.  It also fails on the most
// negative integer, -2147483648 in 32-bit two's complement representation.
//
// My improved loop:
//
//  if (!negative)
//    for each digit
//      value = value * base
//      value = value + digit
//  else
//    for each digit
//      value = value * base
//      value = value - digit
//
// Overflow checking becomes simple.

// Lookup tables per IntType:
// vmax/base and vmin/base are precomputed because division costs at least 8ns.
// TODO(junyer): Doing this per base instead (i.e. an array of structs, not a
// struct of arrays) would probably be better in terms of d-cache for the most
// commonly used bases.
template <typename IntType>
struct LookupTables {
  ABSL_CONST_INIT static const IntType kVmaxOverBase[];
  ABSL_CONST_INIT static const IntType kVminOverBase[];
};

// An array initializer macro for X/base where base in [0, 36].
// However, note that lookups for base in [0, 1] should never happen because
// base has been validated to be in [2, 36] by safe_parse_sign_and_base().
#define X_OVER_BASE_INITIALIZER(X)                                        \
  {                                                                       \
    0, 0, X / 2, X / 3, X / 4, X / 5, X / 6, X / 7, X / 8, X / 9, X / 10, \
        X / 11, X / 12, X / 13, X / 14, X / 15, X / 16, X / 17, X / 18,   \
        X / 19, X / 20, X / 21, X / 22, X / 23, X / 24, X / 25, X / 26,   \
        X / 27, X / 28, X / 29, X / 30, X / 31, X / 32, X / 33, X / 34,   \
        X / 35, X / 36,                                                   \
  }

// This kVmaxOverBase is generated with
//  for (int base = 2; base < 37; ++base) {
//    absl::uint128 max = std::numeric_limits<absl::uint128>::max();
//    auto result = max / base;
//    std::cout << "    MakeUint128(" << absl::Uint128High64(result) << "u, "
//              << absl::Uint128Low64(result) << "u),\n";
//  }
// See https://godbolt.org/z/aneYsb
//
// uint128& operator/=(uint128) is not constexpr, so hardcode the resulting
// array to avoid a static initializer.
template <>
ABSL_CONST_INIT const uint128 LookupTables<uint128>::kVmaxOverBase[] = {
    0,
    0,
    MakeUint128(9223372036854775807u, 18446744073709551615u),
    MakeUint128(6148914691236517205u, 6148914691236517205u),
    MakeUint128(4611686018427387903u, 18446744073709551615u),
    MakeUint128(3689348814741910323u, 3689348814741910323u),
    MakeUint128(3074457345618258602u, 12297829382473034410u),
    MakeUint128(2635249153387078802u, 5270498306774157604u),
    MakeUint128(2305843009213693951u, 18446744073709551615u),
    MakeUint128(2049638230412172401u, 14347467612885206812u),
    MakeUint128(1844674407370955161u, 11068046444225730969u),
    MakeUint128(1676976733973595601u, 8384883669867978007u),
    MakeUint128(1537228672809129301u, 6148914691236517205u),
    MakeUint128(1418980313362273201u, 4256940940086819603u),
    MakeUint128(1317624576693539401u, 2635249153387078802u),
    MakeUint128(1229782938247303441u, 1229782938247303441u),
    MakeUint128(1152921504606846975u, 18446744073709551615u),
    MakeUint128(1085102592571150095u, 1085102592571150095u),
    MakeUint128(1024819115206086200u, 16397105843297379214u),
    MakeUint128(970881267037344821u, 16504981539634861972u),
    MakeUint128(922337203685477580u, 14757395258967641292u),
    MakeUint128(878416384462359600u, 14054662151397753612u),
    MakeUint128(838488366986797800u, 13415813871788764811u),
    MakeUint128(802032351030850070u, 4812194106185100421u),
    MakeUint128(768614336404564650u, 12297829382473034410u),
    MakeUint128(737869762948382064u, 11805916207174113034u),
    MakeUint128(709490156681136600u, 11351842506898185609u),
    MakeUint128(683212743470724133u, 17080318586768103348u),
    MakeUint128(658812288346769700u, 10540996613548315209u),
    MakeUint128(636094623231363848u, 15266270957552732371u),
    MakeUint128(614891469123651720u, 9838263505978427528u),
    MakeUint128(595056260442243600u, 9520900167075897608u),
    MakeUint128(576460752303423487u, 18446744073709551615u),
    MakeUint128(558992244657865200u, 8943875914525843207u),
    MakeUint128(542551296285575047u, 9765923333140350855u),
    MakeUint128(527049830677415760u, 8432797290838652167u),
    MakeUint128(512409557603043100u, 8198552921648689607u),
};

// This kVmaxOverBase generated with
//   for (int base = 2; base < 37; ++base) {
//    absl::int128 max = std::numeric_limits<absl::int128>::max();
//    auto result = max / base;
//    std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", "
//              << absl::Int128Low64(result) << "u),\n";
//  }
// See https://godbolt.org/z/7djYWz
//
// int128& operator/=(int128) is not constexpr, so hardcode the resulting array
// to avoid a static initializer.
template <>
ABSL_CONST_INIT const int128 LookupTables<int128>::kVmaxOverBase[] = {
    0,
    0,
    MakeInt128(4611686018427387903, 18446744073709551615u),
    MakeInt128(3074457345618258602, 12297829382473034410u),
    MakeInt128(2305843009213693951, 18446744073709551615u),
    MakeInt128(1844674407370955161, 11068046444225730969u),
    MakeInt128(1537228672809129301, 6148914691236517205u),
    MakeInt128(1317624576693539401, 2635249153387078802u),
    MakeInt128(1152921504606846975, 18446744073709551615u),
    MakeInt128(1024819115206086200, 16397105843297379214u),
    MakeInt128(922337203685477580, 14757395258967641292u),
    MakeInt128(838488366986797800, 13415813871788764811u),
    MakeInt128(768614336404564650, 12297829382473034410u),
    MakeInt128(709490156681136600, 11351842506898185609u),
    MakeInt128(658812288346769700, 10540996613548315209u),
    MakeInt128(614891469123651720, 9838263505978427528u),
    MakeInt128(576460752303423487, 18446744073709551615u),
    MakeInt128(542551296285575047, 9765923333140350855u),
    MakeInt128(512409557603043100, 8198552921648689607u),
    MakeInt128(485440633518672410, 17475862806672206794u),
    MakeInt128(461168601842738790, 7378697629483820646u),
    MakeInt128(439208192231179800, 7027331075698876806u),
    MakeInt128(419244183493398900, 6707906935894382405u),
    MakeInt128(401016175515425035, 2406097053092550210u),
    MakeInt128(384307168202282325, 6148914691236517205u),
    MakeInt128(368934881474191032, 5902958103587056517u),
    MakeInt128(354745078340568300, 5675921253449092804u),
    MakeInt128(341606371735362066, 17763531330238827482u),
    MakeInt128(329406144173384850, 5270498306774157604u),
    MakeInt128(318047311615681924, 7633135478776366185u),
    MakeInt128(307445734561825860, 4919131752989213764u),
    MakeInt128(297528130221121800, 4760450083537948804u),
    MakeInt128(288230376151711743, 18446744073709551615u),
    MakeInt128(279496122328932600, 4471937957262921603u),
    MakeInt128(271275648142787523, 14106333703424951235u),
    MakeInt128(263524915338707880, 4216398645419326083u),
    MakeInt128(256204778801521550, 4099276460824344803u),
};

// This kVminOverBase generated with
//  for (int base = 2; base < 37; ++base) {
//    absl::int128 min = std::numeric_limits<absl::int128>::min();
//    auto result = min / base;
//    std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", "
//              << absl::Int128Low64(result) << "u),\n";
//  }
//
// See https://godbolt.org/z/7djYWz
//
// int128& operator/=(int128) is not constexpr, so hardcode the resulting array
// to avoid a static initializer.
template <>
ABSL_CONST_INIT const int128 LookupTables<int128>::kVminOverBase[] = {
    0,
    0,
    MakeInt128(-4611686018427387904, 0u),
    MakeInt128(-3074457345618258603, 6148914691236517206u),
    MakeInt128(-2305843009213693952, 0u),
    MakeInt128(-1844674407370955162, 7378697629483820647u),
    MakeInt128(-1537228672809129302, 12297829382473034411u),
    MakeInt128(-1317624576693539402, 15811494920322472814u),
    MakeInt128(-1152921504606846976, 0u),
    MakeInt128(-1024819115206086201, 2049638230412172402u),
    MakeInt128(-922337203685477581, 3689348814741910324u),
    MakeInt128(-838488366986797801, 5030930201920786805u),
    MakeInt128(-768614336404564651, 6148914691236517206u),
    MakeInt128(-709490156681136601, 7094901566811366007u),
    MakeInt128(-658812288346769701, 7905747460161236407u),
    MakeInt128(-614891469123651721, 8608480567731124088u),
    MakeInt128(-576460752303423488, 0u),
    MakeInt128(-542551296285575048, 8680820740569200761u),
    MakeInt128(-512409557603043101, 10248191152060862009u),
    MakeInt128(-485440633518672411, 970881267037344822u),
    MakeInt128(-461168601842738791, 11068046444225730970u),
    MakeInt128(-439208192231179801, 11419412998010674810u),
    MakeInt128(-419244183493398901, 11738837137815169211u),
    MakeInt128(-401016175515425036, 16040647020617001406u),
    MakeInt128(-384307168202282326, 12297829382473034411u),
    MakeInt128(-368934881474191033, 12543785970122495099u),
    MakeInt128(-354745078340568301, 12770822820260458812u),
    MakeInt128(-341606371735362067, 683212743470724134u),
    MakeInt128(-329406144173384851, 13176245766935394012u),
    MakeInt128(-318047311615681925, 10813608594933185431u),
    MakeInt128(-307445734561825861, 13527612320720337852u),
    MakeInt128(-297528130221121801, 13686293990171602812u),
    MakeInt128(-288230376151711744, 0u),
    MakeInt128(-279496122328932601, 13974806116446630013u),
    MakeInt128(-271275648142787524, 4340410370284600381u),
    MakeInt128(-263524915338707881, 14230345428290225533u),
    MakeInt128(-256204778801521551, 14347467612885206813u),
};

template <typename IntType>
ABSL_CONST_INIT const IntType LookupTables<IntType>::kVmaxOverBase[] =
    X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::max());

template <typename IntType>
ABSL_CONST_INIT const IntType LookupTables<IntType>::kVminOverBase[] =
    X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::min());

#undef X_OVER_BASE_INITIALIZER

template <typename IntType>
inline bool safe_parse_positive_int(absl::string_view text, int base,
                                    IntType* absl_nonnull value_p) {
  IntType value = 0;
  const IntType vmax = std::numeric_limits<IntType>::max();
  assert(vmax > 0);
  assert(base >= 0);
  const IntType base_inttype = static_cast<IntType>(base);
  assert(vmax >= base_inttype);
  const IntType vmax_over_base = LookupTables<IntType>::kVmaxOverBase[base];
  assert(base < 2 ||
         std::numeric_limits<IntType>::max() / base_inttype == vmax_over_base);
  const char* start = text.data();
  const char* end = start + text.size();
  // loop over digits
  for (; start < end; ++start) {
    unsigned char c = static_cast<unsigned char>(start[0]);
    IntType digit = static_cast<IntType>(kAsciiToInt[c]);
    if (digit >= base_inttype) {
      *value_p = value;
      return false;
    }
    if (value > vmax_over_base) {
      *value_p = vmax;
      return false;
    }
    value *= base_inttype;
    if (value > vmax - digit) {
      *value_p = vmax;
      return false;
    }
    value += digit;
  }
  *value_p = value;
  return true;
}

template <typename IntType>
inline bool safe_parse_negative_int(absl::string_view text, int base,
                                    IntType* absl_nonnull value_p) {
  IntType value = 0;
  const IntType vmin = std::numeric_limits<IntType>::min();
  assert(vmin < 0);
  assert(vmin <= 0 - base);
  IntType vmin_over_base = LookupTables<IntType>::kVminOverBase[base];
  assert(base < 2 ||
         std::numeric_limits<IntType>::min() / base == vmin_over_base);
  // 2003 c++ standard [expr.mul]
  // "... the sign of the remainder is implementation-defined."
  // Although (vmin/base)*base + vmin%base is always vmin.
  // 2011 c++ standard tightens the spec but we cannot rely on it.
  // TODO(junyer): Handle this in the lookup table generation.
  if (vmin % base > 0) {
    vmin_over_base += 1;
  }
  const char* start = text.data();
  const char* end = start + text.size();
  // loop over digits
  for (; start < end; ++start) {
    unsigned char c = static_cast<unsigned char>(start[0]);
    int digit = kAsciiToInt[c];
    if (digit >= base) {
      *value_p = value;
      return false;
    }
    if (value < vmin_over_base) {
      *value_p = vmin;
      return false;
    }
    value *= base;
    if (value < vmin + digit) {
      *value_p = vmin;
      return false;
    }
    value -= digit;
  }
  *value_p = value;
  return true;
}

// Input format based on POSIX.1-2008 strtol
// http://pubs.opengroup.org/onlinepubs/9699919799/functions/strtol.html
template <typename IntType>
inline bool safe_int_internal(absl::string_view text,
                              IntType* absl_nonnull value_p, int base) {
  *value_p = 0;
  bool negative;
  if (!safe_parse_sign_and_base(&text, &base, &negative)) {
    return false;
  }
  if (!negative) {
    return safe_parse_positive_int(text, base, value_p);
  } else {
    return safe_parse_negative_int(text, base, value_p);
  }
}

template <typename IntType>
inline bool safe_uint_internal(absl::string_view text,
                               IntType* absl_nonnull value_p, int base) {
  *value_p = 0;
  bool negative;
  if (!safe_parse_sign_and_base(&text, &base, &negative) || negative) {
    return false;
  }
  return safe_parse_positive_int(text, base, value_p);
}
}  // anonymous namespace

namespace numbers_internal {

// Digit conversion.
ABSL_CONST_INIT ABSL_DLL const char kHexChar[] =
    "0123456789abcdef";

ABSL_CONST_INIT ABSL_DLL const char kHexTable[513] =
    "000102030405060708090a0b0c0d0e0f"
    "101112131415161718191a1b1c1d1e1f"
    "202122232425262728292a2b2c2d2e2f"
    "303132333435363738393a3b3c3d3e3f"
    "404142434445464748494a4b4c4d4e4f"
    "505152535455565758595a5b5c5d5e5f"
    "606162636465666768696a6b6c6d6e6f"
    "707172737475767778797a7b7c7d7e7f"
    "808182838485868788898a8b8c8d8e8f"
    "909192939495969798999a9b9c9d9e9f"
    "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
    "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
    "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
    "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
    "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
    "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";

bool safe_strto8_base(absl::string_view text, int8_t* absl_nonnull value,
                      int base) {
  return safe_int_internal<int8_t>(text, value, base);
}

bool safe_strto16_base(absl::string_view text, int16_t* absl_nonnull value,
                       int base) {
  return safe_int_internal<int16_t>(text, value, base);
}

bool safe_strto32_base(absl::string_view text, int32_t* absl_nonnull value,
                       int base) {
  return safe_int_internal<int32_t>(text, value, base);
}

bool safe_strto64_base(absl::string_view text, int64_t* absl_nonnull value,
                       int base) {
  return safe_int_internal<int64_t>(text, value, base);
}

bool safe_strto128_base(absl::string_view text, int128* absl_nonnull value,
                        int base) {
  return safe_int_internal<absl::int128>(text, value, base);
}

bool safe_strtou8_base(absl::string_view text, uint8_t* absl_nonnull value,
                       int base) {
  return safe_uint_internal<uint8_t>(text, value, base);
}

bool safe_strtou16_base(absl::string_view text, uint16_t* absl_nonnull value,
                        int base) {
  return safe_uint_internal<uint16_t>(text, value, base);
}

bool safe_strtou32_base(absl::string_view text, uint32_t* absl_nonnull value,
                        int base) {
  return safe_uint_internal<uint32_t>(text, value, base);
}

bool safe_strtou64_base(absl::string_view text, uint64_t* absl_nonnull value,
                        int base) {
  return safe_uint_internal<uint64_t>(text, value, base);
}

bool safe_strtou128_base(absl::string_view text, uint128* absl_nonnull value,
                         int base) {
  return safe_uint_internal<absl::uint128>(text, value, base);
}

}  // namespace numbers_internal
ABSL_NAMESPACE_END
}  // namespace absl
