cleanup
This commit is contained in:
parent
18364aac85
commit
764ed26c41
2 changed files with 49 additions and 43 deletions
88
src/JSON.cc
88
src/JSON.cc
|
@ -242,6 +242,7 @@ JSON::JSON(JSON&& o) noexcept
|
||||||
: _type(std::move(o._type)), _value(std::move(o._value))
|
: _type(std::move(o._type)), _value(std::move(o._value))
|
||||||
{
|
{
|
||||||
// invalidate payload
|
// invalidate payload
|
||||||
|
o._type = value_type::null;
|
||||||
o._value = {};
|
o._value = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1806,13 +1807,14 @@ JSON JSON::Parser::parse()
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// key
|
// key
|
||||||
const auto key = parseString();
|
auto key = parseString();
|
||||||
|
|
||||||
// colon
|
// colon
|
||||||
expect(':');
|
expect(':');
|
||||||
|
|
||||||
// value
|
// value
|
||||||
result[std::move(key)] = parse();
|
result[std::move(key)] = parse();
|
||||||
|
key.clear();
|
||||||
}
|
}
|
||||||
while (_current == ',' and next());
|
while (_current == ',' and next());
|
||||||
}
|
}
|
||||||
|
@ -1870,48 +1872,52 @@ JSON JSON::Parser::parse()
|
||||||
return JSON();
|
return JSON();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ('-'):
|
||||||
|
case ('0'):
|
||||||
|
case ('1'):
|
||||||
|
case ('2'):
|
||||||
|
case ('3'):
|
||||||
|
case ('4'):
|
||||||
|
case ('5'):
|
||||||
|
case ('6'):
|
||||||
|
case ('7'):
|
||||||
|
case ('8'):
|
||||||
|
case ('9'):
|
||||||
|
{
|
||||||
|
// remember position of number's first character
|
||||||
|
const auto _first_pos = _pos - 1;
|
||||||
|
|
||||||
|
while (next() and (std::isdigit(_current) || _current == '.'
|
||||||
|
|| _current == 'e' || _current == 'E'
|
||||||
|
|| _current == '+' || _current == '-'));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const auto float_val = std::stod(_buffer.substr(_first_pos, _pos - _first_pos));
|
||||||
|
const auto int_val = static_cast<int>(float_val);
|
||||||
|
|
||||||
|
// check if conversion loses precision
|
||||||
|
if (float_val == int_val)
|
||||||
|
{
|
||||||
|
// we would not lose precision -> int
|
||||||
|
return JSON(int_val);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we would lose precision -> float
|
||||||
|
return JSON(float_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
error("error translating " +
|
||||||
|
_buffer.substr(_first_pos, _pos - _first_pos) + " to number");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (std::isdigit(_current) || _current == '-')
|
error("unexpected character");
|
||||||
{
|
|
||||||
// collect number in tmp string
|
|
||||||
std::string tmp;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
tmp += _current;
|
|
||||||
}
|
|
||||||
while (next() and (std::isdigit(_current) || _current == '.'
|
|
||||||
|| _current == 'e' || _current == 'E'
|
|
||||||
|| _current == '+' || _current == '-'));
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const auto float_val = std::stod(tmp);
|
|
||||||
const auto int_val = static_cast<int>(float_val);
|
|
||||||
|
|
||||||
// check if conversion loses precision
|
|
||||||
if (float_val == int_val)
|
|
||||||
{
|
|
||||||
// we would not lose precision -> int
|
|
||||||
return JSON(int_val);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// we would lose precision -> float
|
|
||||||
return JSON(float_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
error("error while translating " + tmp + " to number");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error("unexpected character");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -415,7 +415,7 @@ class JSON
|
||||||
/// raise an exception with an error message
|
/// raise an exception with an error message
|
||||||
inline void error(const std::string&) __attribute__((noreturn));
|
inline void error(const std::string&) __attribute__((noreturn));
|
||||||
/// parse a quoted string
|
/// parse a quoted string
|
||||||
std::string parseString();
|
inline std::string parseString();
|
||||||
/// parse a Boolean "true"
|
/// parse a Boolean "true"
|
||||||
inline void parseTrue();
|
inline void parseTrue();
|
||||||
/// parse a Boolean "false"
|
/// parse a Boolean "false"
|
||||||
|
@ -423,7 +423,7 @@ class JSON
|
||||||
/// parse a null object
|
/// parse a null object
|
||||||
inline void parseNull();
|
inline void parseNull();
|
||||||
/// a helper function to expect a certain character
|
/// a helper function to expect a certain character
|
||||||
void expect(const char);
|
inline void expect(const char);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// a buffer of the input
|
/// a buffer of the input
|
||||||
|
|
Loading…
Reference in a new issue