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