17 namespace daw::json::json_details {
18 template<
typename... Args>
19 [[maybe_unused]]
void test_map( std::map<Args...>
const & );
21 template<
typename... Args>
22 [[maybe_unused]]
void test_map( std::unordered_map<Args...>
const & );
23 template<
typename Range,
bool>
24 struct json_parse_kv_class_iterator_base {
25 using iterator_category = std::input_iterator_tag;
26 using difference_type = std::ptrdiff_t;
30 template<
typename Range>
31 struct json_parse_kv_class_iterator_base<Range, true> {
33 using iterator_category = std::random_access_iterator_tag;
34 using difference_type = std::ptrdiff_t;
37 constexpr difference_type
38 operator-( json_parse_kv_class_iterator_base
const &rhs )
const {
40 return static_cast<difference_type
>( rhs.rng->counter );
46 template<
typename JsonMember,
typename Range,
bool KnownBounds>
47 struct json_parse_kv_class_iterator
48 : json_parse_kv_class_iterator_base<Range, can_random_v<KnownBounds>> {
51 json_parse_kv_class_iterator_base<Range, can_random_v<KnownBounds>>;
52 using iterator_category =
typename base::iterator_category;
53 using element_t =
typename JsonMember::json_element_t;
54 using member_container_type =
typename JsonMember::base_type;
55 using value_type =
typename member_container_type::value_type;
56 using reference = value_type;
57 using pointer = arrow_proxy<value_type>;
58 using iterator_range_t = Range;
59 using difference_type =
typename base::difference_type;
61 using key_t =
typename JsonMember::json_key_t;
62 using value_t =
typename JsonMember::json_element_t;
64 inline constexpr json_parse_kv_class_iterator( ) =
default;
66 inline constexpr
explicit json_parse_kv_class_iterator(
69 if( base::rng->front( ) ==
'}' ) {
71 if( not KnownBounds ) {
72 base::rng->remove_prefix( );
73 base::rng->trim_left_checked( );
80 inline constexpr value_type operator*( ) {
82 ErrorReason::UnexpectedEndOfData, *base::rng );
84 parse_value<key_t>( ParseTag<key_t::expected_type>{ }, *base::rng );
85 name::name_parser::trim_end_of_name( *base::rng );
86 return json_class_constructor<value_type>(
87 std::move( key ), parse_value<value_t>(
88 ParseTag<value_t::expected_type>{ }, *base::rng ) );
91 inline constexpr json_parse_kv_class_iterator &operator++( ) {
93 base::rng, ErrorReason::AttemptToAccessPastEndOfValue, *base::rng );
94 base::rng->clean_tail( );
96 ErrorReason::UnexpectedEndOfData, *base::rng );
97 if( base::rng->front( ) ==
'}' ) {
99 if constexpr( KnownBounds ) {
102 ErrorReason::AttemptToAccessPastEndOfValue,
104 base::rng->counter--;
108 if constexpr( not KnownBounds ) {
110 base::rng->remove_prefix( );
111 base::rng->trim_left_checked( );
117 if constexpr( KnownBounds ) {
120 ErrorReason::AttemptToAccessPastEndOfValue,
122 base::rng->counter--;
129 inline constexpr json_parse_kv_class_iterator operator++(
int ) {
131 (void)this->
operator++( );
135 inline constexpr
bool
136 operator==( json_parse_kv_class_iterator
const &rhs )
const {
138 return base::rng == rhs.base::rng;
141 inline constexpr
bool
142 operator!=( json_parse_kv_class_iterator
const &rhs )
const {
144 return base::rng != rhs.base::rng;