17 namespace daw::json::json_details {
18 template<
typename Range,
bool>
19 struct json_parse_kv_array_iterator_base {
20 using iterator_category = std::input_iterator_tag;
21 using difference_type = std::ptrdiff_t;
22 static constexpr
bool has_counter =
false;
26 template<
typename Range>
27 struct json_parse_kv_array_iterator_base<Range, true> {
29 using iterator_category = std::random_access_iterator_tag;
30 using difference_type = std::ptrdiff_t;
31 static constexpr
bool has_counter =
true;
34 constexpr difference_type
35 operator-( json_parse_kv_array_iterator_base
const &rhs )
const {
37 return static_cast<difference_type
>( rhs.rng->counter );
43 template<
typename JsonMember,
typename Range,
bool KnownBounds>
44 struct json_parse_kv_array_iterator
45 : json_parse_kv_array_iterator_base<Range, can_random_v<KnownBounds>> {
48 json_parse_kv_array_iterator_base<Range, can_random_v<KnownBounds>>;
49 using iterator_category =
typename base::iterator_category;
50 using json_key_t =
typename JsonMember::json_key_t;
51 using json_element_t =
typename JsonMember::json_value_t;
52 using value_type = std::pair<
typename json_key_t::parse_to_t
const,
53 typename json_element_t::parse_to_t>;
54 using reference = value_type;
55 using pointer = arrow_proxy<value_type>;
56 using iterator_range_t = Range;
57 using difference_type =
typename base::difference_type;
59 using json_class_type =
typename JsonMember::json_class_t;
60 inline constexpr json_parse_kv_array_iterator( ) =
default;
62 inline constexpr
explicit json_parse_kv_array_iterator(
65 if( base::rng->front( ) ==
']' ) {
66 if constexpr( not KnownBounds ) {
68 base::rng->remove_prefix( );
69 base::rng->trim_left_checked( );
77 static constexpr value_type
78 get_pair(
typename json_class_type::parse_to_t &&v ) {
79 return value_type( std::get<0>( std::move( v.members ) ),
80 std::get<1>( std::move( v.members ) ) );
84 constexpr value_type operator*( ) {
86 ErrorReason::UnexpectedEndOfData, *base::rng );
88 return get_pair( parse_value<json_class_type>(
89 ParseTag<JsonParseTypes::Class>{ }, *base::rng ) );
92 inline constexpr json_parse_kv_array_iterator &operator++( ) {
94 base::rng->clean_tail( );
96 ErrorReason::UnexpectedEndOfData );
97 if( base::rng->front( ) ==
']' ) {
99 if constexpr( base::has_counter ) {
101 ErrorReason::UnexpectedEndOfData );
104 if constexpr( not KnownBounds ) {
106 base::rng->remove_prefix( );
107 base::rng->trim_left_checked( );
113 if constexpr( base::has_counter ) {
116 ErrorReason::UnexpectedEndOfData );
117 base::rng->counter--;
124 inline constexpr json_parse_kv_array_iterator operator++(
int ) {
126 (void)this->
operator++( );
130 inline constexpr
bool
131 operator==( json_parse_kv_array_iterator
const &rhs )
const {
132 return base::rng == rhs.base::rng;
135 inline constexpr
bool
136 operator!=( json_parse_kv_array_iterator
const &rhs )
const {
137 return base::rng != rhs.base::rng;