• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7 // SPDX-License-Identifier: MIT
8 
9 #pragma once
10 
11 #include <cstddef> // ptrdiff_t
12 #include <iterator> // reverse_iterator
13 #include <utility> // declval
14 
15 #include <nlohmann/detail/abi_macros.hpp>
16 
17 NLOHMANN_JSON_NAMESPACE_BEGIN
18 namespace detail
19 {
20 
21 //////////////////////
22 // reverse_iterator //
23 //////////////////////
24 
25 /*!
26 @brief a template for a reverse iterator class
27 
28 @tparam Base the base iterator type to reverse. Valid types are @ref
29 iterator (to create @ref reverse_iterator) and @ref const_iterator (to
30 create @ref const_reverse_iterator).
31 
32 @requirement The class satisfies the following concept requirements:
33 -
34 [BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
35   The iterator that can be moved can be moved in both directions (i.e.
36   incremented and decremented).
37 - [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):
38   It is possible to write to the pointed-to element (only if @a Base is
39   @ref iterator).
40 
41 @since version 1.0.0
42 */
43 template<typename Base>
44 class json_reverse_iterator : public std::reverse_iterator<Base>
45 {
46   public:
47     using difference_type = std::ptrdiff_t;
48     /// shortcut to the reverse iterator adapter
49     using base_iterator = std::reverse_iterator<Base>;
50     /// the reference type for the pointed-to element
51     using reference = typename Base::reference;
52 
53     /// create reverse iterator from iterator
json_reverse_iterator(const typename base_iterator::iterator_type & it)54     explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
55         : base_iterator(it) {}
56 
57     /// create reverse iterator from base class
json_reverse_iterator(const base_iterator & it)58     explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
59 
60     /// post-increment (it++)
operator ++(int)61     json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)
62     {
63         return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
64     }
65 
66     /// pre-increment (++it)
operator ++()67     json_reverse_iterator& operator++()
68     {
69         return static_cast<json_reverse_iterator&>(base_iterator::operator++());
70     }
71 
72     /// post-decrement (it--)
operator --(int)73     json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp)
74     {
75         return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
76     }
77 
78     /// pre-decrement (--it)
operator --()79     json_reverse_iterator& operator--()
80     {
81         return static_cast<json_reverse_iterator&>(base_iterator::operator--());
82     }
83 
84     /// add to iterator
operator +=(difference_type i)85     json_reverse_iterator& operator+=(difference_type i)
86     {
87         return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
88     }
89 
90     /// add to iterator
operator +(difference_type i) const91     json_reverse_iterator operator+(difference_type i) const
92     {
93         return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
94     }
95 
96     /// subtract from iterator
operator -(difference_type i) const97     json_reverse_iterator operator-(difference_type i) const
98     {
99         return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
100     }
101 
102     /// return difference
operator -(const json_reverse_iterator & other) const103     difference_type operator-(const json_reverse_iterator& other) const
104     {
105         return base_iterator(*this) - base_iterator(other);
106     }
107 
108     /// access to successor
operator [](difference_type n) const109     reference operator[](difference_type n) const
110     {
111         return *(this->operator+(n));
112     }
113 
114     /// return the key of an object iterator
key() const115     auto key() const -> decltype(std::declval<Base>().key())
116     {
117         auto it = --this->base();
118         return it.key();
119     }
120 
121     /// return the value of an iterator
value() const122     reference value() const
123     {
124         auto it = --this->base();
125         return it.operator * ();
126     }
127 };
128 
129 }  // namespace detail
130 NLOHMANN_JSON_NAMESPACE_END
131