DAW JSON Link
daw_json_parse_kv_class_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"
14 #include "version.h"
15 
16 #include <daw/daw_move.h>
17 
18 #include <ciso646>
19 #include <cstddef>
20 #include <iterator>
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  ParseState *parse_state = nullptr;
30  };
31 
32  template<typename ParseState>
33  struct json_parse_kv_class_iterator_base<ParseState, true> {
34  // We have to lie so that std::distance uses O(1) instead of O(N)
35  using iterator_category = std::random_access_iterator_tag;
36  using difference_type = std::ptrdiff_t;
37  ParseState *parse_state = nullptr;
38 
39  constexpr difference_type
41  if( rhs.parse_state ) {
42  return static_cast<difference_type>( rhs.parse_state->counter );
43  }
44  return 0;
45  }
46  };
47 
48  template<typename JsonMember, typename ParseState, bool IsKnown>
50  : json_parse_kv_class_iterator_base<ParseState, can_random_v<IsKnown>> {
51 
52  using base =
55  using element_t = typename JsonMember::json_element_t;
56  using member_container_type = typename JsonMember::base_type;
57  using value_type = typename member_container_type::value_type;
60  using iterator_range_t = ParseState;
62 
63  using key_t = typename JsonMember::json_key_t;
64  using value_t = typename JsonMember::json_element_t;
65 
66  inline constexpr json_parse_kv_class_iterator( ) = default;
67 
68  inline constexpr explicit json_parse_kv_class_iterator(
69  iterator_range_t &r )
70  : base{ &r } {
71  if( base::parse_state->front( ) == '}' ) {
72  // Cleanup at end of value
73  if( not IsKnown ) {
74  base::parse_state->remove_prefix( );
75  base::parse_state->trim_left_checked( );
76  // Ensure we are equal to default
77  }
78  base::parse_state = nullptr;
79  }
80  }
81 
82  inline constexpr value_type operator*( ) {
84  base::parse_state and base::parse_state->has_more( ),
85  ErrorReason::UnexpectedEndOfData, *base::parse_state );
86  auto key = parse_value<key_t>( *base::parse_state,
91  DAW_MOVE( key ),
92  parse_value<value_t>( *base::parse_state,
94  }
95 
98  ErrorReason::AttemptToAccessPastEndOfValue,
100  base::parse_state->move_next_member_or_end( );
102  ErrorReason::UnexpectedEndOfData,
104  if( base::parse_state->front( ) == '}' ) {
105 #ifndef NDEBUG
106  if constexpr( IsKnown ) {
107  if( base::parse_state ) {
108  daw_json_assert( base::parse_state->counter > 0,
109  ErrorReason::AttemptToAccessPastEndOfValue,
111  base::parse_state->counter--;
112  }
113  }
114 #endif
115  if constexpr( not IsKnown ) {
116  // Cleanup at end of value
117  base::parse_state->remove_prefix( );
118  base::parse_state->trim_left_checked( );
119  // Ensure we are equal to default
120  }
121  base::parse_state = nullptr;
122  }
123 #ifndef NDEBUG
124  if constexpr( IsKnown ) {
125  if( base::parse_state ) {
126  daw_json_assert( base::parse_state->counter > 0,
127  ErrorReason::AttemptToAccessPastEndOfValue,
129  base::parse_state->counter--;
130  }
131  }
132 #endif
133  return *this;
134  }
135 
136  friend inline constexpr bool
138  json_parse_kv_class_iterator const &rhs ) {
139  // using identity as equality
140  return lhs.parse_state == rhs.base::parse_state;
141  }
142 
143  friend inline constexpr bool
145  json_parse_kv_class_iterator const &rhs ) {
146  return not( lhs == rhs );
147  }
148  };
149  } // namespace json_details
150  } // namespace DAW_JSON_VER
151 } // namespace daw::json
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
static constexpr void trim_end_of_name(ParseState &parse_state)
Definition: daw_json_parse_name.h:29
constexpr auto json_class_constructor
Definition: daw_json_parse_common.h:57
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
Definition: daw_from_json.h:22
Definition: daw_json_traits.h:190
Definition: daw_json_arrow_proxy.h:16
constexpr difference_type operator-(json_parse_kv_class_iterator_base const &rhs) const
Definition: daw_json_parse_kv_class_iterator.h:40
std::random_access_iterator_tag iterator_category
Definition: daw_json_parse_kv_class_iterator.h:35
std::ptrdiff_t difference_type
Definition: daw_json_parse_kv_class_iterator.h:36
Definition: daw_json_parse_kv_class_iterator.h:26
std::ptrdiff_t difference_type
Definition: daw_json_parse_kv_class_iterator.h:28
ParseState * parse_state
Definition: daw_json_parse_kv_class_iterator.h:29
std::input_iterator_tag iterator_category
Definition: daw_json_parse_kv_class_iterator.h:27
Definition: daw_json_parse_kv_class_iterator.h:50
typename JsonMember::json_element_t value_t
Definition: daw_json_parse_kv_class_iterator.h:64
typename JsonMember::json_key_t key_t
Definition: daw_json_parse_kv_class_iterator.h:63
constexpr friend bool operator==(json_parse_kv_class_iterator const &lhs, json_parse_kv_class_iterator const &rhs)
Definition: daw_json_parse_kv_class_iterator.h:137
constexpr friend bool operator!=(json_parse_kv_class_iterator const &lhs, json_parse_kv_class_iterator const &rhs)
Definition: daw_json_parse_kv_class_iterator.h:144
typename JsonMember::json_element_t element_t
Definition: daw_json_parse_kv_class_iterator.h:55
ParseState iterator_range_t
Definition: daw_json_parse_kv_class_iterator.h:60
typename base::difference_type difference_type
Definition: daw_json_parse_kv_class_iterator.h:61
typename JsonMember::base_type member_container_type
Definition: daw_json_parse_kv_class_iterator.h:56
constexpr value_type operator*()
Definition: daw_json_parse_kv_class_iterator.h:82
value_type reference
Definition: daw_json_parse_kv_class_iterator.h:58
constexpr json_parse_kv_class_iterator & operator++()
Definition: daw_json_parse_kv_class_iterator.h:96
constexpr json_parse_kv_class_iterator(iterator_range_t &r)
Definition: daw_json_parse_kv_class_iterator.h:68
typename base::iterator_category iterator_category
Definition: daw_json_parse_kv_class_iterator.h:54
typename member_container_type::value_type value_type
Definition: daw_json_parse_kv_class_iterator.h:57
#define DAW_JSON_VER
Definition: version.h:11