Horizon
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 
8 namespace nlohmann
9 {
10 namespace detail
11 {
12 /*
13 @brief an iterator for primitive JSON types
14 
15 This class models an iterator for primitive JSON types (boolean, number,
16 string). It's only purpose is to allow the iterator/const_iterator classes
17 to "iterate" over primitive values. Internally, the iterator is modeled by
18 a `difference_type` variable. Value begin_value (`0`) models the begin,
19 end_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