simdjson 4.2.4
Ridiculously Fast JSON
Loading...
Searching...
No Matches
field-inl.h
1#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
2
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
5#include "simdjson/generic/ondemand/base.h"
6#include "simdjson/generic/ondemand/field.h"
7#include "simdjson/generic/ondemand/value-inl.h"
8#include "simdjson/generic/ondemand/value_iterator-inl.h"
9#endif // SIMDJSON_CONDITIONAL_INCLUDE
10
11namespace simdjson {
12namespace SIMDJSON_IMPLEMENTATION {
13namespace ondemand {
14
15// clang 6 does not think the default constructor can be noexcept, so we make it explicit
16simdjson_inline field::field() noexcept : std::pair<raw_json_string, ondemand::value>() {}
17
18simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
19 : std::pair<raw_json_string, ondemand::value>(key, std::forward<ondemand::value>(value))
20{
21}
22
23simdjson_inline simdjson_result<field> field::start(value_iterator &parent_iter) noexcept {
24 raw_json_string key;
25 SIMDJSON_TRY( parent_iter.field_key().get(key) );
26 SIMDJSON_TRY( parent_iter.field_value() );
27 return field::start(parent_iter, key);
28}
29
30simdjson_inline simdjson_result<field> field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
31 return field(key, parent_iter.child());
32}
33
34simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> field::unescaped_key(bool allow_replacement) noexcept {
35 SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
36 simdjson_result<std::string_view> answer = first.unescape(second.iter.json_iter(), allow_replacement);
37 first.consume();
38 return answer;
39}
40
41template <typename string_type>
42simdjson_inline simdjson_warn_unused error_code field::unescaped_key(string_type& receiver, bool allow_replacement) noexcept {
43 std::string_view key;
44 SIMDJSON_TRY( unescaped_key(allow_replacement).get(key) );
45 receiver = key;
46 return SUCCESS;
47}
48
49simdjson_inline raw_json_string field::key() const noexcept {
50 SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
51 return first;
52}
53
54
55simdjson_inline std::string_view field::key_raw_json_token() const noexcept {
56 SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
57 return std::string_view(reinterpret_cast<const char*>(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1);
58}
59
60simdjson_inline std::string_view field::escaped_key() const noexcept {
61 SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
62 auto end_quote = second.iter._json_iter->token.peek(-1);
63 while(*end_quote != '"') end_quote--;
64 return std::string_view(reinterpret_cast<const char*>(first.buf), end_quote - first.buf);
65}
66
67simdjson_inline value &field::value() & noexcept {
68 return second;
69}
70
71simdjson_inline value field::value() && noexcept {
72 return std::forward<field>(*this).second;
73}
74
75} // namespace ondemand
76} // namespace SIMDJSON_IMPLEMENTATION
77} // namespace simdjson
78
79namespace simdjson {
80
81simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
82 SIMDJSON_IMPLEMENTATION::ondemand::field &&value
83) noexcept :
84 implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(
85 std::forward<SIMDJSON_IMPLEMENTATION::ondemand::field>(value)
86 )
87{
88}
89simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
90 error_code error
91) noexcept :
92 implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(error)
93{
94}
95
96simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key() noexcept {
97 if (error()) { return error(); }
98 return first.key();
99}
100
101simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key_raw_json_token() noexcept {
102 if (error()) { return error(); }
103 return first.key_raw_json_token();
104}
105
106simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::escaped_key() noexcept {
107 if (error()) { return error(); }
108 return first.escaped_key();
109}
110
111simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::unescaped_key(bool allow_replacement) noexcept {
112 if (error()) { return error(); }
113 return first.unescaped_key(allow_replacement);
114}
115
116template<typename string_type>
117simdjson_warn_unused simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::unescaped_key(string_type &receiver, bool allow_replacement) noexcept {
118 if (error()) { return error(); }
119 return first.unescaped_key(receiver, allow_replacement);
120}
121
122simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::value() noexcept {
123 if (error()) { return error(); }
124 return std::move(first.value());
125}
126
127} // namespace simdjson
128
129#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
simdjson_inline std::string_view key_raw_json_token() const noexcept
Get the unprocessed key as a string_view.
Definition field-inl.h:55
simdjson_inline simdjson_warn_unused simdjson_result< std::string_view > unescaped_key(bool allow_replacement=false) noexcept
Get the key as a string_view (for higher speed, consider raw_key).
Definition field-inl.h:34
simdjson_inline raw_json_string key() const noexcept
Get the key as a raw_json_string.
Definition field-inl.h:49
simdjson_inline std::string_view escaped_key() const noexcept
Get the key as a string_view.
Definition field-inl.h:60
simdjson_inline field() noexcept
Create a new invalid field.
Definition field-inl.h:16
simdjson_inline ondemand::value & value() &noexcept
Get the field value.
Definition field-inl.h:67
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition value.h:22
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
error_code
All possible errors returned by simdjson.
Definition error.h:19
@ SUCCESS
No error.
Definition error.h:20
The result of a simdjson operation that could fail.
Definition error.h:280
simdjson_inline T & value() &noexcept(false)
Get the result value.
Definition error-inl.h:175