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 
11 #include "daw_json_arrow_proxy.h"
12 #include "daw_json_assert.h"
13 #include "daw_json_parse_policy.h"
15 #include "version.h"
16 
17 #include <daw/daw_attributes.h>
18 
19 #include <ciso646>
20 #include <type_traits>
21 
22 namespace 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  return rhs.counter;
57  }
58  };
59 
60  template<typename JsonMember, typename ParseState, bool KnownBounds>
62  : json_parse_array_iterator_base<ParseState,
63  can_random_v<KnownBounds>> {
64 
65  using base =
67 
70  using value_type = typename element_t::parse_to_t;
73  using parse_state_t = ParseState;
75  using size_type = std::size_t;
76 
77  inline constexpr json_parse_array_iterator( ) = default;
78 
79  inline constexpr explicit json_parse_array_iterator( parse_state_t &r )
80  : base{ &r } {
81  if( DAW_UNLIKELY( base::parse_state->front( ) == ']' ) ) {
82  if constexpr( not KnownBounds ) {
83  // Cleanup at end of value
84  base::parse_state->remove_prefix( );
85  base::parse_state->trim_left_checked( );
86  // Ensure we are equal to default
87  }
88  base::parse_state = nullptr;
89  }
90  }
91 
92  DAW_ATTRIB_INLINE
93  inline constexpr value_type operator*( ) {
95  base::parse_state and base::parse_state->has_more( ),
96  ErrorReason::UnexpectedEndOfData, *base::parse_state );
97 
98  return parse_value<element_t>(
100  }
101 
102  DAW_ATTRIB_INLINE inline constexpr json_parse_array_iterator &
105  ErrorReason::UnexpectedEndOfData,
107  base::parse_state->trim_left( );
108 
110  base::parse_state->has_more( ) and
111  base::parse_state->is_at_next_array_element( ),
112  ErrorReason::UnexpectedEndOfData, *base::parse_state );
113 
114  base::parse_state->move_next_member_or_end( );
116  ErrorReason::UnexpectedEndOfData,
118  if( base::parse_state->front( ) == ']' ) {
119 #ifndef NDEBUG
120  if constexpr( base::has_counter ) {
121  daw_json_assert_weak( base::counter == 0,
122  ErrorReason::AttemptToAccessPastEndOfValue,
124  }
125 #endif
126  if constexpr( not KnownBounds ) {
127  // Cleanup at end of value
128  base::parse_state->remove_prefix( );
129  base::parse_state->trim_left_checked( );
130  // Ensure we are equal to default
131  }
132  base::parse_state = nullptr;
133  } else {
134 #ifndef NDEBUG
135  if constexpr( base::has_counter ) {
136  daw_json_assert_weak( base::counter > 0,
137  ErrorReason::AttemptToAccessPastEndOfValue,
139  --base::counter;
140  }
141 #endif
142  }
143  return *this;
144  }
145 
146  friend inline constexpr bool
148  json_parse_array_iterator const &rhs ) {
149  return lhs.parse_state == rhs.parse_state;
150  }
151 
152  friend inline constexpr bool
154  json_parse_array_iterator const &rhs ) {
155  return not( lhs == rhs );
156  }
157 
159  return *this;
160  }
161 
162  constexpr json_parse_array_iterator end( ) const {
163  return { };
164  }
165  };
166  } // namespace json_details
167  } // namespace DAW_JSON_VER
168 } // namespace daw::json
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
typename JsonMember::without_name without_name
Definition: daw_json_traits.h:102
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
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:63
constexpr friend bool operator==(json_parse_array_iterator const &lhs, json_parse_array_iterator const &rhs)
Definition: daw_json_parse_array_iterator.h:147
typename base::iterator_category iterator_category
Definition: daw_json_parse_array_iterator.h:68
typename JsonMember::json_element_t::without_name element_t
Definition: daw_json_parse_array_iterator.h:69
std::size_t size_type
Definition: daw_json_parse_array_iterator.h:75
value_type reference
Definition: daw_json_parse_array_iterator.h:71
typename element_t::parse_to_t value_type
Definition: daw_json_parse_array_iterator.h:70
constexpr json_parse_array_iterator(parse_state_t &r)
Definition: daw_json_parse_array_iterator.h:79
constexpr json_parse_array_iterator end() const
Definition: daw_json_parse_array_iterator.h:162
constexpr json_parse_array_iterator & begin()
Definition: daw_json_parse_array_iterator.h:158
typename base::difference_type difference_type
Definition: daw_json_parse_array_iterator.h:74
ParseState parse_state_t
Definition: daw_json_parse_array_iterator.h:73
constexpr friend bool operator!=(json_parse_array_iterator const &lhs, json_parse_array_iterator const &rhs)
Definition: daw_json_parse_array_iterator.h:153
constexpr DAW_ATTRIB_INLINE json_parse_array_iterator & operator++()
Definition: daw_json_parse_array_iterator.h:103
constexpr DAW_ATTRIB_INLINE value_type operator*()
Definition: daw_json_parse_array_iterator.h:93
#define DAW_JSON_VER
Definition: version.h:11