157 using number_integer_t =
typename BasicJsonType::number_integer_t;
158 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
159 using number_float_t =
typename BasicJsonType::number_float_t;
160 using string_t =
typename BasicJsonType::string_t;
161 using binary_t =
typename BasicJsonType::binary_t;
169 : root(r), allow_exceptions(allow_exceptions_)
181 handle_value(
nullptr);
185 bool boolean(
bool val)
191 bool number_integer(number_integer_t val)
209 bool string(string_t& val)
215 bool binary(binary_t& val)
217 handle_value(std::move(val));
221 bool start_object(std::size_t len)
223 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
225 if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
227 JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len), *ref_stack.back()));
233 bool key(string_t& val)
236 object_element = &(ref_stack.back()->m_value.object->operator[](val));
242 ref_stack.back()->set_parents();
243 ref_stack.pop_back();
247 bool start_array(std::size_t len)
249 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
251 if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
253 JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len), *ref_stack.back()));
261 ref_stack.back()->set_parents();
262 ref_stack.pop_back();
266 template<
class Exception>
267 bool parse_error(std::size_t ,
const std::string& ,
271 static_cast<void>(ex);
272 if (allow_exceptions)
279 constexpr bool is_errored()
const
291 template<
typename Value>
292 JSON_HEDLEY_RETURNS_NON_NULL
293 BasicJsonType* handle_value(Value&& v)
295 if (ref_stack.empty())
297 root = BasicJsonType(std::forward<Value>(v));
301 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
303 if (ref_stack.back()->is_array())
305 ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));
306 return &(ref_stack.back()->m_value.array->back());
309 JSON_ASSERT(ref_stack.back()->is_object());
310 JSON_ASSERT(object_element);
311 *object_element = BasicJsonType(std::forward<Value>(v));
312 return object_element;
318 std::vector<BasicJsonType*> ref_stack {};
320 BasicJsonType* object_element =
nullptr;
322 bool errored =
false;
324 const bool allow_exceptions =
true;
328class json_sax_dom_callback_parser
331 using number_integer_t =
typename BasicJsonType::number_integer_t;
332 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
333 using number_float_t =
typename BasicJsonType::number_float_t;
334 using string_t =
typename BasicJsonType::string_t;
335 using binary_t =
typename BasicJsonType::binary_t;
336 using parser_callback_t =
typename BasicJsonType::parser_callback_t;
337 using parse_event_t =
typename BasicJsonType::parse_event_t;
339 json_sax_dom_callback_parser(BasicJsonType& r,
340 const parser_callback_t cb,
341 const bool allow_exceptions_ =
true)
342 : root(r), callback(cb), allow_exceptions(allow_exceptions_)
344 keep_stack.push_back(
true);
348 json_sax_dom_callback_parser(
const json_sax_dom_callback_parser&) =
delete;
349 json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) =
default;
350 json_sax_dom_callback_parser& operator=(
const json_sax_dom_callback_parser&) =
delete;
351 json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) =
default;
352 ~json_sax_dom_callback_parser() =
default;
356 handle_value(
nullptr);
360 bool boolean(
bool val)
366 bool number_integer(number_integer_t val)
372 bool number_unsigned(number_unsigned_t val)
378 bool number_float(number_float_t val,
const string_t& )
384 bool string(string_t& val)
390 bool binary(binary_t& val)
392 handle_value(std::move(val));
396 bool start_object(std::size_t len)
400 keep_stack.push_back(keep);
402 auto val = handle_value(BasicJsonType::value_t::object,
true);
403 ref_stack.push_back(val.second);
406 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
408 JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len), *ref_stack.back()));
414 bool key(string_t& val)
416 BasicJsonType k = BasicJsonType(val);
419 const bool keep = callback(
static_cast<int>(ref_stack.size()),
parse_event_t::key, k);
420 key_keep_stack.push_back(keep);
423 if (keep && ref_stack.back())
425 object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded);
433 if (ref_stack.back())
438 *ref_stack.back() = discarded;
442 ref_stack.back()->set_parents();
446 JSON_ASSERT(!ref_stack.empty());
447 JSON_ASSERT(!keep_stack.empty());
448 ref_stack.pop_back();
449 keep_stack.pop_back();
451 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
454 for (
auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
456 if (it->is_discarded())
458 ref_stack.back()->erase(it);
467 bool start_array(std::size_t len)
470 keep_stack.push_back(keep);
472 auto val = handle_value(BasicJsonType::value_t::array,
true);
473 ref_stack.push_back(val.second);
476 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
478 JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len), *ref_stack.back()));
488 if (ref_stack.back())
493 ref_stack.back()->set_parents();
498 *ref_stack.back() = discarded;
502 JSON_ASSERT(!ref_stack.empty());
503 JSON_ASSERT(!keep_stack.empty());
504 ref_stack.pop_back();
505 keep_stack.pop_back();
508 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
510 ref_stack.back()->m_value.array->pop_back();
516 template<
class Exception>
517 bool parse_error(std::size_t ,
const std::string& ,
521 static_cast<void>(ex);
522 if (allow_exceptions)
529 constexpr bool is_errored()
const
550 template<
typename Value>
551 std::pair<bool, BasicJsonType*> handle_value(Value&& v,
const bool skip_callback =
false)
553 JSON_ASSERT(!keep_stack.empty());
557 if (!keep_stack.back())
559 return {
false,
nullptr};
563 auto value = BasicJsonType(std::forward<Value>(v));
566 const bool keep = skip_callback || callback(
static_cast<int>(ref_stack.size()),
parse_event_t::value, value);
571 return {
false,
nullptr};
574 if (ref_stack.empty())
576 root = std::move(value);
577 return {
true, &root};
582 if (!ref_stack.back())
584 return {
false,
nullptr};
588 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
591 if (ref_stack.back()->is_array())
593 ref_stack.back()->m_value.array->emplace_back(std::move(value));
594 return {
true, &(ref_stack.back()->m_value.array->back())};
598 JSON_ASSERT(ref_stack.back()->is_object());
600 JSON_ASSERT(!key_keep_stack.empty());
601 const bool store_element = key_keep_stack.back();
602 key_keep_stack.pop_back();
606 return {
false,
nullptr};
609 JSON_ASSERT(object_element);
610 *object_element = std::move(value);
611 return {
true, object_element};
617 std::vector<BasicJsonType*> ref_stack {};
619 std::vector<bool> keep_stack {};
621 std::vector<bool> key_keep_stack {};
623 BasicJsonType* object_element =
nullptr;
625 bool errored =
false;
627 const parser_callback_t callback =
nullptr;
629 const bool allow_exceptions =
true;
631 BasicJsonType discarded = BasicJsonType::value_t::discarded;