Skip to content

Commit 4c63956

Browse files
committed
Enable object["x"]["y"]
1 parent c89647a commit 4c63956

File tree

7 files changed

+203
-97
lines changed

7 files changed

+203
-97
lines changed

benchmark/distinctuserid/ondemand.h

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,13 @@ simdjson_really_inline bool OnDemand::Run(const padded_string &json) {
3535
auto doc = parser.iterate(json);
3636
for (ondemand::object tweet : doc["statuses"]) {
3737
// We believe that all statuses have a matching
38-
// user, and we are willing to throw when they do not:
39-
//
40-
// You might think that you do not need the braces, but
41-
// you do, otherwise you will get the wrong answer. That is
42-
// because you can only have one active object or array
43-
// at a time.
44-
{
45-
ondemand::object user = tweet["user"];
46-
int64_t id = user["id"];
47-
ids.push_back(id);
48-
}
38+
// user, and we are willing to throw when they do not.
39+
ids.push_back(tweet["user"]["id"]);
4940
// Not all tweets have a "retweeted_status", but when they do
5041
// we want to go and find the user within.
5142
auto retweet = tweet["retweeted_status"];
5243
if(!retweet.error()) {
53-
ondemand::object retweet_content = retweet;
54-
ondemand::object reuser = retweet_content["user"];
55-
int64_t rid = reuser["id"];
56-
ids.push_back(rid);
44+
ids.push_back(retweet["user"]["id"]);
5745
}
5846
}
5947
remove_duplicates(ids);

include/simdjson/generic/ondemand.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace SIMDJSON_IMPLEMENTATION {
66
* Designed for maximum speed and a lower memory profile.
77
*/
88
namespace ondemand {
9+
/** Represents the depth of a JSON value (number of nested arrays/objects). */
910
using depth_t = int32_t;
1011
} // namespace ondemand
1112
} // namespace SIMDJSON_IMPLEMENTATION

include/simdjson/generic/ondemand/document.h

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -208,23 +208,20 @@ class document {
208208

209209
/**
210210
* Look up a field by name on an object.
211-
*
212-
* This method may only be called once on a given value. If you want to look up multiple fields,
213-
* you must first get the object using value.get_object() or object(value).
214-
*
211+
*
212+
* Important notes:
213+
*
214+
* * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
215+
* e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
216+
* * **Once Only:** You may only look up a single field on a document. To look up multiple fields,
217+
* use `.get_object()` or cast to `object`.
218+
*
215219
* @param key The key to look up.
216-
* @returns INCORRECT_TYPE If the JSON value is not an array.
220+
* @returns The value of the field, NO_SUCH_FIELD if the field is not in the object, or
221+
* INCORRECT_TYPE if the JSON value is not an array.
217222
*/
218223
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
219-
/**
220-
* Look up a field by name on an object.
221-
*
222-
* This method may only be called once on a given value. If you want to look up multiple fields,
223-
* you must first get the object using value.get_object() or object(value).
224-
*
225-
* @param key The key to look up.
226-
* @returns INCORRECT_TYPE If the JSON value is not an array.
227-
*/
224+
/** @overload simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept; */
228225
simdjson_really_inline simdjson_result<value> operator[](const char *key) & noexcept;
229226

230227
protected:

include/simdjson/generic/ondemand/object.h

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,37 @@ class object {
2323

2424
simdjson_really_inline object_iterator begin() noexcept;
2525
simdjson_really_inline object_iterator end() noexcept;
26-
simdjson_really_inline simdjson_result<value> operator[](const std::string_view key) & noexcept;
27-
simdjson_really_inline simdjson_result<value> operator[](const std::string_view key) && noexcept;
2826

29-
protected:
3027
/**
31-
* Begin object iteration.
32-
*
33-
* @param doc The document containing the object. The iterator must be just after the opening `{`.
34-
* @param error If this is not SUCCESS, creates an error chained object.
28+
* Look up a field by name on an object.
29+
*
30+
* Important notes:
31+
*
32+
* * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
33+
* e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
34+
* * **Order Sensitive:** Each field lookup will only move forward in the object. In particular,
35+
* the following code reads z, then y, then x, and thus will not retrieve x or y if fed the
36+
* JSON `{ "x": 1, "y": 2, "z": 3 }`:
37+
*
38+
* ```c++
39+
* simdjson::builtin::ondemand::parser parser;
40+
* auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
41+
* double z = obj["z"];
42+
* double y = obj["y"];
43+
* double x = obj["x"];
44+
* ```
45+
*
46+
* @param key The key to look up.
47+
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
3548
*/
49+
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
50+
/** @overload simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept; */
51+
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) && noexcept;
52+
53+
protected:
3654
static simdjson_really_inline simdjson_result<object> start(value_iterator &iter) noexcept;
3755
static simdjson_really_inline simdjson_result<object> try_start(value_iterator &iter) noexcept;
3856
static simdjson_really_inline object started(value_iterator &iter) noexcept;
39-
40-
/**
41-
* Internal object creation. Call object::begin(doc) instead of this.
42-
*
43-
* @param doc The document containing the object. doc->depth must already be incremented to
44-
* reflect the object's depth. The iterator must be just after the opening `{`.
45-
*/
4657
simdjson_really_inline object(const value_iterator &_iter) noexcept;
4758

4859
simdjson_warn_unused simdjson_really_inline error_code find_field_raw(const std::string_view key) noexcept;

include/simdjson/generic/ondemand/value-inl.h

Lines changed: 68 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,18 @@ simdjson_really_inline simdjson_result<array_iterator> value::end() & noexcept {
145145
return {};
146146
}
147147

148-
// simdjson_really_inline void value::log_value(const char *type) const noexcept {
149-
// char json_char[]{char(json[0]), '\0'};
150-
// logger::log_value(*iter, type, json_char);
151-
// }
152-
// simdjson_really_inline void value::log_error(const char *message) const noexcept {
153-
// char json_char[]{char(json[0]), '\0'};
154-
// logger::log_error(*iter, message, json_char);
155-
// }
148+
simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) & noexcept {
149+
return get_object()[key];
150+
}
151+
simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) && noexcept {
152+
return std::forward<value>(*this).get_object()[key];
153+
}
154+
simdjson_really_inline simdjson_result<value> value::operator[](const char *key) & noexcept {
155+
return get_object()[key];
156+
}
157+
simdjson_really_inline simdjson_result<value> value::operator[](const char *key) && noexcept {
158+
return std::forward<value>(*this).get_object()[key];
159+
}
156160

