Require value to be deleted after most value conversions

This commit is contained in:
John Keiser 2020-08-31 07:51:21 -07:00
parent 21fe42b28c
commit 26d7881b80
3 changed files with 143 additions and 112 deletions

View File

@ -44,7 +44,9 @@ simdjson_really_inline document::operator raw_json_string() & noexcept(false) {
simdjson_really_inline document::operator bool() noexcept(false) { return as_value(); }
#endif
simdjson_really_inline simdjson_result<array::iterator> document::begin() & noexcept { return as_value().begin(); }
simdjson_really_inline simdjson_result<array::iterator> document::begin() & noexcept {
return as_value().get_array().begin();
}
simdjson_really_inline simdjson_result<array::iterator> document::end() & noexcept { return {}; }
simdjson_really_inline simdjson_result<value> document::operator[](std::string_view key) & noexcept { return as_value()[key]; }

View File

@ -33,94 +33,119 @@ simdjson_really_inline value value::start(json_iterator_ref &&iter) noexcept {
return { std::forward<json_iterator_ref>(iter), iter->advance() };
}
simdjson_really_inline simdjson_result<array> value::get_array() noexcept {
simdjson_really_inline simdjson_result<array> value::get_array() && noexcept {
if (*json != '[') {
log_error("not an array");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return INCORRECT_TYPE;
}
return array::started(std::move(iter));
return array::started(std::forward<json_iterator_ref>(iter));
}
simdjson_really_inline simdjson_result<object> value::get_object() noexcept {
simdjson_really_inline simdjson_result<object> value::get_object() && noexcept {
if (*json != '{') {
log_error("not an object");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return INCORRECT_TYPE;
}
return object::started(std::move(iter));
return object::started(std::forward<json_iterator_ref>(iter));
}
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() noexcept {
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() && noexcept {
log_value("string");
if (*json != '"') { log_error("not a string"); return INCORRECT_TYPE; }
auto result = raw_json_string{&json[1]};
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result;
}
simdjson_really_inline simdjson_result<std::string_view> value::get_string() noexcept {
log_value("string");
if (*json != '"') { log_error("not a string"); return INCORRECT_TYPE; }
return raw_json_string{&json[1]};
}
simdjson_really_inline simdjson_result<std::string_view> value::get_string() && noexcept {
log_value("string");
if (*json != '"') {
log_error("not a string");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return INCORRECT_TYPE;
}
auto result = raw_json_string{&json[1]}.unescape(iter->current_string_buf_loc);
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result;
}
simdjson_really_inline simdjson_result<double> value::get_double() noexcept {
simdjson_really_inline simdjson_result<double> value::get_double() && noexcept {
log_value("double");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
double result;
error_code error;
if ((error = stage2::numberparsing::parse_double(json).get(result))) { log_error("not a double"); return error; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result;
}
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() noexcept {
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() && noexcept {
log_value("unsigned");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
uint64_t result;
error_code error;
if ((error = stage2::numberparsing::parse_unsigned(json).get(result))) { log_error("not a unsigned integer"); return error; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result;
}
simdjson_really_inline simdjson_result<int64_t> value::get_int64() noexcept {
simdjson_really_inline simdjson_result<int64_t> value::get_int64() && noexcept {
log_value("integer");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
int64_t result;
error_code error;
if ((error = stage2::numberparsing::parse_integer(json).get(result))) { log_error("not an integer"); return error; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result;
}
simdjson_really_inline simdjson_result<bool> value::get_bool() noexcept {
simdjson_really_inline simdjson_result<bool> value::get_bool() && noexcept {
log_value("bool");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
auto not_true = stage2::atomparsing::str4ncmp(json, "true");
auto not_false = stage2::atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
bool error = (not_true && not_false) || stage2::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
if (error) { log_error("not a boolean"); return INCORRECT_TYPE; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return simdjson_result<bool>(!not_true, error ? INCORRECT_TYPE : SUCCESS);
}
simdjson_really_inline bool value::is_null() noexcept {
simdjson_really_inline bool value::is_null() & noexcept {
log_value("null");
// Since it's a *reference*, we may want to check something other than is_null() if it isn't null,
// so we don't release the iterator unless it is actually null
if (stage2::atomparsing::str4ncmp(json, "null")) { return false; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return true;
}
simdjson_really_inline bool value::is_null() && noexcept {
log_value("null");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
if (stage2::atomparsing::str4ncmp(json, "null")) { return false; }
return true;
}
#if SIMDJSON_EXCEPTIONS
simdjson_really_inline value::operator array() noexcept(false) { return get_array(); }
simdjson_really_inline value::operator object() noexcept(false) { return get_object(); }
simdjson_really_inline value::operator uint64_t() noexcept(false) { return get_uint64(); }
simdjson_really_inline value::operator int64_t() noexcept(false) { return get_int64(); }
simdjson_really_inline value::operator double() noexcept(false) { return get_double(); }
simdjson_really_inline value::operator std::string_view() noexcept(false) { return get_string(); }
simdjson_really_inline value::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
simdjson_really_inline value::operator bool() noexcept(false) { return get_bool(); }
simdjson_really_inline value::operator array() && noexcept(false) {
return std::forward<value>(*this).get_array();
}
simdjson_really_inline value::operator object() && noexcept(false) {
return std::forward<value>(*this).get_object();
}
simdjson_really_inline value::operator uint64_t() && noexcept(false) {
return std::forward<value>(*this).get_uint64();
}
simdjson_really_inline value::operator int64_t() && noexcept(false) {
return std::forward<value>(*this).get_int64();
}
simdjson_really_inline value::operator double() && noexcept(false) {
return std::forward<value>(*this).get_double();
}
simdjson_really_inline value::operator std::string_view() && noexcept(false) {
return std::forward<value>(*this).get_string();
}
simdjson_really_inline value::operator raw_json_string() && noexcept(false) {
return std::forward<value>(*this).get_raw_json_string();
}
simdjson_really_inline value::operator bool() && noexcept(false) {
return std::forward<value>(*this).get_bool();
}
#endif
simdjson_really_inline simdjson_result<array::iterator> value::begin() noexcept { return get_array().begin(); }
simdjson_really_inline simdjson_result<array::iterator> value::end() noexcept { return {}; }
// TODO this CANNOT be reused. Each time you try, it will get you a new object.
// Probably make it move-only to avoid this issue.
simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) noexcept {
return get_object()[key];
simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) && noexcept {
return std::forward<value>(*this).get_object()[key];
}
simdjson_really_inline simdjson_result<value> value::operator[](const char *key) noexcept {
return get_object()[key];
simdjson_really_inline simdjson_result<value> value::operator[](const char *key) && noexcept {
return std::forward<value>(*this).get_object()[key];
}
simdjson_really_inline void value::log_value(const char *type) const noexcept {
@ -163,90 +188,94 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::begin() noexcept {
if (error()) { return error(); }
return std::move(first.begin());
return std::move(first).get_array().begin();
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::end() noexcept {
if (error()) { return error(); }
return std::move(first.end());
return {};
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](std::string_view key) noexcept {
if (error()) { return error(); }
return first[key];
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first)[key];
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) noexcept {
if (error()) { return error(); }
return first[key];
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first)[key];
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() noexcept {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() && noexcept {
if (error()) { return error(); }
return first.get_array();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_array();
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() noexcept {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() && noexcept {
if (error()) { return error(); }
return first.get_object();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_object();
}
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() noexcept {
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() && noexcept {
if (error()) { return error(); }
return first.get_uint64();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_uint64();
}
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() noexcept {
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() && noexcept {
if (error()) { return error(); }
return first.get_int64();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_int64();
}
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() noexcept {
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() && noexcept {
if (error()) { return error(); }
return first.get_double();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_double();
}
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() noexcept {
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() && noexcept {
if (error()) { return error(); }
return first.get_string();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_string();
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() noexcept {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() && noexcept {
if (error()) { return error(); }
return first.get_raw_json_string();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_raw_json_string();
}
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() noexcept {
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() && noexcept {
if (error()) { return error(); }
return first.get_bool();
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_bool();
}
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() noexcept {
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() & noexcept {
if (error()) { return false; }
return first.is_null();
}
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() && noexcept {
if (error()) { return false; }
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).is_null();
}
#if SIMDJSON_EXCEPTIONS
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() noexcept(false) {
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() && noexcept(false) {
if (error()) { throw simdjson_error(error()); }
return first;
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
}
#endif

View File

@ -27,31 +27,30 @@ public:
// TODO assert if two values are ever alive at the same time, to ensure they get destroyed
simdjson_really_inline ~value() noexcept;
simdjson_really_inline void skip() noexcept;
simdjson_really_inline simdjson_result<array> get_array() noexcept;
simdjson_really_inline simdjson_result<object> get_object() noexcept;
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
simdjson_really_inline simdjson_result<double> get_double() noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
simdjson_really_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
simdjson_really_inline bool is_null() noexcept;
simdjson_really_inline simdjson_result<array> get_array() && noexcept;
simdjson_really_inline simdjson_result<object> get_object() && noexcept;
simdjson_really_inline simdjson_result<uint64_t> get_uint64() && noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() && noexcept;
simdjson_really_inline simdjson_result<double> get_double() && noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() && noexcept;
simdjson_really_inline simdjson_result<raw_json_string> get_raw_json_string() && noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() && noexcept;
simdjson_really_inline bool is_null() & noexcept;
simdjson_really_inline bool is_null() && noexcept;
#if SIMDJSON_EXCEPTIONS
simdjson_really_inline operator array() noexcept(false);
simdjson_really_inline operator object() noexcept(false);
simdjson_really_inline operator uint64_t() noexcept(false);
simdjson_really_inline operator int64_t() noexcept(false);
simdjson_really_inline operator double() noexcept(false);
simdjson_really_inline operator std::string_view() noexcept(false);
simdjson_really_inline operator raw_json_string() noexcept(false);
simdjson_really_inline operator bool() noexcept(false);
simdjson_really_inline operator array() && noexcept(false);
simdjson_really_inline operator object() && noexcept(false);
simdjson_really_inline operator uint64_t() && noexcept(false);
simdjson_really_inline operator int64_t() && noexcept(false);
simdjson_really_inline operator double() && noexcept(false);
simdjson_really_inline operator std::string_view() && noexcept(false);
simdjson_really_inline operator raw_json_string() && noexcept(false);
simdjson_really_inline operator bool() && noexcept(false);
#endif
simdjson_really_inline simdjson_result<array::iterator> begin() noexcept;
simdjson_really_inline simdjson_result<array::iterator> end() noexcept;
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) noexcept;
simdjson_really_inline simdjson_result<value> operator[](const char *key) noexcept;
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) && noexcept;
simdjson_really_inline simdjson_result<value> operator[](const char *key) && noexcept;
protected:
/**
@ -98,25 +97,26 @@ public:
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value &&value, error_code error) noexcept; ///< @private
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() noexcept;
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
simdjson_really_inline simdjson_result<double> get_double() noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
simdjson_really_inline bool is_null() noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() && noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() && noexcept;
simdjson_really_inline simdjson_result<uint64_t> get_uint64() && noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() && noexcept;
simdjson_really_inline simdjson_result<double> get_double() && noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() && noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() && noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() && noexcept;
simdjson_really_inline bool is_null() & noexcept;
simdjson_really_inline bool is_null() && noexcept;
#if SIMDJSON_EXCEPTIONS
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false);
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false);
simdjson_really_inline operator uint64_t() noexcept(false);
simdjson_really_inline operator int64_t() noexcept(false);
simdjson_really_inline operator double() noexcept(false);
simdjson_really_inline operator std::string_view() noexcept(false);
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
simdjson_really_inline operator bool() noexcept(false);
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() && noexcept(false);
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() && noexcept(false);
simdjson_really_inline operator uint64_t() && noexcept(false);
simdjson_really_inline operator int64_t() && noexcept(false);
simdjson_really_inline operator double() && noexcept(false);
simdjson_really_inline operator std::string_view() && noexcept(false);
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() && noexcept(false);
simdjson_really_inline operator bool() && noexcept(false);
#endif
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> begin() noexcept;