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
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
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 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 namespace kv_class_iter_impl {
49 template<typename T>
50 using container_value_t = typename T::value_type;
51
52 template<typename JsonMember>
54 std::pair<typename JsonMember::json_key_t,
55 typename JsonMember::json_element_t>;
56
57 template<typename JsonMember, typename T>
59 daw::detected_or_t<default_value_type<JsonMember>, container_value_t,
60 T>;
61 } // namespace kv_class_iter_impl
62
63 template<typename JsonMember, typename ParseState, bool IsKnown>
65 : json_parse_kv_class_iterator_base<ParseState, can_random_v<IsKnown>> {
66
67 using base =
70 using element_t = typename JsonMember::json_element_t;
71 using member_container_type = typename JsonMember::base_type;
72 using value_type =
77 using iterator_range_t = ParseState;
79
80 using key_t = typename JsonMember::json_key_t;
81 using value_t = typename JsonMember::json_element_t;
82
83 inline constexpr json_parse_kv_class_iterator( ) = default;
84
85 inline constexpr explicit json_parse_kv_class_iterator(
87 : base{ &r } {
88 if( base::parse_state->front( ) == '}' ) {
89 // Cleanup at end of value
90 if( not IsKnown ) {
91 base::parse_state->remove_prefix( );
92 base::parse_state->trim_left_checked( );
93 // Ensure we are equal to default
94 }
95 base::parse_state = nullptr;
96 }
97 }
98
99 inline constexpr value_type operator*( ) {
101 base::parse_state and base::parse_state->has_more( ),
102 ErrorReason::UnexpectedEndOfData, *base::parse_state );
103 auto key = parse_value<key_t>( *base::parse_state,
106
109 DAW_MOVE( key ),
110 parse_value<value_t>( *base::parse_state,
112 }
113
116 ErrorReason::AttemptToAccessPastEndOfValue,
118 base::parse_state->move_next_member_or_end( );
120 ErrorReason::UnexpectedEndOfData,
122 if( base::parse_state->front( ) == '}' ) {
123#ifndef NDEBUG
124 if constexpr( IsKnown ) {
125 if( base::parse_state ) {
127 ErrorReason::AttemptToAccessPastEndOfValue,
129 base::parse_state->counter--;
130 }
131 }
132#endif
133 if constexpr( not IsKnown ) {
134 // Cleanup at end of value
135 base::parse_state->remove_prefix( );
136 base::parse_state->trim_left_checked( );
137 // Ensure we are equal to default
138 }
139 base::parse_state = nullptr;
140 }
141#ifndef NDEBUG
142 if constexpr( IsKnown ) {
143 if( base::parse_state ) {
145 ErrorReason::AttemptToAccessPastEndOfValue,
147 base::parse_state->counter--;
148 }
149 }
150#endif
151 return *this;
152 }
153
154 friend inline constexpr bool
156 json_parse_kv_class_iterator const &rhs ) {
157 // using identity as equality
158 return lhs.parse_state == rhs.base::parse_state;
159 }
160
161 friend inline constexpr bool
163 json_parse_kv_class_iterator const &rhs ) {
164 return not( lhs == rhs );
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
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
std::pair< typename JsonMember::json_key_t, typename JsonMember::json_element_t > default_value_type
Definition: daw_json_parse_kv_class_iterator.h:55
typename T::value_type container_value_t
Definition: daw_json_parse_kv_class_iterator.h:50
daw::detected_or_t< default_value_type< JsonMember >, container_value_t, T > container_value_type_or
Definition: daw_json_parse_kv_class_iterator.h:60
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:54
daw::constant< v > ParseTag
Definition: daw_json_enums.h:119
Definition: daw_from_json.h:22
Definition: daw_json_traits.h:199
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:65
typename JsonMember::json_element_t value_t
Definition: daw_json_parse_kv_class_iterator.h:81
typename JsonMember::json_key_t key_t
Definition: daw_json_parse_kv_class_iterator.h:80
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:155
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:162
typename JsonMember::json_element_t element_t
Definition: daw_json_parse_kv_class_iterator.h:70
ParseState iterator_range_t
Definition: daw_json_parse_kv_class_iterator.h:77
typename base::difference_type difference_type
Definition: daw_json_parse_kv_class_iterator.h:78
typename JsonMember::base_type member_container_type
Definition: daw_json_parse_kv_class_iterator.h:71
constexpr json_parse_kv_class_iterator & operator++()
Definition: daw_json_parse_kv_class_iterator.h:114
constexpr value_type operator*()
Definition: daw_json_parse_kv_class_iterator.h:99
value_type reference
Definition: daw_json_parse_kv_class_iterator.h:75
constexpr json_parse_kv_class_iterator(iterator_range_t &r)
Definition: daw_json_parse_kv_class_iterator.h:85
typename base::iterator_category iterator_category
Definition: daw_json_parse_kv_class_iterator.h:69
kv_class_iter_impl::container_value_type_or< JsonMember, member_container_type > value_type
Definition: daw_json_parse_kv_class_iterator.h:74
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16