tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
reverse_iterator.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_ITERATOR_REVERSE_ITERATOR_HPP
4#define TETL_ITERATOR_REVERSE_ITERATOR_HPP
5
8
9namespace etl {
10
21template <typename Iter>
23 using iterator_type = Iter;
29
36 constexpr reverse_iterator()
37 : _current()
38 {
39 }
40
44 constexpr explicit reverse_iterator(Iter x)
45 : _current(x)
46 {
47 }
48
52 template <typename Other>
54 : _current(other.base())
55 {
56 }
57
60 template <typename Other>
61 constexpr auto operator=(reverse_iterator<Other> const& other) -> reverse_iterator&
62 {
63 _current = other.base();
64 return *this;
65 }
66
68 [[nodiscard]] constexpr auto base() const -> Iter { return _current; }
69
71 constexpr auto operator*() const -> reference
72 {
73 auto tmp = _current;
74 return *--tmp;
75 }
76
78 constexpr auto operator->() const -> pointer { return etl::addressof(operator*()); }
79
81 constexpr auto operator++() -> reverse_iterator&
82 {
83 --_current;
84 return *this;
85 }
86
88 constexpr auto operator++(int) -> reverse_iterator
89 {
90 auto tmp(*this);
91 --_current;
92 return tmp;
93 }
94
96 constexpr auto operator--() -> reverse_iterator&
97 {
98 ++_current;
99 return *this;
100 }
101
103 constexpr auto operator--(int) -> reverse_iterator
104 {
105 auto tmp(*this);
106 ++_current;
107 return tmp;
108 }
109
111 constexpr auto operator+(difference_type n) const -> reverse_iterator { return reverse_iterator(_current - n); }
112
115 {
116 _current -= n;
117 return *this;
118 }
119
121 constexpr auto operator-(difference_type n) const -> reverse_iterator { return reverse_iterator(_current + n); }
122
125 {
126 _current += n;
127 return *this;
128 }
129
131 constexpr auto operator[](difference_type n) const -> reference { return *(*this + n); }
132
133private:
134 Iter _current;
135};
136
140template <typename Iter>
141[[nodiscard]] constexpr auto make_reverse_iterator(Iter i) noexcept -> etl::reverse_iterator<Iter>
142{
144}
145
148template <typename Iter1, typename Iter2>
149[[nodiscard]] constexpr auto
151{
152 return lhs.base() == rhs.base();
153}
154
157template <typename Iter1, typename Iter2>
158[[nodiscard]] constexpr auto
160{
161 return lhs.base() != rhs.base();
162}
163
166template <typename Iter1, typename Iter2>
167[[nodiscard]] constexpr auto operator<(etl::reverse_iterator<Iter1> const& lhs, etl::reverse_iterator<Iter2> const& rhs)
168 -> bool
169{
170 return lhs.base() < rhs.base();
171}
172
175template <typename Iter1, typename Iter2>
176[[nodiscard]] constexpr auto
178{
179 return lhs.base() <= rhs.base();
180}
181
184template <typename Iter1, typename Iter2>
185[[nodiscard]] constexpr auto operator>(etl::reverse_iterator<Iter1> const& lhs, etl::reverse_iterator<Iter2> const& rhs)
186 -> bool
187{
188 return lhs.base() > rhs.base();
189}
190
193template <typename Iter1, typename Iter2>
194[[nodiscard]] constexpr auto
196{
197 return lhs.base() >= rhs.base();
198}
199
201template <typename Iter>
202[[nodiscard]] constexpr auto
204 noexcept(noexcept(it.base() - n)) -> reverse_iterator<Iter>
205{
206 return reverse_iterator<Iter>(it.base() - n);
207}
208
210template <typename Iterator1, typename Iterator2>
212 noexcept(noexcept(rhs.base() - lhs.base())) -> decltype(rhs.base() - lhs.base())
213{
214 return rhs.base() - lhs.base();
215}
216
217} // namespace etl
218
219#endif // TETL_ITERATOR_REVERSE_ITERATOR_HPP
Definition adjacent_find.hpp:8
constexpr auto operator==(inplace_function< R(Args...), Capacity, Alignment > const &f, nullptr_t) noexcept -> bool
Compares a etl::inplace_function with a null pointer. Empty functions (that is, functions without a c...
Definition inplace_function.hpp:262
constexpr auto addressof(T &arg) noexcept -> T *
Obtains the actual address of the object or function arg, even in presence of overloaded operator&.
Definition addressof.hpp:15
constexpr auto operator!=(inplace_function< R(Args...), Capacity, Alignment > const &f, nullptr_t) noexcept -> bool
Compares a etl::inplace_function with a null pointer. Empty functions (that is, functions without a c...
Definition inplace_function.hpp:272
constexpr auto operator-(complex< T > const &val) -> complex< T >
Definition complex.hpp:262
constexpr auto operator<(etl::reverse_iterator< Iter1 > const &lhs, etl::reverse_iterator< Iter2 > const &rhs) -> bool
Compares the underlying iterators. Inverse comparisons are applied in order to take into account that...
Definition reverse_iterator.hpp:167
constexpr auto operator+(complex< T > const &val) -> complex< T >
Definition complex.hpp:256
constexpr auto operator<=(etl::reverse_iterator< Iter1 > const &lhs, etl::reverse_iterator< Iter2 > const &rhs) -> bool
Compares the underlying iterators. Inverse comparisons are applied in order to take into account that...
Definition reverse_iterator.hpp:177
constexpr auto operator>(etl::reverse_iterator< Iter1 > const &lhs, etl::reverse_iterator< Iter2 > const &rhs) -> bool
Compares the underlying iterators. Inverse comparisons are applied in order to take into account that...
Definition reverse_iterator.hpp:185
constexpr auto operator>=(etl::reverse_iterator< Iter1 > const &lhs, etl::reverse_iterator< Iter2 > const &rhs) -> bool
Compares the underlying iterators. Inverse comparisons are applied in order to take into account that...
Definition reverse_iterator.hpp:195
constexpr auto make_reverse_iterator(Iter i) noexcept -> etl::reverse_iterator< Iter >
Convenience function template that constructs a etl::reverse_iterator for the given iterator i (which...
Definition reverse_iterator.hpp:141
iterator_traits is the type trait class that provides uniform interface to the properties of LegacyIt...
Definition iterator_traits.hpp:47
reverse_iterator is an iterator adaptor that reverses the direction of a given iterator....
Definition reverse_iterator.hpp:22
typename etl::iterator_traits< iterator >::pointer pointer
Definition reverse_iterator.hpp:27
constexpr reverse_iterator(Iter x)
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:44
constexpr auto operator+(difference_type n) const -> reverse_iterator
Returns an iterator which is advanced by n positions.
Definition reverse_iterator.hpp:111
constexpr auto operator--() -> reverse_iterator &
Pre-decrements by one respectively.
Definition reverse_iterator.hpp:96
constexpr reverse_iterator()
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:36
typename etl::iterator_traits< iterator >::iterator_category iterator_category
Definition reverse_iterator.hpp:28
constexpr auto operator+=(difference_type n) -> reverse_iterator &
Advances the iterator by n or -n positions respectively.
Definition reverse_iterator.hpp:114
constexpr auto operator[](difference_type n) const -> reference
Returns a reference to the element at specified relative location.
Definition reverse_iterator.hpp:131
constexpr auto operator++(int) -> reverse_iterator
Pre-increments by one respectively.
Definition reverse_iterator.hpp:88
constexpr reverse_iterator(reverse_iterator< Other > const &other)
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:53
iterator iterator_type
Definition reverse_iterator.hpp:23
constexpr auto operator++() -> reverse_iterator &
Pre-increments by one respectively.
Definition reverse_iterator.hpp:81
typename iterator_traits< iterator >::value_type value_type
Definition reverse_iterator.hpp:24
typename etl::iterator_traits< iterator >::difference_type difference_type
Definition reverse_iterator.hpp:25
constexpr auto operator->() const -> pointer
Returns a pointer to the element previous to current.
Definition reverse_iterator.hpp:78
constexpr auto operator-(difference_type n) const -> reverse_iterator
Returns an iterator which is advanced by -n positions.
Definition reverse_iterator.hpp:121
constexpr auto base() const -> iterator
Definition reverse_iterator.hpp:68
typename etl::iterator_traits< iterator >::reference reference
Definition reverse_iterator.hpp:26
constexpr auto operator=(reverse_iterator< Other > const &other) -> reverse_iterator &
The underlying iterator is assigned the value of the underlying iterator of other,...
Definition reverse_iterator.hpp:61
constexpr auto operator--(int) -> reverse_iterator
Pre-decrements by one respectively.
Definition reverse_iterator.hpp:103
constexpr auto operator*() const -> reference
Returns a reference to the element previous to current.
Definition reverse_iterator.hpp:71
constexpr auto operator-=(difference_type n) -> reverse_iterator &
Advances the iterator by n or -n positions respectively.
Definition reverse_iterator.hpp:124