♻️ refactored binary readers to use a SAX parser

This commit is contained in:
Niels Lohmann 2018-03-11 18:47:38 +01:00
parent 149d2fd09c
commit ad47b0fbde
No known key found for this signature in database
GPG key ID: 7F3CEA63AE251B69
5 changed files with 592 additions and 493 deletions

View file

@ -124,6 +124,8 @@ struct json_sax
};
namespace detail
{
template<typename BasicJsonType>
class json_sax_dom_parser : public json_sax<BasicJsonType>
{
@ -172,9 +174,16 @@ class json_sax_dom_parser : public json_sax<BasicJsonType>
return true;
}
bool start_object(std::size_t) override
bool start_object(std::size_t len) override
{
ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
if (JSON_UNLIKELY(len != json_sax<BasicJsonType>::no_limit and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len)));
}
return true;
}
@ -191,9 +200,16 @@ class json_sax_dom_parser : public json_sax<BasicJsonType>
return true;
}
bool start_array(std::size_t) override
bool start_array(std::size_t len) override
{
ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
if (JSON_UNLIKELY(len != json_sax<BasicJsonType>::no_limit and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len)));
}
return true;
}
@ -348,6 +364,7 @@ class json_sax_acceptor : public json_sax<BasicJsonType>
return false;
}
};
}
}