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(); } simdjson_really_inline document::operator bool() noexcept(false) { return as_value(); }
#endif #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<array::iterator> document::end() & noexcept { return {}; }
simdjson_really_inline simdjson_result<value> document::operator[](std::string_view key) & noexcept { return as_value()[key]; } 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() }; 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 != '[') { if (*json != '[') {
log_error("not an array"); log_error("not an array");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return INCORRECT_TYPE; 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 != '{') { if (*json != '{') {
log_error("not an object"); log_error("not an object");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return INCORRECT_TYPE; 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"); 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? 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; } 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); 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? iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return result; 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"); log_value("double");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
double result; double result;
error_code error; error_code error;
if ((error = stage2::numberparsing::parse_double(json).get(result))) { log_error("not a double"); return 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; 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"); log_value("unsigned");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
uint64_t result; uint64_t result;
error_code error; error_code error;
if ((error = stage2::numberparsing::parse_unsigned(json).get(result))) { log_error("not a unsigned integer"); return 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; 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"); log_value("integer");
iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
int64_t result; int64_t result;
error_code error; error_code error;
if ((error = stage2::numberparsing::parse_integer(json).get(result))) { log_error("not an integer"); return 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; 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"); 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_true = stage2::atomparsing::str4ncmp(json, "true");
auto not_false = stage2::atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e'); 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]); 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; } 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); 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"); 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; } if (stage2::atomparsing::str4ncmp(json, "null")) { return false; }
iter.release(); // Communicate that we have handled the value PERF TODO elided, right? iter.release(); // Communicate that we have handled the value PERF TODO elided, right?
return true; 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 #if SIMDJSON_EXCEPTIONS
simdjson_really_inline value::operator array() noexcept(false) { return get_array(); } simdjson_really_inline value::operator array() && noexcept(false) {
simdjson_really_inline value::operator object() noexcept(false) { return get_object(); } return std::forward<value>(*this).get_array();
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 object() && noexcept(false) {
simdjson_really_inline value::operator double() noexcept(false) { return get_double(); } return std::forward<value>(*this).get_object();
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 uint64_t() && noexcept(false) {
simdjson_really_inline value::operator bool() noexcept(false) { return get_bool(); } 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 #endif
simdjson_really_inline simdjson_result<array::iterator> value::begin() noexcept { return get_array().begin(); } simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) && noexcept {
simdjson_really_inline simdjson_result<array::iterator> value::end() noexcept { return {}; } return std::forward<value>(*this).get_object()[key];
// 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[](const char *key) noexcept { simdjson_really_inline simdjson_result<value> value::operator[](const char *key) && noexcept {
return get_object()[key]; return std::forward<value>(*this).get_object()[key];
} }
simdjson_really_inline void value::log_value(const char *type) const noexcept { 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 { simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::begin() noexcept {
if (error()) { return error(); } 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 { simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::end() noexcept {
if (error()) { return error(); } 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 { 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(); } 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 { simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) noexcept {
if (error()) { return error(); } 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(); } 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(); } 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(); } 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(); } 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(); } 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(); } 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(); } 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(); } 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; } if (error()) { return false; }
return first.is_null(); 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 #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()); } 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()); } 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()); } 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()); } 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()); } 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()); } 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()); } 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()); } if (error()) { throw simdjson_error(error()); }
return first; return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
} }
#endif #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 // 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 ~value() noexcept;
simdjson_really_inline void skip() noexcept; simdjson_really_inline void skip() noexcept;
simdjson_really_inline simdjson_result<array> get_array() noexcept; simdjson_really_inline simdjson_result<array> get_array() && noexcept;
simdjson_really_inline simdjson_result<object> get_object() 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<uint64_t> get_uint64() && noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() 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<double> get_double() && noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() 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<raw_json_string> get_raw_json_string() && noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() noexcept; simdjson_really_inline simdjson_result<bool> get_bool() && noexcept;
simdjson_really_inline bool is_null() noexcept; simdjson_really_inline bool is_null() & noexcept;
simdjson_really_inline bool is_null() && noexcept;
#if SIMDJSON_EXCEPTIONS #if SIMDJSON_EXCEPTIONS
simdjson_really_inline operator array() noexcept(false); simdjson_really_inline operator array() && noexcept(false);
simdjson_really_inline operator object() noexcept(false); simdjson_really_inline operator object() && noexcept(false);
simdjson_really_inline operator uint64_t() noexcept(false); simdjson_really_inline operator uint64_t() && noexcept(false);
simdjson_really_inline operator int64_t() noexcept(false); simdjson_really_inline operator int64_t() && noexcept(false);
simdjson_really_inline operator double() noexcept(false); simdjson_really_inline operator double() && noexcept(false);
simdjson_really_inline operator std::string_view() noexcept(false); simdjson_really_inline operator std::string_view() && noexcept(false);
simdjson_really_inline operator raw_json_string() noexcept(false); simdjson_really_inline operator raw_json_string() && noexcept(false);
simdjson_really_inline operator bool() noexcept(false); simdjson_really_inline operator bool() && noexcept(false);
#endif #endif
simdjson_really_inline simdjson_result<array::iterator> begin() noexcept; simdjson_really_inline simdjson_result<value> operator[](std::string_view key) && noexcept;
simdjson_really_inline simdjson_result<array::iterator> end() 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: 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(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(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::array> get_array() && noexcept;
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() 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<uint64_t> get_uint64() && noexcept;
simdjson_really_inline simdjson_result<int64_t> get_int64() 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<double> get_double() && noexcept;
simdjson_really_inline simdjson_result<std::string_view> get_string() 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<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() && noexcept;
simdjson_really_inline simdjson_result<bool> get_bool() noexcept; simdjson_really_inline simdjson_result<bool> get_bool() && noexcept;
simdjson_really_inline bool is_null() noexcept; simdjson_really_inline bool is_null() & noexcept;
simdjson_really_inline bool is_null() && noexcept;
#if SIMDJSON_EXCEPTIONS #if SIMDJSON_EXCEPTIONS
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() 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 SIMDJSON_IMPLEMENTATION::ondemand::object() && noexcept(false);
simdjson_really_inline operator uint64_t() noexcept(false); simdjson_really_inline operator uint64_t() && noexcept(false);
simdjson_really_inline operator int64_t() noexcept(false); simdjson_really_inline operator int64_t() && noexcept(false);
simdjson_really_inline operator double() noexcept(false); simdjson_really_inline operator double() && noexcept(false);
simdjson_really_inline operator std::string_view() 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 SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() && noexcept(false);
simdjson_really_inline operator bool() noexcept(false); simdjson_really_inline operator bool() && noexcept(false);
#endif #endif
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> begin() noexcept; simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array::iterator> begin() noexcept;