simdjson  3.9.4
Ridiculously Fast JSON
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 
11 namespace simdjson {
12 namespace SIMDJSON_IMPLEMENTATION {
13 namespace ondemand {
14 
15 // clang 6 does not think the default constructor can be noexcept, so we make it explicit
16 simdjson_inline field::field() noexcept : std::pair<raw_json_string, ondemand::value>() {}
17 
18 simdjson_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 
23 simdjson_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 
30 simdjson_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 
34 simdjson_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 
41 simdjson_inline raw_json_string field::key() const noexcept {
42  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
43  return first;
44 }
45 
46 
47 simdjson_inline std::string_view field::key_raw_json_token() const noexcept {
48  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
49  return std::string_view(reinterpret_cast<const char*>(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1);
50 }
51 
52 simdjson_inline std::string_view field::escaped_key() const noexcept {
53  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
54  auto end_quote = second.iter._json_iter->token.peek(-1);
55  while(*end_quote != '"') end_quote--;
56  return std::string_view(reinterpret_cast<const char*>(first.buf), end_quote - first.buf);
57 }
58 
59 simdjson_inline value &field::value() & noexcept {
60  return second;
61 }
62 
63 simdjson_inline value field::value() && noexcept {
64  return std::forward<field>(*this).second;
65 }
66 
67 } // namespace ondemand
68 } // namespace SIMDJSON_IMPLEMENTATION
69 } // namespace simdjson
70 
71 namespace simdjson {
72 
73 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
74  SIMDJSON_IMPLEMENTATION::ondemand::field &&value
75 ) noexcept :
76  implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(
77  std::forward<SIMDJSON_IMPLEMENTATION::ondemand::field>(value)
78  )
79 {
80 }
81 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
82  error_code error
83 ) noexcept :
84  implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(error)
85 {
86 }
87 
88 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key() noexcept {
89  if (error()) { return error(); }
90  return first.key();
91 }
92 
93 simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key_raw_json_token() noexcept {
94  if (error()) { return error(); }
95  return first.key_raw_json_token();
96 }
97 
98 simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::escaped_key() noexcept {
99  if (error()) { return error(); }
100  return first.escaped_key();
101 }
102 
103 simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::unescaped_key(bool allow_replacement) noexcept {
104  if (error()) { return error(); }
105  return first.unescaped_key(allow_replacement);
106 }
107 
108 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::value() noexcept {
109  if (error()) { return error(); }
110  return std::move(first.value());
111 }
112 
113 } // namespace simdjson
114 
115 #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:47
simdjson_inline raw_json_string key() const noexcept
Get the key as a raw_json_string.
Definition: field-inl.h:41
simdjson_inline std::string_view escaped_key() const noexcept
Get the key as a string_view.
Definition: field-inl.h:52
simdjson_inline simdjson_warn_unused simdjson_result< std::string_view > unescaped_key(bool allow_replacement) noexcept
Get the key as a string_view (for higher speed, consider raw_key).
Definition: field-inl.h:34
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:59
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition: value.h:18
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
The result of a simdjson operation that could fail.
Definition: error.h:215
simdjson_inline error_code error() const noexcept
The error.
Definition: error-inl.h:131
simdjson_inline T & value() &noexcept(false)
Get the result value.