Skip to content

Commit 184be58

Browse files
committed
[WIP] && and & versions of each operator
1 parent 3abde02 commit 184be58

File tree

3 files changed

+205
-56
lines changed

3 files changed

+205
-56
lines changed

include/simdjson/generic/ondemand/json_iterator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class json_iterator : public token_iterator {
145145
SIMDJSON_WARN_UNUSED simdjson_really_inline simdjson_result<bool> parse_root_bool(const uint8_t *json) noexcept;
146146
SIMDJSON_WARN_UNUSED simdjson_really_inline simdjson_result<bool> consume_root_bool() noexcept;
147147
simdjson_really_inline bool root_is_null(const uint8_t *json) noexcept;
148-
simdjson_really_inline bool root_is_null() & noexcept;
148+
simdjson_really_inline bool root_is_null() noexcept;
149149

150150
/**
151151
* Skips a JSON value, whether it is a scalar, array or object.

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

Lines changed: 122 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ simdjson_really_inline value value::start(json_iterator_ref &&iter) noexcept {
3030
return { std::forward<json_iterator_ref>(iter), iter->advance() };
3131
}
3232

33-
simdjson_really_inline void value::consume() noexcept {
33+
simdjson_really_inline const uint8_t *value::consume() noexcept {
3434
iter.release();
35+
return json;
3536
}
3637
template<typename T>
3738
simdjson_really_inline simdjson_result<T> value::consume_if_success(simdjson_result<T> &&result) noexcept {
@@ -51,25 +52,48 @@ simdjson_really_inline simdjson_result<object> value::get_object() noexcept {
5152
if (!has_value) { iter.release(); }
5253
return object(std::move(iter));
5354
}
54-
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() noexcept {
55+
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() && noexcept {
56+
return iter->consume_raw_json_string();
57+
}
58+
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() & noexcept {
5559
return consume_if_success( iter->parse_raw_json_string(json) );
5660
}
57-
simdjson_really_inline simdjson_result<std::string_view> value::get_string() noexcept {
61+
simdjson_really_inline simdjson_result<std::string_view> value::get_string() && noexcept {
62+
auto result = iter->parse_string(json);
63+
consume();
64+
return result;
65+
}
66+
simdjson_really_inline simdjson_result<std::string_view> value::get_string() & noexcept {
5867
return consume_if_success( iter->parse_string(json) );
5968
}
60-
simdjson_really_inline simdjson_result<double> value::get_double() noexcept {
69+
simdjson_really_inline simdjson_result<double> value::get_double() && noexcept {
70+
return iter->parse_double(consume());
71+
}
72+
simdjson_really_inline simdjson_result<double> value::get_double() & noexcept {
6173
return consume_if_success( iter->parse_double(json) );
6274
}
63-
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() noexcept {
75+
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() && noexcept {
76+
return iter->parse_uint64(consume());
77+
}
78+
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() & noexcept {
6479
return consume_if_success( iter->parse_uint64(json) );
6580
}
66-
simdjson_really_inline simdjson_result<int64_t> value::get_int64() noexcept {
81+
simdjson_really_inline simdjson_result<int64_t> value::get_int64() && noexcept {
82+
return iter->parse_int64(consume());
83+
}
84+
simdjson_really_inline simdjson_result<int64_t> value::get_int64() & noexcept {
6785
return consume_if_success( iter->parse_int64(json) );
6886
}
69-
simdjson_really_inline simdjson_result<bool> value::get_bool() noexcept {
87+
simdjson_really_inline simdjson_result<bool> value::get_bool() && noexcept {
88+
return iter->parse_bool(consume());
89+
}
90+
simdjson_really_inline simdjson_result<bool> value::get_bool() & noexcept {
7091
return consume_if_success( iter->parse_bool(json) );
7192
}
72-
simdjson_really_inline bool value::is_null() noexcept {
93+
simdjson_really_inline bool value::is_null() && noexcept {
94+
return iter->is_null(consume());
95+
}
96+
simdjson_really_inline bool value::is_null() & noexcept {
7397
if (!iter->is_null(json)) { return false; }
7498
consume();
7599
return true;
@@ -82,22 +106,40 @@ simdjson_really_inline value::operator array() noexcept(false) {
82106
simdjson_really_inline value::operator object() noexcept(false) {
83107
return std::forward<value>(*this).get_object();
84108
}
85-
simdjson_really_inline value::operator uint64_t() noexcept(false) {
109+
simdjson_really_inline value::operator uint64_t() && noexcept(false) {
86110
return std::forward<value>(*this).get_uint64();
87111
}
88-
simdjson_really_inline value::operator int64_t() noexcept(false) {
112+
simdjson_really_inline value::operator uint64_t() & noexcept(false) {
113+
return std::forward<value>(*this).get_uint64();
114+
}
115+
simdjson_really_inline value::operator int64_t() && noexcept(false) {
116+
return std::forward<value>(*this).get_int64();
117+
}
118+
simdjson_really_inline value::operator int64_t() & noexcept(false) {
89119
return std::forward<value>(*this).get_int64();
90120
}
91-
simdjson_really_inline value::operator double() noexcept(false) {
121+
simdjson_really_inline value::operator double() && noexcept(false) {
92122
return std::forward<value>(*this).get_double();
93123
}
94-
simdjson_really_inline value::operator std::string_view() noexcept(false) {
124+
simdjson_really_inline value::operator double() & noexcept(false) {
125+
return std::forward<value>(*this).get_double();
126+
}
127+
simdjson_really_inline value::operator std::string_view() && noexcept(false) {
95128
return std::forward<value>(*this).get_string();
96129
}
97-
simdjson_really_inline value::operator raw_json_string() noexcept(false) {
130+
simdjson_really_inline value::operator std::string_view() & noexcept(false) {
131+
return std::forward<value>(*this).get_string();
132+
}
133+
simdjson_really_inline value::operator raw_json_string() && noexcept(false) {
134+
return std::forward<value>(*this).get_raw_json_string();
135+
}
136+
simdjson_really_inline value::operator raw_json_string() & noexcept(false) {
98137
return std::forward<value>(*this).get_raw_json_string();
99138
}
100-
simdjson_really_inline value::operator bool() noexcept(false) {
139+
simdjson_really_inline value::operator bool() && noexcept(false) {
140+
return std::forward<value>(*this).get_bool();
141+
}
142+
simdjson_really_inline value::operator bool() & noexcept(false) {
101143
return std::forward<value>(*this).get_bool();
102144
}
103145
#endif
@@ -191,33 +233,61 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object
191233
if (error()) { return error(); }
192234
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_object();
193235
}
194-
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() noexcept {
236+
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() && noexcept {
237+
if (error()) { return error(); }
238+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_uint64();
239+
}
240+
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() & noexcept {
195241
if (error()) { return error(); }
196242
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_uint64();
197243
}
198-
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() noexcept {
244+
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() && noexcept {
245+
if (error()) { return error(); }
246+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_int64();
247+
}
248+
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() & noexcept {
199249
if (error()) { return error(); }
200250
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_int64();
201251
}
202-
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() noexcept {
252+
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() && noexcept {
253+
if (error()) { return error(); }
254+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_double();
255+
}
256+
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() & noexcept {
203257
if (error()) { return error(); }
204258
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_double();
205259
}
206-
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() noexcept {
260+
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() && noexcept {
207261
if (error()) { return error(); }
208262
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_string();
209263
}
210-
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<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() & noexcept {
265+
if (error()) { return error(); }
266+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_string();
267+
}
268+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() && noexcept {
269+
if (error()) { return error(); }
270+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_raw_json_string();
271+
}
272+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() & noexcept {
211273
if (error()) { return error(); }
212274
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_raw_json_string();
213275
}
214-
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() noexcept {
276+
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() && noexcept {
215277
if (error()) { return error(); }
216278
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_bool();
217279
}
218-
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() noexcept {
280+
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() & noexcept {
281+
if (error()) { return error(); }
282+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).get_bool();
283+
}
284+
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() && noexcept {
285+
if (error()) { return false; }
286+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).is_null();
287+
}
288+
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() & noexcept {
219289
if (error()) { return false; }
220-
return first.is_null();
290+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first).is_null();
221291
}
222292

223293
#if SIMDJSON_EXCEPTIONS
@@ -229,27 +299,51 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>
229299
if (error()) { throw simdjson_error(error()); }
230300
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
231301
}
232-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() noexcept(false) {
302+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() && noexcept(false) {
303+
if (error()) { throw simdjson_error(error()); }
304+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
305+
}
306+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() & noexcept(false) {
307+
if (error()) { throw simdjson_error(error()); }
308+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
309+
}
310+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() && noexcept(false) {
311+
if (error()) { throw simdjson_error(error()); }
312+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
313+
}
314+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() & noexcept(false) {
315+
if (error()) { throw simdjson_error(error()); }
316+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
317+
}
318+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() && noexcept(false) {
319+
if (error()) { throw simdjson_error(error()); }
320+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
321+
}
322+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() & noexcept(false) {
323+
if (error()) { throw simdjson_error(error()); }
324+
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
325+
}
326+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() && noexcept(false) {
233327
if (error()) { throw simdjson_error(error()); }
234328
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
235329
}
236-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() noexcept(false) {
330+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() & noexcept(false) {
237331
if (error()) { throw simdjson_error(error()); }
238332
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
239333
}
240-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() noexcept(false) {
334+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() && noexcept(false) {
241335
if (error()) { throw simdjson_error(error()); }
242336
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
243337
}
244-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() noexcept(false) {
338+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() & noexcept(false) {
245339
if (error()) { throw simdjson_error(error()); }
246340
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
247341
}
248-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
342+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() && noexcept(false) {
249343
if (error()) { throw simdjson_error(error()); }
250344
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
251345
}
252-
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() noexcept(false) {
346+
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() & noexcept(false) {
253347
if (error()) { throw simdjson_error(error()); }
254348
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::value>(first);
255349
}

0 commit comments

Comments
 (0)