Horizon
Loading...
Searching...
No Matches
primitive_iterator.hpp
1#pragma once
2
3#include <cstddef> // ptrdiff_t
4#include <limits> // numeric_limits
5
6#include <nlohmann/detail/macro_scope.hpp>
7
8namespace nlohmann
9{
10namespace detail
11{
12/*
13@brief an iterator for primitive JSON types
14
15This class models an iterator for primitive JSON types (boolean, number,
16string). It's only purpose is to allow the iterator/const_iterator classes
17to "iterate" over primitive values. Internally, the iterator is modeled by
18a `difference_type` variable. Value begin_value (`0`) models the begin,
19end_value (`1`) models past the end.
20*/
22{
23 private:
24 using difference_type = std::ptrdiff_t;
25 static constexpr difference_type begin_value = 0;
26 static constexpr difference_type end_value = begin_value + 1;
27
28 JSON_PRIVATE_UNLESS_TESTED:
30 difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
31
32 public:
33 constexpr difference_type get_value() const noexcept
34 {
35 return m_it;
36 }
37
39 void set_begin() noexcept
40 {
41 m_it = begin_value;
42 }
43
45 void set_end() noexcept
46 {
47 m_it = end_value;
48 }
49
51 constexpr bool is_begin() const noexcept
52 {
53 return m_it == begin_value;
54 }
55
57 constexpr bool is_end() const noexcept
58 {
59 return m_it == end_value;
60 }
61
62 friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
63 {
64 return lhs.m_it == rhs.m_it;
65 }
66
67 friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
68 {
69 return lhs.m_it < rhs.m_it;
70 }
71
72 primitive_iterator_t operator+(difference_type n) noexcept
73 {
74 auto result = *this;
75 result += n;
76 return result;
77 }
78
79 friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
80 {
81 return lhs.m_it - rhs.m_it;
82 }
83
84 primitive_iterator_t& operator++() noexcept
85 {
86 ++m_it;
87 return *this;
88 }
89
90 primitive_iterator_t const operator++(int) noexcept // NOLINT(readability-const-return-type)
91 {
92 auto result = *this;
93 ++m_it;
94 return result;
95 }
96
97 primitive_iterator_t& operator--() noexcept
98 {
99 --m_it;
100 return *this;
101 }
102
103 primitive_iterator_t const operator--(int) noexcept // NOLINT(readability-const-return-type)
104 {
105 auto result = *this;
106 --m_it;
107 return result;
108 }
109
110 primitive_iterator_t& operator+=(difference_type n) noexcept
111 {
112 m_it += n;
113 return *this;
114 }
115
116 primitive_iterator_t& operator-=(difference_type n) noexcept
117 {
118 m_it -= n;
119 return *this;
120 }
121};
122} // namespace detail
123} // namespace nlohmann
Definition primitive_iterator.hpp:22
constexpr bool is_end() const noexcept
return whether the iterator is at end
Definition primitive_iterator.hpp:57
constexpr bool is_begin() const noexcept
return whether the iterator can be dereferenced
Definition primitive_iterator.hpp:51
void set_begin() noexcept
set iterator to a defined beginning
Definition primitive_iterator.hpp:39
void set_end() noexcept
set iterator to a defined past the end
Definition primitive_iterator.hpp:45
namespace for Niels Lohmann
Definition adl_serializer.hpp:12