mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-25 08:01:02 +02:00
refactor: Remove unused ParsePrechecks from ParseIntegral
Also: * Remove redundant {} from return statement * Add missing failing c-string test case and "-" and "+" strings * Add missing failing test cases for non-int32_t integral types
This commit is contained in:
parent
35a31d5f7e
commit
fa3cd28535
@ -1474,6 +1474,35 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
|
||||
BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static void RunToIntegralTests()
|
||||
{
|
||||
BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR));
|
||||
BOOST_CHECK(!ToIntegral<T>(" 1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("1 "));
|
||||
BOOST_CHECK(!ToIntegral<T>("1a"));
|
||||
BOOST_CHECK(!ToIntegral<T>("1.1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("1.9"));
|
||||
BOOST_CHECK(!ToIntegral<T>("+01.9"));
|
||||
BOOST_CHECK(!ToIntegral<T>("-"));
|
||||
BOOST_CHECK(!ToIntegral<T>("+"));
|
||||
BOOST_CHECK(!ToIntegral<T>(" -1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("-1 "));
|
||||
BOOST_CHECK(!ToIntegral<T>(" -1 "));
|
||||
BOOST_CHECK(!ToIntegral<T>("+1"));
|
||||
BOOST_CHECK(!ToIntegral<T>(" +1"));
|
||||
BOOST_CHECK(!ToIntegral<T>(" +1 "));
|
||||
BOOST_CHECK(!ToIntegral<T>("+-1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("-+1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("++1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("--1"));
|
||||
BOOST_CHECK(!ToIntegral<T>(""));
|
||||
BOOST_CHECK(!ToIntegral<T>("aap"));
|
||||
BOOST_CHECK(!ToIntegral<T>("0x1"));
|
||||
BOOST_CHECK(!ToIntegral<T>("-32482348723847471234"));
|
||||
BOOST_CHECK(!ToIntegral<T>("32482348723847471234"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_ToIntegral)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
|
||||
@ -1486,27 +1515,14 @@ BOOST_AUTO_TEST_CASE(test_ToIntegral)
|
||||
BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
|
||||
BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1").value(), -1);
|
||||
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(" 1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("1 "));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("1a"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("1.1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("1.9"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("+01.9"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(" -1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("-1 "));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(" -1 "));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("+1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(" +1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(" +1 "));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("+-1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("-+1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("++1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("--1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>(""));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("aap"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("0x1"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("-32482348723847471234"));
|
||||
BOOST_CHECK(!ToIntegral<int32_t>("32482348723847471234"));
|
||||
RunToIntegralTests<uint64_t>();
|
||||
RunToIntegralTests<int64_t>();
|
||||
RunToIntegralTests<uint32_t>();
|
||||
RunToIntegralTests<int32_t>();
|
||||
RunToIntegralTests<uint16_t>();
|
||||
RunToIntegralTests<int16_t>();
|
||||
RunToIntegralTests<uint8_t>();
|
||||
RunToIntegralTests<int8_t>();
|
||||
|
||||
BOOST_CHECK(!ToIntegral<int64_t>("-9223372036854775809"));
|
||||
BOOST_CHECK_EQUAL(ToIntegral<int64_t>("-9223372036854775808").value(), -9'223'372'036'854'775'807LL - 1LL);
|
||||
|
@ -281,16 +281,11 @@ std::string DecodeBase32(const std::string& str, bool* pf_invalid)
|
||||
return std::string((const char*)vchRet.data(), vchRet.size());
|
||||
}
|
||||
|
||||
[[nodiscard]] static bool ParsePrechecks(const std::string&);
|
||||
|
||||
namespace {
|
||||
template <typename T>
|
||||
bool ParseIntegral(const std::string& str, T* out)
|
||||
{
|
||||
static_assert(std::is_integral<T>::value);
|
||||
if (!ParsePrechecks(str)) {
|
||||
return false;
|
||||
}
|
||||
// Replicate the exact behavior of strtol/strtoll/strtoul/strtoull when
|
||||
// handling leading +/- for backwards compatibility.
|
||||
if (str.length() >= 2 && str[0] == '+' && str[1] == '-') {
|
||||
|
@ -97,7 +97,9 @@ constexpr inline bool IsSpace(char c) noexcept {
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert string to integral type T.
|
||||
* Convert string to integral type T. Leading whitespace, a leading +, or any
|
||||
* trailing character fail the parsing. The required format expressed as regex
|
||||
* is `-?[0-9]+`.
|
||||
*
|
||||
* @returns std::nullopt if the entire string could not be parsed, or if the
|
||||
* parsed value is not in the range representable by the type T.
|
||||
@ -111,7 +113,7 @@ std::optional<T> ToIntegral(const std::string& str)
|
||||
if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return {result};
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user