157161
} // namespace ondemand
158162
} // namespace SIMDJSON_IMPLEMENTATION
@@ -184,75 +188,92 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_
184188
return {};
185189
}
186190

187-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() && noexcept {
191+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](std::string_view key) & noexcept {
188192
if (error()) { return error(); }
189-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_array();
193+
return first[key];
194+
}
195+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](std::string_view key) && noexcept {
196+
if (error()) { return error(); }
197+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first)[key];
198+
}
199+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) & noexcept {
200+
if (error()) { return error(); }
201+
return first[key];
190202
}
203+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) && noexcept {
204+
if (error()) { return error(); }
205+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first)[key];
206+
}
207+
191208
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() & noexcept {
209+
if (error()) { return error(); }
210+
return first.get_array();
211+
}
212+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() && noexcept {
192213
if (error()) { return error(); }
193214
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_array();
194215
}
216+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() & noexcept {
217+
if (error()) { return error(); }
218+
return first.get_object();
219+
}
195220
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() && noexcept {
196221
if (error()) { return error(); }
197222
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_object();
198223
}
199-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() & noexcept {
224+
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() & noexcept {
200225
if (error()) { return error(); }
201-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_object();
226+
return first.get_uint64();
202227
}
203228
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() && noexcept {
204229
if (error()) { return error(); }
205230
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_uint64();
206231
}
207-
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() & noexcept {
232+
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() & noexcept {
208233
if (error()) { return error(); }
209-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_uint64();
234+
return first.get_int64();
210235
}
211236
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() && noexcept {
212237
if (error()) { return error(); }
213238
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_int64();
214239
}
215-
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() & noexcept {
240+
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() & noexcept {
216241
if (error()) { return error(); }
217-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_int64();
242+
return first.get_double();
218243
}
219244
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() && noexcept {
220245
if (error()) { return error(); }
221246
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_double();
222247
}
223-
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() & noexcept {
248+
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() & noexcept {
224249
if (error()) { return error(); }
225-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_double();
250+
return first.get_string();
226251
}
227252
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() && noexcept {
228253
if (error()) { return error(); }
229254
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_string();
230255
}
231-
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() & noexcept {
256+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() & noexcept {
232257
if (error()) { return error(); }
233-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_string();
258+
return first.get_raw_json_string();
234259
}
235260
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() && noexcept {
236261
if (error()) { return error(); }
237262
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_raw_json_string();
238263
}
239-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() & noexcept {
264+
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() & noexcept {
240265
if (error()) { return error(); }
241-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_raw_json_string();
266+
return first.get_bool();
242267
}
243268
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() && noexcept {
244269
if (error()) { return error(); }
245270
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_bool();
246271
}
247-
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() & noexcept {
248-
if (error()) { return error(); }
249-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_bool();
250-
}
251-
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() && noexcept {
272+
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() & noexcept {
252273
if (error()) { return false; }
253-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).is_null();
274+
return first.is_null();
254275
}
255-
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() & noexcept {
276+
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() && noexcept {
256277
if (error()) { return false; }
257278
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).is_null();
258279
}
@@ -287,66 +308,66 @@ template<> simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTA
287308
}
288309

289310
#if SIMDJSON_EXCEPTIONS
290-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() && noexcept(false) {
291-
if (error()) { throw simdjson_error(error()); }
292-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
293-
}
294311
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false) {
295312
if (error()) { throw simdjson_error(error()); }
296-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
313+
return first;
297314
}
298-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() && noexcept(false) {
315+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() && noexcept(false) {
299316
if (error()) { throw simdjson_error(error()); }
300317
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
301318
}
302319
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false) {
303320
if (error()) { throw simdjson_error(error()); }
304-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
321+
return first;
305322
}
306-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() && noexcept(false) {
323+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() && noexcept(false) {
307324
if (error()) { throw simdjson_error(error()); }
308325
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
309326
}
310-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() & noexcept(false) {
327+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() && noexcept(false) {
311328
if (error()) { throw simdjson_error(error()); }
312-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
329+
return first;
313330
}
314331
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() && noexcept(false) {
315332
if (error()) { throw simdjson_error(error()); }
316333
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
317334
}
318-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() & noexcept(false) {
335+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() & noexcept(false) {
319336
if (error()) { throw simdjson_error(error()); }
320-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
337+
return first;
321338
}
322339
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() && noexcept(false) {
323340
if (error()) { throw simdjson_error(error()); }
324341
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
325342
}
326-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() & noexcept(false) {
343+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() & noexcept(false) {
327344
if (error()) { throw simdjson_error(error()); }
328-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
345+
return first;
329346
}
330347
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() && noexcept(false) {
331348
if (error()) { throw simdjson_error(error()); }
332349
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
333350
}
334-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() & noexcept(false) {
351+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() & noexcept(false) {
335352
if (error()) { throw simdjson_error(error()); }
336-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
353+
return first;
337354
}
338355
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() && noexcept(false) {
339356
if (error()) { throw simdjson_error(error()); }
340357
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
341358
}
342-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() & noexcept(false) {
359+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() & noexcept(false) {
343360
if (error()) { throw simdjson_error(error()); }
344-
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
361+
return first;
345362
}
346363
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() && noexcept(false) {
347364
if (error()) { throw simdjson_error(error()); }
348365
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
349366
}
367+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() & noexcept(false) {
368+
if (error()) { throw simdjson_error(error()); }
369+
return first;
370+
}
350371
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() & noexcept(false) {
351372
if (error()) { throw simdjson_error(error()); }
352373
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);

0 commit comments

Comments
 (0)