json_reverse_iterator.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 <iterator> // reverse_iterator
  11. #include <utility> // declval
  12. #include <nlohmann/detail/abi_macros.hpp>
  13. NLOHMANN_JSON_NAMESPACE_BEGIN
  14. namespace detail
  15. {
  16. //////////////////////
  17. // reverse_iterator //
  18. //////////////////////
  19. /*!
  20. @brief a template for a reverse iterator class
  21. @tparam Base the base iterator type to reverse. Valid types are @ref
  22. iterator (to create @ref reverse_iterator) and @ref const_iterator (to
  23. create @ref const_reverse_iterator).
  24. @requirement The class satisfies the following concept requirements:
  25. -
  26. [BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
  27. The iterator that can be moved can be moved in both directions (i.e.
  28. incremented and decremented).
  29. - [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):
  30. It is possible to write to the pointed-to element (only if @a Base is
  31. @ref iterator).
  32. @since version 1.0.0
  33. */
  34. template<typename Base>
  35. class json_reverse_iterator : public std::reverse_iterator<Base>
  36. {
  37. public:
  38. using difference_type = std::ptrdiff_t;
  39. /// shortcut to the reverse iterator adapter
  40. using base_iterator = std::reverse_iterator<Base>;
  41. /// the reference type for the pointed-to element
  42. using reference = typename Base::reference;
  43. /// create reverse iterator from iterator
  44. explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
  45. : base_iterator(it) {}
  46. /// create reverse iterator from base class
  47. explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
  48. /// post-increment (it++)
  49. json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)
  50. {
  51. return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
  52. }
  53. /// pre-increment (++it)
  54. json_reverse_iterator& operator++()
  55. {
  56. return static_cast<json_reverse_iterator&>(base_iterator::operator++());
  57. }
  58. /// post-decrement (it--)
  59. json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp)
  60. {
  61. return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
  62. }
  63. /// pre-decrement (--it)
  64. json_reverse_iterator& operator--()
  65. {
  66. return static_cast<json_reverse_iterator&>(base_iterator::operator--());
  67. }
  68. /// add to iterator
  69. json_reverse_iterator& operator+=(difference_type i)
  70. {
  71. return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
  72. }
  73. /// add to iterator
  74. json_reverse_iterator operator+(difference_type i) const
  75. {
  76. return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
  77. }
  78. /// subtract from iterator
  79. json_reverse_iterator operator-(difference_type i) const
  80. {
  81. return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
  82. }
  83. /// return difference
  84. difference_type operator-(const json_reverse_iterator& other) const
  85. {
  86. return base_iterator(*this) - base_iterator(other);
  87. }
  88. /// access to successor
  89. reference operator[](difference_type n) const
  90. {
  91. return *(this->operator+(n));
  92. }
  93. /// return the key of an object iterator
  94. auto key() const -> decltype(std::declval<Base>().key())
  95. {
  96. auto it = --this->base();
  97. return it.key();
  98. }
  99. /// return the value of an iterator
  100. reference value() const
  101. {
  102. auto it = --this->base();
  103. return it.operator * ();
  104. }
  105. };
  106. } // namespace detail
  107. NLOHMANN_JSON_NAMESPACE_END