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  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 
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 } // 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 & operator--()
pre-decrement (–it)
Definition: json_reverse_iterator.hpp:69
json_reverse_iterator & operator++()
pre-increment (++it)
Definition: json_reverse_iterator.hpp:57
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)
add to iterator
Definition: json_reverse_iterator.hpp:75
json_reverse_iterator operator-(difference_type i) const
subtract from iterator
Definition: json_reverse_iterator.hpp:87
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
reference value() const
return the value of an iterator
Definition: json_reverse_iterator.hpp:112
GAL_LAYER_ID operator+(const GAL_LAYER_ID &a, int b)
Used for via types.
Definition: layers_id_colors_and_visibility.h:222
namespace for Niels Lohmann
Definition: adl_serializer.hpp:9