| 5712 | */ |
| 5713 | template<typename Value> |
| 5714 | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false) |
| 5715 | { |
| 5716 | JSON_ASSERT(!keep_stack.empty()); |
| 5717 | |
| 5718 | // do not handle this value if we know it would be added to a discarded |
| 5719 | // container |
| 5720 | if (!keep_stack.back()) |
| 5721 | { |
| 5722 | return { false, nullptr }; |
| 5723 | } |
| 5724 | |
| 5725 | // create value |
| 5726 | auto value = BasicJsonType(std::forward<Value>(v)); |
| 5727 | |
| 5728 | // check callback |
| 5729 | const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value); |
| 5730 | |
| 5731 | // do not handle this value if we just learnt it shall be discarded |
| 5732 | if (!keep) |
| 5733 | { |
| 5734 | return { false, nullptr }; |
| 5735 | } |
| 5736 | |
| 5737 | if (ref_stack.empty()) |
| 5738 | { |
| 5739 | root = std::move(value); |
| 5740 | return { true, &root }; |
| 5741 | } |
| 5742 | |
| 5743 | // skip this value if we already decided to skip the parent |
| 5744 | // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) |
| 5745 | if (!ref_stack.back()) |
| 5746 | { |
| 5747 | return { false, nullptr }; |
| 5748 | } |
| 5749 | |
| 5750 | // we now only expect arrays and objects |
| 5751 | JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); |
| 5752 | |
| 5753 | // array |
| 5754 | if (ref_stack.back()->is_array()) |
| 5755 | { |
| 5756 | ref_stack.back()->m_value.array->push_back(std::move(value)); |
| 5757 | return { true, &(ref_stack.back()->m_value.array->back()) }; |
| 5758 | } |
| 5759 | |
| 5760 | // object |
| 5761 | JSON_ASSERT(ref_stack.back()->is_object()); |
| 5762 | // check if we should store an element for the current key |
| 5763 | JSON_ASSERT(!key_keep_stack.empty()); |
| 5764 | const bool store_element = key_keep_stack.back(); |
| 5765 | key_keep_stack.pop_back(); |
| 5766 | |
| 5767 | if (!store_element) |
| 5768 | { |
| 5769 | return { false, nullptr }; |
| 5770 | } |
| 5771 | |