Skip to content

Commit a4e9325

Browse files
committed
Remove object::has_next
1 parent 64ae40a commit a4e9325

File tree

2 files changed

+26
-38
lines changed

2 files changed

+26
-38
lines changed

src/generic/ondemand/object-inl.h

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,23 @@ namespace ondemand {
4444
//
4545

4646
simdjson_really_inline object::object() noexcept = default;
47-
simdjson_really_inline object::object(json_iterator_ref &&_iter, bool _has_value) noexcept
48-
: iter{std::forward<json_iterator_ref>(_iter)}, has_next{_has_value}, at_start{true}, error{SUCCESS}
47+
simdjson_really_inline object::object(json_iterator_ref &&_iter) noexcept
48+
: iter{std::forward<json_iterator_ref>(_iter)}, at_start{true}, error{SUCCESS}
4949
{
5050
}
5151
simdjson_really_inline object::object(object &&other) noexcept
52-
: iter{std::forward<object>(other).iter}, has_next{other.has_next}, at_start{other.at_start}, error{other.error}
52+
: iter{std::forward<object>(other).iter}, at_start{other.at_start}, error{other.error}
5353
{
54-
// Terminate the other iterator
55-
other.has_next = false;
5654
}
5755
simdjson_really_inline object &object::operator=(object &&other) noexcept {
5856
iter = std::forward<object>(other).iter;
59-
has_next = other.has_next;
6057
at_start = other.at_start;
6158
error = other.error;
62-
// Terminate the other iterator
63-
other.has_next = false;
6459
return *this;
6560
}
6661

6762
simdjson_really_inline object::~object() noexcept {
68-
if (!error && has_next && iter.is_alive()) {
63+
if (iter.is_alive()) {
6964
logger::log_event(*iter, "unfinished", "object");
7065
iter->skip_container();
7166
iter.release();
@@ -74,16 +69,17 @@ simdjson_really_inline object::~object() noexcept {
7469

7570
simdjson_really_inline simdjson_result<value> object::operator[](const std::string_view key) noexcept {
7671
if (error) { return report_error(); }
72+
if (!iter.is_alive()) { return NO_SUCH_FIELD; }
7773

7874
// Unless this is the first field, we need to advance past the , and check for }
79-
if (has_next) {
80-
if (at_start) {
81-
at_start = false;
82-
} else {
83-
if ((error = iter->has_next_field().get(has_next) )) { return report_error(); }
84-
}
75+
bool has_value;
76+
if (at_start) {
77+
at_start = false;
78+
has_value = true;
79+
} else {
80+
if ((error = iter->has_next_field().get(has_value) )) { return report_error(); }
8581
}
86-
while (has_next) {
82+
while (has_value) {
8783
// Get the key
8884
raw_json_string actual_key;
8985
if ((error = iter->field_key().get(actual_key) )) { return report_error(); };
@@ -96,21 +92,23 @@ simdjson_really_inline simdjson_result<value> object::operator[](const std::stri
9692
}
9793
logger::log_event(*iter, "no match", key, -2);
9894
iter->skip(); // Skip the value entirely
99-
if ((error = iter->has_next_field().get(has_next) )) { return report_error(); }
100-
if (!has_next) { iter.release(); }
95+
if ((error = iter->has_next_field().get(has_value) )) { return report_error(); }
10196
}
10297

10398
// If the loop ended, we're out of fields to look at.
99+
iter.release();
104100
return NO_SUCH_FIELD;
105101
}
106102

107103
simdjson_really_inline simdjson_result<object> object::start(json_iterator_ref &&iter) noexcept {
108104
bool has_value;
109105
SIMDJSON_TRY( iter->start_object().get(has_value) );
110-
return object(std::forward<json_iterator_ref>(iter), has_value);
106+
if (!has_value) { iter.release(); }
107+
return object(std::forward<json_iterator_ref>(iter));
111108
}
112109
simdjson_really_inline object object::started(json_iterator_ref &&iter) noexcept {
113-
return object(std::forward<json_iterator_ref>(iter), iter->started_object());
110+
if (!iter->started_object()) { iter.release(); }
111+
return object(std::forward<json_iterator_ref>(iter));
114112
}
115113
simdjson_really_inline object::iterator object::begin() noexcept {
116114
return *this;
@@ -121,7 +119,6 @@ simdjson_really_inline object::iterator object::end() noexcept {
121119

122120
simdjson_really_inline error_code object::report_error() noexcept {
123121
SIMDJSON_ASSUME(error);
124-
has_next = false;
125122
iter.release();
126123
return error;
127124
}
@@ -138,19 +135,20 @@ simdjson_really_inline object::iterator &object::iterator::operator=(const objec
138135

139136
simdjson_really_inline simdjson_result<field> object::iterator::operator*() noexcept {
140137
if (o->error) { return o->report_error(); }
141-
if (o->at_start) { o->at_start = false; }
142138
return field::start(o->iter.borrow());
143139
}
144-
simdjson_really_inline bool object::iterator::operator==(const object::iterator &) noexcept {
145-
return !o->has_next;
140+
simdjson_really_inline bool object::iterator::operator==(const object::iterator &other) noexcept {
141+
return !(*this != other);
146142
}
147143
simdjson_really_inline bool object::iterator::operator!=(const object::iterator &) noexcept {
148-
return o->has_next;
144+
return o->iter.is_alive();
149145
}
150146
simdjson_really_inline object::iterator &object::iterator::operator++() noexcept {
151147
if (o->error) { return *this; }
152-
o->error = o->iter->has_next_field().get(o->has_next); // If there's an error, has_next stays true.
153-
if (!o->has_next) { o->iter.release(); }
148+
o->at_start = false;
149+
bool has_value;
150+
o->error = o->iter->has_next_field().get(has_value);
151+
if (!(o->error || has_value)) { o->iter.release(); }
154152
return *this;
155153
}
156154

src/generic/ondemand/object.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,8 @@ class object {
5959
*
6060
* @param doc The document containing the object. doc->depth must already be incremented to
6161
* reflect the object's depth. The iterator must be just after the opening `{`.
62-
* @param is_empty Whether this container is empty or not.
63-
* @param error The error to report. If the error is not SUCCESS, this is an error chained object.
6462
*/
65-
simdjson_really_inline object(json_iterator_ref &&_iter, bool is_empty) noexcept;
63+
simdjson_really_inline object(json_iterator_ref &&_iter) noexcept;
6664

6765
simdjson_really_inline error_code report_error() noexcept;
6866

@@ -73,14 +71,6 @@ class object {
7371
* is first used, and never changes afterwards.
7472
*/
7573
json_iterator_ref iter{};
76-
/**
77-
* Whether we have anything to yield.
78-
*
79-
* PERF NOTE: we hope this will be elided into inline control flow, as it is true for all
80-
* iterations except the last, and compilers with SSA optimization can sometimes do last-iteration
81-
* optimization.
82-
*/
83-
bool has_next{};
8474
/**
8575
* Whether we are at the start.
8676
*

0 commit comments

Comments
 (0)