17 namespace daw::json::json_details {
18 template<
typename Range,
bool>
19 struct json_parse_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_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_array_iterator_base
const &rhs )
const {
37 return static_cast<difference_type
>( rhs.rng->counter ) + 1;
43 template<
typename JsonMember,
typename Range,
bool KnownBounds>
44 struct json_parse_array_iterator
45 : json_parse_array_iterator_base<Range, can_random_v<KnownBounds>> {
48 json_parse_array_iterator_base<Range, can_random_v<KnownBounds>>;
49 using iterator_category =
typename base::iterator_category;
50 using element_t =
typename JsonMember::json_element_t;
51 using value_type =
typename element_t::parse_to_t;
52 using reference = value_type;
53 using pointer = arrow_proxy<value_type>;
54 using iterator_range_t = Range;
55 using difference_type =
typename base::difference_type;
57 inline constexpr json_parse_array_iterator( ) =
default;
59 inline constexpr
explicit json_parse_array_iterator( iterator_range_t &r )
61 if( base::rng->front( ) ==
']' ) {
62 if constexpr( not KnownBounds ) {
64 base::rng->remove_prefix( );
65 base::rng->trim_left_checked( );
72 inline constexpr value_type operator*( ) {
74 ErrorReason::UnexpectedEndOfData, *base::rng );
76 return parse_value<element_t>( ParseTag<element_t::expected_type>{ },
80 inline constexpr json_parse_array_iterator &operator++( ) {
82 base::rng->template clean_end_of_value<']'>( at_first );
84 ErrorReason::UnexpectedEndOfData, *base::rng );
85 if( base::rng->front( ) ==
']' ) {
87 if constexpr( base::has_counter ) {
89 ErrorReason::AttemptToAccessPastEndOfValue,
93 if constexpr( not KnownBounds ) {
95 base::rng->remove_prefix( );
96 base::rng->trim_left_checked( );
102 if constexpr( base::has_counter ) {
105 ErrorReason::AttemptToAccessPastEndOfValue,
107 base::rng->counter--;
114 inline constexpr
bool
115 operator==( json_parse_array_iterator
const &rhs )
const {
116 return base::rng == rhs.base::rng;
119 inline constexpr
bool
120 operator!=( json_parse_array_iterator
const &rhs )
const {
121 return base::rng != rhs.base::rng;