• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7 // SPDX-License-Identifier: MIT
8 
9 #pragma once
10 
11 #include <cstddef> // ptrdiff_t
12 #include <limits>  // numeric_limits
13 
14 #include <nlohmann/detail/macro_scope.hpp>
15 
16 NLOHMANN_JSON_NAMESPACE_BEGIN
17 namespace detail
18 {
19 
20 /*
21 @brief an iterator for primitive JSON types
22 
23 This class models an iterator for primitive JSON types (boolean, number,
24 string). It's only purpose is to allow the iterator/const_iterator classes
25 to "iterate" over primitive values. Internally, the iterator is modeled by
26 a `difference_type` variable. Value begin_value (`0`) models the begin,
27 end_value (`1`) models past the end.
28 */
29 class primitive_iterator_t
30 {
31   private:
32     using difference_type = std::ptrdiff_t;
33     static constexpr difference_type begin_value = 0;
34     static constexpr difference_type end_value = begin_value + 1;
35 
36   JSON_PRIVATE_UNLESS_TESTED:
37     /// iterator as signed integer type
38     difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
39 
40   public:
get_value() const41     constexpr difference_type get_value() const noexcept
42     {
43         return m_it;
44     }
45 
46     /// set iterator to a defined beginning
set_begin()47     void set_begin() noexcept
48     {
49         m_it = begin_value;
50     }
51 
52     /// set iterator to a defined past the end
set_end()53     void set_end() noexcept
54     {
55         m_it = end_value;
56     }
57 
58     /// return whether the iterator can be dereferenced
is_begin() const59     constexpr bool is_begin() const noexcept
60     {
61         return m_it == begin_value;
62     }
63 
64     /// return whether the iterator is at end
is_end() const65     constexpr bool is_end() const noexcept
66     {
67         return m_it == end_value;
68     }
69 
operator ==(primitive_iterator_t lhs,primitive_iterator_t rhs)70     friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
71     {
72         return lhs.m_it == rhs.m_it;
73     }
74 
operator <(primitive_iterator_t lhs,primitive_iterator_t rhs)75     friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
76     {
77         return lhs.m_it < rhs.m_it;
78     }
79 
operator +(difference_type n)80     primitive_iterator_t operator+(difference_type n) noexcept
81     {
82         auto result = *this;
83         result += n;
84         return result;
85     }
86 
operator -(primitive_iterator_t lhs,primitive_iterator_t rhs)87     friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
88     {
89         return lhs.m_it - rhs.m_it;
90     }
91 
operator ++()92     primitive_iterator_t& operator++() noexcept
93     {
94         ++m_it;
95         return *this;
96     }
97 
operator ++(int)98     primitive_iterator_t operator++(int)& noexcept // NOLINT(cert-dcl21-cpp)
99     {
100         auto result = *this;
101         ++m_it;
102         return result;
103     }
104 
operator --()105     primitive_iterator_t& operator--() noexcept
106     {
107         --m_it;
108         return *this;
109     }
110 
operator --(int)111     primitive_iterator_t operator--(int)& noexcept // NOLINT(cert-dcl21-cpp)
112     {
113         auto result = *this;
114         --m_it;
115         return result;
116     }
117 
operator +=(difference_type n)118     primitive_iterator_t& operator+=(difference_type n) noexcept
119     {
120         m_it += n;
121         return *this;
122     }
123 
operator -=(difference_type n)124     primitive_iterator_t& operator-=(difference_type n) noexcept
125     {
126         m_it -= n;
127         return *this;
128     }
129 };
130 
131 }  // namespace detail
132 NLOHMANN_JSON_NAMESPACE_END
133