Horizon
Loading...
Searching...
No Matches
json_reverse_iterator.hpp
1#pragma once
2
3#include <cstddef> // ptrdiff_t
4#include <iterator> // reverse_iterator
5#include <utility> // declval
6
7namespace nlohmann
8{
9namespace detail
10{
12// reverse_iterator //
14
33template<typename Base>
34class json_reverse_iterator : public std::reverse_iterator<Base>
35{
36 public:
37 using difference_type = std::ptrdiff_t;
39 using base_iterator = std::reverse_iterator<Base>;
41 using reference = typename Base::reference;
42
44 explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
45 : base_iterator(it) {}
46
48 explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
49
51 json_reverse_iterator const operator++(int) // NOLINT(readability-const-return-type)
52 {
53 return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
54 }
55
58 {
59 return static_cast<json_reverse_iterator&>(base_iterator::operator++());
60 }
61
63 json_reverse_iterator const operator--(int) // NOLINT(readability-const-return-type)
64 {
65 return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
66 }
67
70 {
71 return static_cast<json_reverse_iterator&>(base_iterator::operator--());
72 }
73
76 {
77 return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
78 }
79
81 json_reverse_iterator operator+(difference_type i) const
82 {
83 return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
84 }
85
87 json_reverse_iterator operator-(difference_type i) const
88 {
89 return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
90 }
91
93 difference_type operator-(const json_reverse_iterator& other) const
94 {
95 return base_iterator(*this) - base_iterator(other);
96 }
97
99 reference operator[](difference_type n) const
100 {
101 return *(this->operator+(n));
102 }
103
105 auto key() const -> decltype(std::declval<Base>().key())
106 {
107 auto it = --this->base();
108 return it.key();
109 }
110
113 {
114 auto it = --this->base();
115 return it.operator * ();
116 }
117};
118} // namespace detail
119} // namespace nlohmann
a template for a reverse iterator class
Definition json_reverse_iterator.hpp:35
json_reverse_iterator(const typename base_iterator::iterator_type &it) noexcept
create reverse iterator from iterator
Definition json_reverse_iterator.hpp:44
json_reverse_iterator const operator--(int)
post-decrement (it–)
Definition json_reverse_iterator.hpp:63
typename Base::reference reference
the reference type for the pointed-to element
Definition json_reverse_iterator.hpp:41
json_reverse_iterator operator-(difference_type i) const
subtract from iterator
Definition json_reverse_iterator.hpp:87
json_reverse_iterator & operator+=(difference_type i)
add to iterator
Definition json_reverse_iterator.hpp:75
std::reverse_iterator< Base > base_iterator
shortcut to the reverse iterator adapter
Definition json_reverse_iterator.hpp:39
json_reverse_iterator(const base_iterator &it) noexcept
create reverse iterator from base class
Definition json_reverse_iterator.hpp:48
reference operator[](difference_type n) const
access to successor
Definition json_reverse_iterator.hpp:99
difference_type operator-(const json_reverse_iterator &other) const
return difference
Definition json_reverse_iterator.hpp:93
json_reverse_iterator operator+(difference_type i) const
add to iterator
Definition json_reverse_iterator.hpp:81
json_reverse_iterator const operator++(int)
post-increment (it++)
Definition json_reverse_iterator.hpp:51
auto key() const -> decltype(std::declval< Base >().key())
return the key of an object iterator
Definition json_reverse_iterator.hpp:105
json_reverse_iterator & operator--()
pre-decrement (–it)
Definition json_reverse_iterator.hpp:69
reference value() const
return the value of an iterator
Definition json_reverse_iterator.hpp:112
json_reverse_iterator & operator++()
pre-increment (++it)
Definition json_reverse_iterator.hpp:57
namespace for Niels Lohmann
Definition adl_serializer.hpp:12