提交 764ed26c 编写于 作者: N Niels

cleanup

上级 18364aac
......@@ -242,6 +242,7 @@ JSON::JSON(JSON&& o) noexcept
: _type(std::move(o._type)), _value(std::move(o._value))
{
// invalidate payload
o._type = value_type::null;
o._value = {};
}
......@@ -1806,13 +1807,14 @@ JSON JSON::Parser::parse()
do
{
// key
const auto key = parseString();
auto key = parseString();
// colon
expect(':');
// value
result[std::move(key)] = parse();
key.clear();
}
while (_current == ',' and next());
}
......@@ -1870,49 +1872,53 @@ JSON JSON::Parser::parse()
return JSON();
}
default:
case ('-'):
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
case ('9'):
{
if (std::isdigit(_current) || _current == '-')
// 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
{
// collect number in tmp string
std::string tmp;
do
{
tmp += _current;
}
while (next() and (std::isdigit(_current) || _current == '.'
|| _current == 'e' || _current == 'E'
|| _current == '+' || _current == '-'));
const auto float_val = std::stod(_buffer.substr(_first_pos, _pos - _first_pos));
const auto int_val = static_cast<int>(float_val);
try
// check if conversion loses precision
if (float_val == int_val)
{
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);
}
// we would not lose precision -> int
return JSON(int_val);
}
catch (...)
else
{
error("error while translating " + tmp + " to number");
// we would lose precision -> float
return JSON(float_val);
}
break;
}
else
catch (...)
{
error("unexpected character");
error("error translating " +
_buffer.substr(_first_pos, _pos - _first_pos) + " to number");
}
}
default:
{
error("unexpected character");
}
}
}
......
......@@ -415,7 +415,7 @@ class JSON
/// raise an exception with an error message
inline void error(const std::string&) __attribute__((noreturn));
/// parse a quoted string
std::string parseString();
inline std::string parseString();
/// parse a Boolean "true"
inline void parseTrue();
/// parse a Boolean "false"
......@@ -423,7 +423,7 @@ class JSON
/// parse a null object
inline void parseNull();
/// a helper function to expect a certain character
void expect(const char);
inline void expect(const char);
private:
/// a buffer of the input
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册