🔨 added code for user-defined number types
This commit is contained in:
parent
3425527970
commit
f75e195db3
1 changed files with 30 additions and 11 deletions
41
src/json.hpp
41
src/json.hpp
|
@ -10771,6 +10771,23 @@ class basic_json
|
|||
}
|
||||
}
|
||||
|
||||
// overloaded wrappers for strtod/strtof/strtold
|
||||
// that will be called from parse<floating_point_t>
|
||||
static void strtof(float& f, const char* str, char** endptr) noexcept
|
||||
{
|
||||
f = std::strtof(str, endptr);
|
||||
}
|
||||
|
||||
static void strtof(double& f, const char* str, char** endptr) noexcept
|
||||
{
|
||||
f = std::strtod(str, endptr);
|
||||
}
|
||||
|
||||
static void strtof(long double& f, const char* str, char** endptr) noexcept
|
||||
{
|
||||
f = std::strtold(str, endptr);
|
||||
}
|
||||
|
||||
token_type scan_number()
|
||||
{
|
||||
static unsigned char lookup[9][256] =
|
||||
|
@ -10851,23 +10868,25 @@ class basic_json
|
|||
errno = 0;
|
||||
if (has_sign)
|
||||
{
|
||||
value_integer = std::strtoll(yytext.data(), &endptr, 10);
|
||||
if (JSON_LIKELY(errno == 0 and endptr == yytext.data() + yylen))
|
||||
const auto x = std::strtoll(yytext.data(), &endptr, 10);
|
||||
value_integer = static_cast<number_integer_t>(x);
|
||||
if (JSON_LIKELY(errno == 0 and endptr == yytext.data() + yylen and value_integer == x))
|
||||
{
|
||||
return token_type::value_integer;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
value_unsigned = std::strtoull(yytext.data(), &endptr, 10);
|
||||
if (JSON_LIKELY(errno == 0 and endptr == yytext.data() + yylen))
|
||||
const auto x = std::strtoull(yytext.data(), &endptr, 10);
|
||||
value_unsigned = static_cast<number_unsigned_t>(x);
|
||||
if (JSON_LIKELY(errno == 0 and endptr == yytext.data() + yylen and value_unsigned == x))
|
||||
{
|
||||
return token_type::value_unsigned;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
value_float = std::strtod(yytext.data(), nullptr);
|
||||
strtof(value_float, yytext.data(), nullptr);
|
||||
return token_type::value_float;
|
||||
}
|
||||
|
||||
|
@ -10996,14 +11015,14 @@ class basic_json
|
|||
case lexer::token_type::value_unsigned:
|
||||
{
|
||||
result.m_type = value_t::number_unsigned;
|
||||
result.m_value = static_cast<number_unsigned_t>(value_unsigned);
|
||||
result.m_value = value_unsigned;
|
||||
return true;
|
||||
}
|
||||
|
||||
case lexer::token_type::value_integer:
|
||||
{
|
||||
result.m_type = value_t::number_integer;
|
||||
result.m_value = static_cast<number_integer_t>(value_integer);
|
||||
result.m_value = value_integer;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -11016,7 +11035,7 @@ class basic_json
|
|||
}
|
||||
|
||||
result.m_type = value_t::number_float;
|
||||
result.m_value = static_cast<number_float_t>(value_float);
|
||||
result.m_value = value_float;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -11114,9 +11133,9 @@ class basic_json
|
|||
std::string error_message = "";
|
||||
|
||||
// number values
|
||||
long long value_integer = 0;
|
||||
unsigned long long value_unsigned = 0;
|
||||
double value_float = 0;
|
||||
number_integer_t value_integer = 0;
|
||||
number_unsigned_t value_unsigned = 0;
|
||||
number_float_t value_float = 0;
|
||||
|
||||
// the decimal point
|
||||
const char decimal_point_char = '\0';
|
||||
|
|
Loading…
Reference in a new issue