• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
21 class primitive_iterator_t
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:
29     /// iterator as signed integer type
30     difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
31 
32   public:
get_value() const33     constexpr difference_type get_value() const noexcept
34     {
35         return m_it;
36     }
37 
38     /// set iterator to a defined beginning
set_begin()39     void set_begin() noexcept
40     {
41         m_it = begin_value;
42     }
43 
44     /// set iterator to a defined past the end
set_end()45     void set_end() noexcept
46     {
47         m_it = end_value;
48     }
49 
50     /// return whether the iterator can be dereferenced
is_begin() const51     constexpr bool is_begin() const noexcept
52     {
53         return m_it == begin_value;
54     }
55 
56     /// return whether the iterator is at end
is_end() const57     constexpr bool is_end() const noexcept
58     {
59         return m_it == end_value;
60     }
61 
operator ==(primitive_iterator_t lhs,primitive_iterator_t rhs)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 
operator <(primitive_iterator_t lhs,primitive_iterator_t rhs)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 
operator +(difference_type n)72     primitive_iterator_t operator+(difference_type n) noexcept
73     {
74         auto result = *this;
75         result += n;
76         return result;
77     }
78 
operator -(primitive_iterator_t lhs,primitive_iterator_t rhs)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 
operator ++()84     primitive_iterator_t& operator++() noexcept
85     {
86         ++m_it;
87         return *this;
88     }
89 
operator ++(int)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 
operator --()97     primitive_iterator_t& operator--() noexcept
98     {
99         --m_it;
100         return *this;
101     }
102 
operator --(int)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 
operator +=(difference_type n)110     primitive_iterator_t& operator+=(difference_type n) noexcept
111     {
112         m_it += n;
113         return *this;
114     }
115 
operator -=(difference_type n)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
124