mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
94 lines
3.6 KiB
C++
94 lines
3.6 KiB
C++
#include "simdjson/error.h"
|
|
|
|
namespace simdjson {
|
|
namespace SIMDJSON_IMPLEMENTATION {
|
|
namespace ondemand {
|
|
|
|
/**
|
|
* A forward-only JSON object field iterator.
|
|
*/
|
|
class object {
|
|
public:
|
|
/**
|
|
* Create a new invalid object.
|
|
*
|
|
* Exists so you can declare a variable and later assign to it before use.
|
|
*/
|
|
simdjson_really_inline object() noexcept = default;
|
|
|
|
simdjson_really_inline object(object &&other) noexcept = default;
|
|
simdjson_really_inline object &operator=(object &&other) noexcept = default;
|
|
object(const object &) = delete;
|
|
object &operator=(const object &) = delete;
|
|
|
|
simdjson_really_inline ~object() noexcept;
|
|
|
|
simdjson_really_inline object_iterator begin() noexcept;
|
|
simdjson_really_inline object_iterator end() noexcept;
|
|
simdjson_really_inline simdjson_result<value> operator[](const std::string_view key) & noexcept;
|
|
simdjson_really_inline simdjson_result<value> operator[](const std::string_view key) && noexcept;
|
|
|
|
protected:
|
|
/**
|
|
* Begin object iteration.
|
|
*
|
|
* @param doc The document containing the object. The iterator must be just after the opening `{`.
|
|
* @param error If this is not SUCCESS, creates an error chained object.
|
|
*/
|
|
static simdjson_really_inline simdjson_result<object> start(json_iterator_ref &&iter) noexcept;
|
|
static simdjson_really_inline object started(json_iterator_ref &&iter) noexcept;
|
|
|
|
/**
|
|
* Internal object creation. Call object::begin(doc) instead of this.
|
|
*
|
|
* @param doc The document containing the object. doc->depth must already be incremented to
|
|
* reflect the object's depth. The iterator must be just after the opening `{`.
|
|
*/
|
|
simdjson_really_inline object(json_iterator_ref &&_iter) noexcept;
|
|
|
|
simdjson_really_inline error_code find_field(const std::string_view key) noexcept;
|
|
|
|
/**
|
|
* Document containing the primary iterator.
|
|
*
|
|
* PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
|
|
* is first used, and never changes afterwards.
|
|
*/
|
|
json_iterator_ref iter{};
|
|
/**
|
|
* Whether we are at the start.
|
|
*
|
|
* PERF NOTE: this should be elided into inline control flow: it is only used for the first []
|
|
* or * call, and SSA optimizers commonly do first-iteration loop optimization.
|
|
*/
|
|
bool at_start{};
|
|
|
|
friend class value;
|
|
friend class document;
|
|
friend struct simdjson_result<object>;
|
|
};
|
|
|
|
} // namespace ondemand
|
|
} // namespace SIMDJSON_IMPLEMENTATION
|
|
} // namespace simdjson
|
|
|
|
namespace simdjson {
|
|
|
|
template<>
|
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object> {
|
|
public:
|
|
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object &&value) noexcept; ///< @private
|
|
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
|
|
|
simdjson_really_inline simdjson_result() noexcept = default;
|
|
simdjson_really_inline simdjson_result(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> &&a) noexcept = default;
|
|
simdjson_really_inline ~simdjson_result() noexcept = default; ///< @private
|
|
|
|
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> begin() noexcept;
|
|
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> end() noexcept;
|
|
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
|
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) && noexcept;
|
|
};
|
|
|
|
} // namespace simdjson
|