primitive_iterator.hpp 3.2 KB

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