Horizon
json_reverse_iterator.hpp
1 #pragma once
2 
3 #include <cstddef> // ptrdiff_t
4 #include <iterator> // reverse_iterator
5 #include <utility> // declval
6 
7 namespace nlohmann
8 {
9 namespace detail
10 {
12 // reverse_iterator //
14 
33 template<typename Base>
34 class 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  json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
45  : base_iterator(it) {}
46 
48  json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
49 
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 
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 
75  json_reverse_iterator& operator+=(difference_type i)
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 
112  reference value() const
113  {
114  auto it = --this->base();
115  return it.operator * ();
116  }
117 };
118 }
119 }
nlohmann::detail::json_reverse_iterator
a template for a reverse iterator class
Definition: json_reverse_iterator.hpp:34
nlohmann::detail::json_reverse_iterator::operator+
json_reverse_iterator operator+(difference_type i) const
add to iterator
Definition: json_reverse_iterator.hpp:81
nlohmann::detail::json_reverse_iterator::key
auto key() const -> decltype(std::declval< Base >().key())
return the key of an object iterator
Definition: json_reverse_iterator.hpp:105
nlohmann
namespace for Niels Lohmann
Definition: adl_serializer.hpp:8
nlohmann::detail::json_reverse_iterator::json_reverse_iterator
json_reverse_iterator(const typename base_iterator::iterator_type &it) noexcept
create reverse iterator from iterator
Definition: json_reverse_iterator.hpp:44
nlohmann::detail::json_reverse_iterator::operator+=
json_reverse_iterator & operator+=(difference_type i)
add to iterator
Definition: json_reverse_iterator.hpp:75
nlohmann::detail::json_reverse_iterator::value
reference value() const
return the value of an iterator
Definition: json_reverse_iterator.hpp:112
nlohmann::detail::json_reverse_iterator::operator[]
reference operator[](difference_type n) const
access to successor
Definition: json_reverse_iterator.hpp:99
nlohmann::detail::json_reverse_iterator::reference
typename Base::reference reference
the reference type for the pointed-to element
Definition: json_reverse_iterator.hpp:41
nlohmann::detail::json_reverse_iterator::operator-
json_reverse_iterator operator-(difference_type i) const
subtract from iterator
Definition: json_reverse_iterator.hpp:87
nlohmann::detail::json_reverse_iterator::operator++
const json_reverse_iterator operator++(int)
post-increment (it++)
Definition: json_reverse_iterator.hpp:51
nlohmann::detail::json_reverse_iterator::operator++
json_reverse_iterator & operator++()
pre-increment (++it)
Definition: json_reverse_iterator.hpp:57
nlohmann::detail::json_reverse_iterator::operator--
const json_reverse_iterator operator--(int)
post-decrement (it–)
Definition: json_reverse_iterator.hpp:63
nlohmann::detail::json_reverse_iterator::operator-
difference_type operator-(const json_reverse_iterator &other) const
return difference
Definition: json_reverse_iterator.hpp:93
nlohmann::detail::json_reverse_iterator::base_iterator
std::reverse_iterator< Base > base_iterator
shortcut to the reverse iterator adapter
Definition: json_reverse_iterator.hpp:39
nlohmann::detail::json_reverse_iterator::operator--
json_reverse_iterator & operator--()
pre-decrement (–it)
Definition: json_reverse_iterator.hpp:69
nlohmann::detail::json_reverse_iterator::json_reverse_iterator
json_reverse_iterator(const base_iterator &it) noexcept
create reverse iterator from base class
Definition: json_reverse_iterator.hpp:48