simdjson 5.0.2
Ridiculously Fast JSON
Loading...
Searching...
No Matches
ranges-inl.h
1#ifndef SIMDJSON_GENERIC_ONDEMAND_RANGES_INL_H
2
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_RANGES_INL_H
5#include "simdjson/generic/ondemand/base.h"
6#include "simdjson/generic/ondemand/ranges.h"
7#include "simdjson/generic/ondemand/array-inl.h"
8#include "simdjson/generic/ondemand/array_iterator-inl.h"
9#include "simdjson/generic/ondemand/object-inl.h"
10#include "simdjson/generic/ondemand/object_iterator-inl.h"
11#endif // SIMDJSON_CONDITIONAL_INCLUDE
12
13#if SIMDJSON_SUPPORTS_RANGES
14
15namespace simdjson {
16namespace SIMDJSON_IMPLEMENTATION {
17namespace ondemand {
18
19//
20// array_range_iterator
21//
22
23simdjson_inline array_range_iterator::array_range_iterator(array_iterator iter) noexcept
24 : iter_{iter} {}
25
26simdjson_inline simdjson_result<value> array_range_iterator::operator*() const noexcept {
27 return *iter_;
28}
29
30simdjson_inline array_range_iterator& array_range_iterator::operator++() noexcept {
31 ++iter_;
32 return *this;
33}
34
35SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
36simdjson_inline void array_range_iterator::operator++(int) noexcept {
37 ++*this;
38}
39SIMDJSON_POP_DISABLE_WARNINGS
40
41//
42// array_range
43//
44
45simdjson_inline array_range::array_range(array& arr) noexcept {
46 auto b = arr.begin();
47 if (b.error()) { error_ = b.error(); return; }
48 begin_ = b.value_unsafe();
49 end_ = arr.end().value_unsafe();
50}
51
52simdjson_inline array_range_iterator array_range::begin() noexcept {
53 return array_range_iterator(begin_);
54}
55
56simdjson_inline array_range_iterator array_range::end() noexcept {
57 return array_range_iterator(end_);
58}
59
60//
61// object_range_iterator
62//
63
64simdjson_inline object_range_iterator::object_range_iterator(object_iterator iter) noexcept
65 : iter_{iter} {}
66
67simdjson_inline simdjson_result<field> object_range_iterator::operator*() const noexcept {
68 return *iter_;
69}
70
71simdjson_inline object_range_iterator& object_range_iterator::operator++() noexcept {
72 ++iter_;
73 return *this;
74}
75
76SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
77simdjson_inline void object_range_iterator::operator++(int) noexcept {
78 ++*this;
79}
80SIMDJSON_POP_DISABLE_WARNINGS
81
82
83//
84// object_range
85//
86
87simdjson_inline object_range::object_range(object& obj) noexcept {
88 auto b = obj.begin();
89 if (b.error()) { error_ = b.error(); return; }
90 begin_ = b.value_unsafe();
91 end_ = obj.end().value_unsafe();
92}
93
94simdjson_inline object_range_iterator object_range::begin() noexcept {
95 return object_range_iterator(begin_);
96}
97
98simdjson_inline object_range_iterator object_range::end() noexcept {
99 return object_range_iterator(end_);
100}
101
102//
103// Free functions
104//
105
106simdjson_inline array_range get_range(array& arr) noexcept {
107 return array_range(arr);
108}
109
110simdjson_inline object_range get_key_value_range(object& obj) noexcept {
111 return object_range(obj);
112}
113
114#if SIMDJSON_EXCEPTIONS
115simdjson_inline array_range get_range(simdjson_result<array> result) {
116 return array_range(result.value());
117}
118
119simdjson_inline object_range get_key_value_range(simdjson_result<object> result) {
120 return object_range(result.value());
121}
122#endif // SIMDJSON_EXCEPTIONS
123
124} // namespace ondemand
125} // namespace SIMDJSON_IMPLEMENTATION
126} // namespace simdjson
127
128// Verify the range wrapper types satisfy the expected C++20 concepts.
129static_assert(std::input_iterator<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::array_range_iterator>);
130static_assert(std::input_iterator<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::object_range_iterator>);
131static_assert(std::ranges::input_range<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::array_range>);
132static_assert(std::ranges::input_range<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::object_range>);
133static_assert(std::ranges::view<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::array_range>);
134static_assert(std::ranges::view<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::object_range>);
135
136#endif // SIMDJSON_SUPPORTS_RANGES
137
138#endif // SIMDJSON_GENERIC_ONDEMAND_RANGES_INL_H
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8