primitive_iterator.hpp 2.7 KB

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