4#ifndef TETL_ITERATOR_REVERSE_ITERATOR_HPP
5#define TETL_ITERATOR_REVERSE_ITERATOR_HPP
7#include <etl/_iterator/iterator_traits.hpp>
8#include <etl/_memory/addressof.hpp>
22template <
typename Iter>
23struct reverse_iterator {
24 using iterator_type = Iter;
53 template <
typename Other>
55 : _current(other.base())
61 template <
typename Other>
62 constexpr auto operator=(reverse_iterator<Other>
const& other) -> reverse_iterator&
64 _current = other.base();
69 [[nodiscard]]
constexpr auto base()
const -> Iter
88 constexpr auto operator++() -> reverse_iterator&
95 constexpr auto operator++(
int) -> reverse_iterator
118 constexpr auto operator+(difference_type n)
const -> reverse_iterator
120 return reverse_iterator(_current - n);
124 constexpr auto operator+=(difference_type n) -> reverse_iterator&
131 constexpr auto operator-(difference_type n)
const -> reverse_iterator
133 return reverse_iterator(_current + n);
137 constexpr auto operator-=(difference_type n) -> reverse_iterator&
144 constexpr auto operator[](difference_type n)
const -> reference
156template <
typename Iter>
159 return etl::reverse_iterator<Iter>(i);
164template <
typename Iter1,
typename Iter2>
165[[nodiscard]]
constexpr auto
166operator==(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs) ->
bool
168 return lhs.base() == rhs.base();
173template <
typename Iter1,
typename Iter2>
174[[nodiscard]]
constexpr auto
175operator!=(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs) ->
bool
177 return lhs.base() != rhs.base();
182template <
typename Iter1,
typename Iter2>
183[[nodiscard]]
constexpr auto operator<(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs)
186 return lhs.base() < rhs.base();
191template <
typename Iter1,
typename Iter2>
192[[nodiscard]]
constexpr auto
193operator<=(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs) ->
bool
195 return lhs.base() <= rhs.base();
200template <
typename Iter1,
typename Iter2>
201[[nodiscard]]
constexpr auto operator>(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs)
204 return lhs.base() > rhs.base();
209template <
typename Iter1,
typename Iter2>
210[[nodiscard]]
constexpr auto
211operator>=(
etl::reverse_iterator<Iter1>
const& lhs,
etl::reverse_iterator<Iter2>
const& rhs) ->
bool
213 return lhs.base() >= rhs.base();
217template <
typename Iter>
219 typename reverse_iterator<Iter>::difference_type n,
220 reverse_iterator<Iter>
const& it
221)
noexcept(
noexcept(
it.
base() -
n)) -> reverse_iterator<Iter>
223 return reverse_iterator<Iter>(it.base() - n);
227template <
typename Iterator1,
typename Iterator2>
228constexpr auto operator-(reverse_iterator<Iterator1>
const& lhs, reverse_iterator<Iterator2>
const& rhs)
noexcept(
230) ->
decltype(rhs.base() - lhs.base())
232 return rhs.base() - lhs.base();
Definition adjacent_find.hpp:9
constexpr auto operator-(reverse_iterator< Iterator1 > const &lhs, reverse_iterator< Iterator2 > const &rhs) noexcept(noexcept(rhs.base() - lhs.base())) -> decltype(rhs.base() - lhs.base())
Returns the distance between two iterator adaptors.
Definition reverse_iterator.hpp:228
constexpr auto operator+(typename reverse_iterator< Iter >::difference_type n, reverse_iterator< Iter > const &it) noexcept(noexcept(it.base() - n)) -> reverse_iterator< Iter >
Returns the iterator it incremented by n.
Definition reverse_iterator.hpp:218
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:183
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:166
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:175
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:193
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:201
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:211
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:157
iterator_traits is the type trait class that provides uniform interface to the properties of LegacyIt...
Definition iterator_traits.hpp:48
constexpr reverse_iterator(Iter x)
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:45
constexpr auto operator+(difference_type n) const -> reverse_iterator
Returns an iterator which is advanced by n positions.
Definition reverse_iterator.hpp:118
constexpr auto operator--() -> reverse_iterator &
Pre-decrements by one respectively.
Definition reverse_iterator.hpp:103
constexpr reverse_iterator()
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:37
constexpr auto operator+=(difference_type n) -> reverse_iterator &
Advances the iterator by n or -n positions respectively.
Definition reverse_iterator.hpp:124
constexpr auto operator[](difference_type n) const -> reference
Returns a reference to the element at specified relative location.
Definition reverse_iterator.hpp:144
constexpr auto operator++(int) -> reverse_iterator
Pre-increments by one respectively.
Definition reverse_iterator.hpp:95
constexpr reverse_iterator(reverse_iterator< Other > const &other)
Constructs a new iterator adaptor.
Definition reverse_iterator.hpp:54
constexpr auto operator++() -> reverse_iterator &
Pre-increments by one respectively.
Definition reverse_iterator.hpp:88
constexpr auto operator->() const -> pointer
Returns a pointer to the element previous to current.
Definition reverse_iterator.hpp:82
constexpr auto operator-(difference_type n) const -> reverse_iterator
Returns an iterator which is advanced by -n positions.
Definition reverse_iterator.hpp:131
constexpr auto base() const -> Iter
Returns the underlying base iterator.
Definition reverse_iterator.hpp:69
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:62
constexpr auto operator--(int) -> reverse_iterator
Pre-decrements by one respectively.
Definition reverse_iterator.hpp:110
constexpr auto operator*() const -> reference
Returns a reference to the element previous to current.
Definition reverse_iterator.hpp:75
constexpr auto operator-=(difference_type n) -> reverse_iterator &
Advances the iterator by n or -n positions respectively.
Definition reverse_iterator.hpp:137