123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #pragma once
- #include <cstddef>
- #include <iterator>
- #include <utility>
- #include <nlohmann/detail/abi_macros.hpp>
- NLOHMANN_JSON_NAMESPACE_BEGIN
- namespace detail
- {
- template<typename Base>
- class json_reverse_iterator : public std::reverse_iterator<Base>
- {
- public:
- using difference_type = std::ptrdiff_t;
-
- using base_iterator = std::reverse_iterator<Base>;
-
- using reference = typename Base::reference;
-
- explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
- : base_iterator(it) {}
-
- explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
-
- json_reverse_iterator operator++(int)&
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
- }
-
- json_reverse_iterator& operator++()
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator++());
- }
-
- json_reverse_iterator operator--(int)&
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
- }
-
- json_reverse_iterator& operator--()
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator--());
- }
-
- json_reverse_iterator& operator+=(difference_type i)
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
- }
-
- json_reverse_iterator operator+(difference_type i) const
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
- }
-
- json_reverse_iterator operator-(difference_type i) const
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
- }
-
- difference_type operator-(const json_reverse_iterator& other) const
- {
- return base_iterator(*this) - base_iterator(other);
- }
-
- reference operator[](difference_type n) const
- {
- return *(this->operator+(n));
- }
-
- auto key() const -> decltype(std::declval<Base>().key())
- {
- auto it = --this->base();
- return it.key();
- }
-
- reference value() const
- {
- auto it = --this->base();
- return it.operator * ();
- }
- };
- }
- NLOHMANN_JSON_NAMESPACE_END
|