1 | namespace simdjson { |
---|---|
2 | namespace SIMDJSON_IMPLEMENTATION { |
3 | namespace ondemand { |
4 | |
5 | simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept |
6 | : iter{_iter} |
7 | {} |
8 | |
9 | simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept { |
10 | if (iter.error()) { iter.abandon(); return iter.error(); } |
11 | return value(iter.child()); |
12 | } |
13 | simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept { |
14 | return !(*this != other); |
15 | } |
16 | simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept { |
17 | return iter.is_open(); |
18 | } |
19 | simdjson_inline array_iterator &array_iterator::operator++() noexcept { |
20 | error_code error; |
21 | // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here. |
22 | // However, it does not seem to make a perf difference, so we add it out of an abundance of caution. |
23 | if (( error = iter.error() )) { return *this; } |
24 | if (( error = iter.skip_child() )) { return *this; } |
25 | if (( error = iter.has_next_element().error() )) { return *this; } |
26 | return *this; |
27 | } |
28 | |
29 | } // namespace ondemand |
30 | } // namespace SIMDJSON_IMPLEMENTATION |
31 | } // namespace simdjson |
32 | |
33 | namespace simdjson { |
34 | |
35 | simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result( |
36 | SIMDJSON_IMPLEMENTATION::ondemand::array_iterator &&value |
37 | ) noexcept |
38 | : SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(t&: value)) |
39 | { |
40 | first.iter.assert_is_valid(); |
41 | } |
42 | simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result(error_code error) noexcept |
43 | : SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>({}, error) |
44 | { |
45 | } |
46 | |
47 | simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator*() noexcept { |
48 | if (error()) { return error(); } |
49 | return *first; |
50 | } |
51 | simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept { |
52 | if (!first.iter.is_valid()) { return !error(); } |
53 | return first == other.first; |
54 | } |
55 | simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept { |
56 | if (!first.iter.is_valid()) { return error(); } |
57 | return first != other.first; |
58 | } |
59 | simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator++() noexcept { |
60 | // Clear the error if there is one, so we don't yield it twice |
61 | if (error()) { second = SUCCESS; return *this; } |
62 | ++(first); |
63 | return *this; |
64 | } |
65 | |
66 | } // namespace simdjson |
67 |