1 #ifndef SIMDJSON_OBJECT_INL_H
2 #define SIMDJSON_OBJECT_INL_H
4 #include "simdjson/dom/base.h"
5 #include "simdjson/dom/object.h"
6 #include "simdjson/dom/document.h"
8 #include "simdjson/dom/element-inl.h"
9 #include "simdjson/error-inl.h"
18 simdjson_inline simdjson_result<dom::object>::simdjson_result() noexcept
19 : internal::simdjson_result_base<dom::
object>() {}
20 simdjson_inline simdjson_result<dom::object>::simdjson_result(dom::object value) noexcept
21 : internal::simdjson_result_base<dom::object>(std::forward<dom::object>(value)) {}
22 simdjson_inline simdjson_result<dom::object>::simdjson_result(
error_code error) noexcept
23 : internal::simdjson_result_base<dom::object>(error) {}
25 inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](std::string_view key)
const noexcept {
26 if (error()) {
return error(); }
29 inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](
const char *key)
const noexcept {
30 if (error()) {
return error(); }
33 inline simdjson_result<dom::element> simdjson_result<dom::object>::at_pointer(std::string_view json_pointer)
const noexcept {
34 if (error()) {
return error(); }
35 return first.at_pointer(json_pointer);
37 inline simdjson_result<dom::element> simdjson_result<dom::object>::at_key(std::string_view key)
const noexcept {
38 if (error()) {
return error(); }
39 return first.at_key(key);
41 inline simdjson_result<dom::element> simdjson_result<dom::object>::at_key_case_insensitive(std::string_view key)
const noexcept {
42 if (error()) {
return error(); }
43 return first.at_key_case_insensitive(key);
46 #if SIMDJSON_EXCEPTIONS
48 inline dom::object::iterator simdjson_result<dom::object>::begin() const noexcept(false) {
49 if (
error()) {
throw simdjson_error(
error()); }
52 inline dom::object::iterator simdjson_result<dom::object>::end() const noexcept(false) {
53 if (
error()) {
throw simdjson_error(
error()); }
56 inline size_t simdjson_result<dom::object>::size() const noexcept(false) {
57 if (
error()) {
throw simdjson_error(
error()); }
69 simdjson_inline
object::object(
const internal::tape_ref &_tape) noexcept : tape{_tape} { }
71 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
72 return internal::tape_ref(tape.doc, tape.json_index + 1);
75 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
76 return internal::tape_ref(tape.doc, tape.after_element() - 1);
79 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
80 return tape.scope_count();
90 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
91 if(json_pointer.empty()) {
93 }
else if(json_pointer[0] !=
'/') {
96 json_pointer = json_pointer.substr(1);
97 size_t slash = json_pointer.find(
'/');
98 std::string_view key = json_pointer.substr(0, slash);
103 size_t escape = key.find(
'~');
104 if (escape != std::string_view::npos) {
106 std::string unescaped(key);
108 switch (unescaped[escape+1]) {
110 unescaped.replace(escape, 2,
"~");
113 unescaped.replace(escape, 2,
"/");
118 escape = unescaped.find(
'~', escape+1);
119 }
while (escape != std::string::npos);
120 child = at_key(unescaped);
128 if (slash != std::string_view::npos) {
129 child = child.at_pointer(json_pointer.substr(slash));
136 for (
iterator field = begin(); field != end_field; ++field) {
137 if (field.key_equals(key)) {
138 return field.value();
148 for (
iterator field = begin(); field != end_field; ++field) {
149 if (field.key_equals_case_insensitive(key)) {
150 return field.value();
159 simdjson_inline object::iterator::iterator(
const internal::tape_ref &_tape) noexcept : tape{_tape} { }
164 return tape.json_index != other.tape.json_index;
166 inline bool object::iterator::operator==(
const object::iterator& other)
const noexcept {
167 return tape.json_index == other.tape.json_index;
169 inline bool object::iterator::operator<(
const object::iterator& other)
const noexcept {
170 return tape.json_index < other.tape.json_index;
172 inline bool object::iterator::operator<=(
const object::iterator& other)
const noexcept {
173 return tape.json_index <= other.tape.json_index;
175 inline bool object::iterator::operator>=(
const object::iterator& other)
const noexcept {
176 return tape.json_index >= other.tape.json_index;
178 inline bool object::iterator::operator>(
const object::iterator& other)
const noexcept {
179 return tape.json_index > other.tape.json_index;
183 tape.json_index = tape.after_element();
192 return tape.get_string_view();
195 return tape.get_string_length();
198 return reinterpret_cast<const char *
>(&tape.doc->string_buf[size_t(tape.tape_value()) +
sizeof(uint32_t)]);
201 return element(internal::tape_ref(tape.doc, tape.json_index + 1));
220 const uint32_t len = key_length();
221 if(o.size() == len) {
223 return (memcmp(o.data(), key_c_str(), len) == 0);
231 const uint32_t len = key_length();
232 if(o.size() == len) {
236 return (simdjson_strncasecmp(o.data(), key_c_str(), len) == 0);
243 inline key_value_pair::key_value_pair(std::string_view _key,
element _value) noexcept :
244 key(_key), value(_value) {}
250 #if defined(__cpp_lib_ranges)
251 static_assert(std::ranges::view<simdjson::dom::object>);
252 static_assert(std::ranges::sized_range<simdjson::dom::object>);
253 #if SIMDJSON_EXCEPTIONS
Key/value pair in an object.
bool operator!=(const iterator &other) const noexcept
Check if these values come from the same place in the JSON.
element value() const noexcept
Get the value of this key/value pair.
bool key_equals(std::string_view o) const noexcept
Returns true if the key in this key/value pair is equal to the provided string_view.
const char * key_c_str() const noexcept
Get the key of this key/value pair.
uint32_t key_length() const noexcept
Get the length (in bytes) of the key in this key/value pair.
const value_type operator*() const noexcept
Get the actual key/value pair.
bool key_equals_case_insensitive(std::string_view o) const noexcept
Returns true if the key in this key/value pair is equal to the provided string_view in a case-insensi...
std::string_view key() const noexcept
Get the key of this key/value pair.
iterator & operator++() noexcept
Get the next key/value pair.
simdjson_result< element > at_key(std::string_view key) const noexcept
Get the value associated with the given key.
iterator end() const noexcept
One past the last key/value pair.
size_t size() const noexcept
Get the size of the object (number of keys).
simdjson_result< element > at_key_case_insensitive(std::string_view key) const noexcept
Get the value associated with the given key in a case-insensitive manner.
simdjson_result< element > operator[](std::string_view key) const noexcept
Get the value associated with the given key.
simdjson_result< element > at_pointer(std::string_view json_pointer) const noexcept
Get the value associated with the given JSON pointer.
simdjson_inline object() noexcept
Create a new, invalid object.
iterator begin() const noexcept
Return the first key/value pair.
The top level simdjson namespace, containing everything the library provides.
error_code
All possible errors returned by simdjson.
@ NO_SUCH_FIELD
JSON field not found in object.
@ INVALID_JSON_POINTER
Invalid JSON pointer reference.
The result of a simdjson operation that could fail.
simdjson_inline error_code error() const noexcept
The error.