DAW JSON Link
daw_json_parse_array_iterator.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
12#include "daw_json_assert.h"
15#include "version.h"
16
17#include <daw/daw_attributes.h>
18
19#include <ciso646>
20#include <type_traits>
21
22namespace daw::json {
23 inline namespace DAW_JSON_VER {
24 namespace json_details {
25 template<typename ParseState, bool>
27 using iterator_category = std::input_iterator_tag;
28 using difference_type = std::ptrdiff_t;
29 static constexpr bool has_counter = false;
30
31 ParseState *parse_state = nullptr;
32 };
33
34 template<typename ParseState>
35 struct json_parse_array_iterator_base<ParseState, true> {
36 // We have to lie so that std::distance uses O(1) instead of O(N)
37 using iterator_category = std::random_access_iterator_tag;
38 using difference_type = std::ptrdiff_t;
39 static constexpr bool has_counter = true;
40
41 ParseState *parse_state = nullptr;
42 difference_type counter = 0;
43
44 constexpr json_parse_array_iterator_base( ) noexcept = default;
45
46 explicit inline constexpr json_parse_array_iterator_base(
47 ParseState *pd ) noexcept
48 : parse_state( pd )
49 , counter( static_cast<difference_type>( pd->counter ) ) {}
50
51 inline constexpr difference_type
53 // rhs is the iterator with the parser in it. We should know how many
54 // items are in play because we already counted them in the skip_array
55 // call.
56
57 return rhs.counter;
58 }
59 };
60
61 template<typename JsonMember, typename ParseState, bool KnownBounds>
64 can_random_v<KnownBounds>> {
65
66 using base =
68
71 using value_type = typename element_t::parse_to_t;
74 using parse_state_t = ParseState;
76 using size_type = std::size_t;
77
78 inline constexpr json_parse_array_iterator( ) = default;
79
80 inline constexpr explicit json_parse_array_iterator( parse_state_t &r )
81 : base{ &r } {
82 if( DAW_UNLIKELY( base::parse_state->front( ) == ']' ) ) {
83 if constexpr( not KnownBounds ) {
84 // Cleanup at end of value
85 base::parse_state->remove_prefix( );
86 base::parse_state->trim_left_checked( );
87 // Ensure we are equal to default
88 }
89 base::parse_state = nullptr;
90 }
91 }
92
93 DAW_ATTRIB_INLINE
94 inline constexpr value_type operator*( ) {
96 base::parse_state and base::parse_state->has_more( ),
97 ErrorReason::UnexpectedEndOfData, *base::parse_state );
98
99 return parse_value<element_t>(
101 }
102
103 DAW_ATTRIB_INLINE inline constexpr json_parse_array_iterator &
106 ErrorReason::UnexpectedEndOfData,
108 base::parse_state->trim_left( );
109
111 base::parse_state->has_more( ) and
112 base::parse_state->is_at_next_array_element( ),
113 ErrorReason::UnexpectedEndOfData, *base::parse_state );
114
115 base::parse_state->move_next_member_or_end( );
117 ErrorReason::UnexpectedEndOfData,
119 if( base::parse_state->front( ) == ']' ) {
120#ifndef NDEBUG
121 if constexpr( base::has_counter ) {
122 daw_json_assert_weak( base::counter == 0,
123 ErrorReason::AttemptToAccessPastEndOfValue,
125 }
126#endif
127 if constexpr( not KnownBounds ) {
128 // Cleanup at end of value
129 base::parse_state->remove_prefix( );
130 base::parse_state->trim_left_checked( );
131 // Ensure we are equal to default
132 }
133 base::parse_state = nullptr;
134 } else {
135#ifndef NDEBUG
136 if constexpr( base::has_counter ) {
137 daw_json_assert_weak( base::counter > 0,
138 ErrorReason::AttemptToAccessPastEndOfValue,
140 --base::counter;
141 }
142#endif
143 }
144 return *this;
145 }
146
147 friend inline constexpr bool
149 json_parse_array_iterator const &rhs ) {
150 return lhs.parse_state == rhs.parse_state;
151 }
152
153 friend inline constexpr bool
155 json_parse_array_iterator const &rhs ) {
156 return not( lhs == rhs );
157 }
158
160 return *this;
161 }
162
163 constexpr json_parse_array_iterator end( ) const {
164 return { };
165 }
166 };
167 } // namespace json_details
168 } // namespace DAW_JSON_VER
169} // namespace daw::json
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:190
typename JsonMember::without_name without_name
Definition: daw_json_traits.h:104
daw::constant< v > ParseTag
Definition: daw_json_enums.h:119
Definition: daw_from_json.h:22
Definition: daw_json_arrow_proxy.h:16
constexpr difference_type operator-(json_parse_array_iterator_base const &rhs) const
Definition: daw_json_parse_array_iterator.h:52
std::random_access_iterator_tag iterator_category
Definition: daw_json_parse_array_iterator.h:37
std::ptrdiff_t difference_type
Definition: daw_json_parse_array_iterator.h:38
Definition: daw_json_parse_array_iterator.h:26
static constexpr bool has_counter
Definition: daw_json_parse_array_iterator.h:29
std::ptrdiff_t difference_type
Definition: daw_json_parse_array_iterator.h:28
ParseState * parse_state
Definition: daw_json_parse_array_iterator.h:31
std::input_iterator_tag iterator_category
Definition: daw_json_parse_array_iterator.h:27
Definition: daw_json_parse_array_iterator.h:64
constexpr friend bool operator==(json_parse_array_iterator const &lhs, json_parse_array_iterator const &rhs)
Definition: daw_json_parse_array_iterator.h:148
typename base::iterator_category iterator_category
Definition: daw_json_parse_array_iterator.h:69
typename JsonMember::json_element_t::without_name element_t
Definition: daw_json_parse_array_iterator.h:70
std::size_t size_type
Definition: daw_json_parse_array_iterator.h:76
value_type reference
Definition: daw_json_parse_array_iterator.h:72
typename element_t::parse_to_t value_type
Definition: daw_json_parse_array_iterator.h:71
constexpr json_parse_array_iterator(parse_state_t &r)
Definition: daw_json_parse_array_iterator.h:80
constexpr json_parse_array_iterator end() const
Definition: daw_json_parse_array_iterator.h:163
typename base::difference_type difference_type
Definition: daw_json_parse_array_iterator.h:75
constexpr json_parse_array_iterator & begin()
Definition: daw_json_parse_array_iterator.h:159
constexpr DAW_ATTRIB_INLINE json_parse_array_iterator & operator++()
Definition: daw_json_parse_array_iterator.h:104
ParseState parse_state_t
Definition: daw_json_parse_array_iterator.h:74
constexpr friend bool operator!=(json_parse_array_iterator const &lhs, json_parse_array_iterator const &rhs)
Definition: daw_json_parse_array_iterator.h:154
constexpr DAW_ATTRIB_INLINE value_type operator*()
Definition: daw_json_parse_array_iterator.h:94
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16