Arene Base
Fundamental Utilities For Safety Critical C++
Loading...
Searching...
No Matches
arene::base::reverse_iterator< Itr, bool > Class Template Referencefinal

A backport of the constexpr std::reverse_iterator from C++17. More...

Inheritance diagram for arene::base::reverse_iterator< Itr, bool >:
Inheritance graph

Public Member Functions

constexpr reverse_iterator ()=default
 Default construct.
 
constexpr reverse_iterator (Itr iter) noexcept(std::is_nothrow_copy_constructible< Itr >::value)
 Construct from a non-reversed iterator.
 
constexpr reverse_iterator (reverse_iterator &&other) noexcept=default
 Move ctor.
 
constexpr reverse_iterator (reverse_iterator const &other) noexcept=default
 Copy ctor.
 
template<typename U, constraints< std::enable_if_t<!std::is_same< U, Itr >::value >, std::enable_if_t< std::is_convertible< U const &, Itr >::value > > = nullptr>
constexpr reverse_iterator (reverse_iterator< U > const &iter) noexcept(std::is_nothrow_constructible< Itr, U const & >::value &&noexcept(iter.base()))
 Conversion-construct from a reversed iterator of compatible type.
 
constexpr reverse_iterator (reverse_iterator_detail::std_reverse_iterator< Itr > const &iter) noexcept(std::is_nothrow_constructible< reviter_base, Itr >::value &&noexcept(iter.base()))
 Conversion-construct from a std::reverse_iterator.
 
 ~reverse_iterator ()=default
 default destructor
 
constexpr operator reverse_iterator_detail::std_reverse_iterator< Itr > () const noexcept(std::is_nothrow_constructible< reverse_iterator_detail::std_reverse_iterator< Itr >, Itr >::value &&noexcept(std::declval< reverse_iterator >().base()))
 Conversion operator to a std::reverse_iterator.
 
constexpr auto operator++ () noexcept(noexcept(--std::declval< Itr & >())) -> reverse_iterator &
 Increments the iterator.
 
constexpr auto operator++ (int) noexcept(std::is_nothrow_copy_constructible< reverse_iterator >::value &&noexcept(++std::declval< reverse_iterator & >())) -> reverse_iterator
 Increments the iterator.
 
constexpr auto operator+= (difference_type const delta) noexcept(noexcept(std::declval< Itr & >() -=delta)) -> reverse_iterator &
 Increments the iterator by an offset.
 
constexpr auto operator-- () noexcept(noexcept(++std::declval< Itr & >())) -> reverse_iterator &
 Decremented the iterator.
 
constexpr auto operator-- (int) noexcept(std::is_nothrow_copy_constructible< reverse_iterator >::value &&noexcept(--std::declval< reverse_iterator & >())) -> reverse_iterator
 Decrements the iterator.
 
constexpr auto operator-= (difference_type const delta) noexcept(noexcept(std::declval< Itr & >()+=delta)) -> reverse_iterator &
 Increments the iterator by an offset.
 
ARENE_NODISCARD constexpr auto operator-> () const noexcept(noexcept(std::declval< reverse_iterator const & >().itr_for_access().operator->())) -> pointer
 Dereferences the iterator.
 
constexpr auto operator= (reverse_iterator &&other) noexcept -> reverse_iterator &=default
 Move assignment.
 
constexpr auto operator= (reverse_iterator const &other) noexcept -> reverse_iterator &=default
 Copy assignment.
 
ARENE_NODISCARD constexpr auto operator[] (difference_type const delta) const noexcept -> reference
 Index-and-dereference the iterator.
 

Static Public Member Functions

template<typename U, constraints< std::enable_if_t< compare_three_way_supported_v< U, Itr > > > = nullptr>
static ARENE_NODISCARD constexpr auto three_way_compare (reverse_iterator const &lhs, reverse_iterator< U > const &rhs) noexcept -> strong_ordering
 Compare two random access iterators for relative ordering.
 
template<typename U, constraints< std::enable_if_t< compare_three_way_supported_v< U, Itr > > > = nullptr>
static ARENE_NODISCARD constexpr auto three_way_compare (reverse_iterator const &lhs, reverse_iterator_detail::std_reverse_iterator< U > const &rhs) noexcept -> strong_ordering
 Compare two random access iterators for relative ordering.
 

Friends

template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_inequality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator!= (reverse_iterator const &lhs, reverse_iterator< U > const &rhs) noexcept -> bool
 Compare two bidirectional iterators for inequality.
 
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_inequality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator!= (reverse_iterator const &lhs, reverse_iterator_detail::std_reverse_iterator< U > const &rhs) noexcept -> bool
 Compare two bidirectional iterators for inequality.
 
ARENE_NODISCARD friend constexpr auto operator+ (difference_type const delta, reverse_iterator const &iter) noexcept(std::is_nothrow_copy_constructible< Itr >::value &&is_nothrow_subtractable_v< Itr const &, difference_type const >) -> reverse_iterator
 Add an offset to the iterator.
 
ARENE_NODISCARD friend constexpr auto operator+ (reverse_iterator const &iter, difference_type const delta) noexcept(std::is_nothrow_copy_constructible< Itr >::value &&is_nothrow_subtractable_v< Itr const &, difference_type const >) -> reverse_iterator
 Add an offset to the iterator.
 
ARENE_NODISCARD friend constexpr auto operator- (reverse_iterator const &iter, difference_type const delta) noexcept(std::is_nothrow_copy_constructible< Itr >::value &&is_nothrow_addable_v< Itr const &, difference_type const >) -> reverse_iterator
 Subtract an offset from the iterator.
 
ARENE_NODISCARD friend constexpr auto operator- (reverse_iterator const lhs, reverse_iterator const rhs) noexcept(is_nothrow_subtractable_v< Itr const & >) -> difference_type
 Compute the difference between two iterators.
 
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_equality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator== (reverse_iterator const &lhs, reverse_iterator< U > const &rhs) noexcept -> bool
 Compare two bidirectional iterators for equality.
 
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_equality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator== (reverse_iterator const &lhs, reverse_iterator_detail::std_reverse_iterator< U > const &rhs) noexcept(noexcept(std::declval< Itr >()==std::declval< U >()) &&noexcept(rhs.base())) -> bool
 Compare two bidirectional iterators for equality.
 

Detailed Description

template<typename Itr, bool = std::is_pointer<Itr>::value>
class arene::base::reverse_iterator< Itr, bool >

A backport of the constexpr std::reverse_iterator from C++17.

Template Parameters
ItrThe type of the wrapped_iterator to wrap. Must satisfy is_bidirectional_iterator_v .

Specialization for when the iterator is a non-pointer type.

Constructor & Destructor Documentation

◆ reverse_iterator() [1/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( )
constexprdefault

Default construct.

◆ reverse_iterator() [2/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( reverse_iterator< Itr, bool > const & other)
constexprdefaultnoexcept

Copy ctor.

Parameters
otherThe iterator being copied

◆ reverse_iterator() [3/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( reverse_iterator< Itr, bool > && other)
constexprdefaultnoexcept

Move ctor.

Parameters
otherThe iterator being moved

◆ ~reverse_iterator()

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::~reverse_iterator ( )
default

default destructor

◆ reverse_iterator() [4/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( Itr iter)
inlineexplicitconstexprnoexcept

Construct from a non-reversed iterator.

Parameters
iterThe iterator to construct the reversed iterator from
Postcondition
The iterator points to the location of iter in a reversed view.

◆ reverse_iterator() [5/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t<!std::is_same< U, Itr >::value >, std::enable_if_t< std::is_convertible< U const &, Itr >::value > > = nullptr>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( reverse_iterator< U > const & iter)
inlineexplicitconstexprnoexcept

Conversion-construct from a reversed iterator of compatible type.

Template Parameters
UThe type of the iterator to convert from. Must satisfy std::is_convertible<const U&, Itr>.
Parameters
iterThe iterator to construct the reversed iterator from
Postcondition
The iterator points to the location of iter in a reversed view.

◆ reverse_iterator() [6/6]

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::reverse_iterator ( reverse_iterator_detail::std_reverse_iterator< Itr > const & iter)
inlineconstexprnoexcept

Conversion-construct from a std::reverse_iterator.

Parameters
iterThe iterator to construct the reversed iterator from
Postcondition
The iterator points to the location of iter in a reversed view.

Member Function Documentation

◆ operator reverse_iterator_detail::std_reverse_iterator< Itr >()

template<typename Itr, bool = std::is_pointer<Itr>::value>
arene::base::reverse_iterator< Itr, bool >::operator reverse_iterator_detail::std_reverse_iterator< Itr > ( ) const
inlineconstexprnoexcept

Conversion operator to a std::reverse_iterator.

Returns
std::reverse_itr<Itr> An instance of std::reverse_iterator<Itr> as if constructed from base() .

◆ operator++() [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator++ ( ) -> reverse_iterator&
inlineconstexprnoexcept

Increments the iterator.

Returns
reverse_iterator& The iterator post-modification
Postcondition
The iterator is advanced by one position

◆ operator++() [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator++ ( int ) -> reverse_iterator
inlineconstexprnoexcept

Increments the iterator.

Returns
reverse_iterator A copy of the iterator pre-modification
Postcondition
The iterator is advanced by one position

◆ operator+=()

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator+= ( difference_type const delta) -> reverse_iterator&
inlineconstexprnoexcept

Increments the iterator by an offset.

Parameters
deltaThe offset to add.
Returns
reverse_iterator The iterator post-modification
Postcondition
The iterator is incremented by delta positions.

◆ operator--() [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator-- ( ) -> reverse_iterator&
inlineconstexprnoexcept

Decremented the iterator.

Returns
reverse_iterator& The iterator post-modification
Postcondition
The iterator is decremented by one position

◆ operator--() [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator-- ( int ) -> reverse_iterator
inlineconstexprnoexcept

Decrements the iterator.

Returns
reverse_iterator A copy of the iterator pre-modification
Postcondition
The iterator is decremented by one position

◆ operator-=()

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator-= ( difference_type const delta) -> reverse_iterator&
inlineconstexprnoexcept

Increments the iterator by an offset.

Parameters
deltaThe offset to subtract.
Returns
reverse_iterator The iterator post-modification
Postcondition
The iterator is decremented by delta positions.

◆ operator->()

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD constexpr auto arene::base::reverse_iterator< Itr, bool >::operator-> ( ) const -> pointer
inlineconstexprnoexcept

Dereferences the iterator.

Returns
pointer A pointer to the element at the position of the iterator

◆ operator=() [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator= ( reverse_iterator< Itr, bool > && other) -> reverse_iterator &=default
constexprdefaultnoexcept

Move assignment.

Parameters
otherThe iterator being moved
Returns
*this

◆ operator=() [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
auto arene::base::reverse_iterator< Itr, bool >::operator= ( reverse_iterator< Itr, bool > const & other) -> reverse_iterator &=default
constexprdefaultnoexcept

Copy assignment.

Parameters
otherThe iterator being copied
Returns
*this

◆ operator[]()

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD constexpr auto arene::base::reverse_iterator< Itr, bool >::operator[] ( difference_type const delta) const -> reference
inlineconstexprnoexcept

Index-and-dereference the iterator.

Parameters
deltaThe offest of the element to access
Precondition
*this+delta is within the underlying range
Returns
reference A reference to the element at the position equivalent to *this+delta .

◆ three_way_compare() [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t< compare_three_way_supported_v< U, Itr > > > = nullptr>
static ARENE_NODISCARD constexpr auto arene::base::reverse_iterator< Itr, bool >::three_way_compare ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator< U > const & rhs ) -> strong_ordering
inlinestaticconstexprnoexcept

Compare two random access iterators for relative ordering.

Template Parameters
UThe type of the iterator to compare against. Must satisfy compare_three_way_supported_v<U,Itr>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
strong_ordering::less If lhs is an iterator to a position before rhs in the sequence.
strong_ordering::equal If lhs is an iterator to a position equivalent to rhs in the sequence.
strong_ordering::greater If lhs is an iterator to a position after rhs in the sequence.

◆ three_way_compare() [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t< compare_three_way_supported_v< U, Itr > > > = nullptr>
static ARENE_NODISCARD constexpr auto arene::base::reverse_iterator< Itr, bool >::three_way_compare ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator_detail::std_reverse_iterator< U > const & rhs ) -> strong_ordering
inlinestaticconstexprnoexcept

Compare two random access iterators for relative ordering.

Template Parameters
UThe type of the iterator to compare against. Must satisfy compare_three_way_supported_v<U,Itr>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
strong_ordering::less If lhs is an iterator to a position before rhs in the sequence.
strong_ordering::equal If lhs is an iterator to a position equivalent to rhs in the sequence.
strong_ordering::greater If lhs is an iterator to a position after rhs in the sequence.

Friends And Related Symbol Documentation

◆ operator!= [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_inequality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator!= ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator< U > const & rhs ) -> bool
friend

Compare two bidirectional iterators for inequality.

Template Parameters
UThe type of the iterator to compare against. Must satisfy is_equality_comparable<Itr,U>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
true if the iterators point to the different positions.
false if the iterators point to the same position.

◆ operator!= [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_inequality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator!= ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator_detail::std_reverse_iterator< U > const & rhs ) -> bool
friend

Compare two bidirectional iterators for inequality.

Template Parameters
UThe type of the iterator to compare against. Must satisfy is_equality_comparable<Itr,U>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
true if the iterators point to the different positions.
false if the iterators point to the same position.

◆ operator+ [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD friend constexpr auto operator+ ( difference_type const delta,
reverse_iterator< Itr, bool > const & iter ) -> reverse_iterator
friend

Add an offset to the iterator.

Parameters
iterThe iterator to add the offset to.
deltaThe offset to add.
Returns
reverse_iterator The iterator equivalent to advancing iter by delta positions.

◆ operator+ [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD friend constexpr auto operator+ ( reverse_iterator< Itr, bool > const & iter,
difference_type const delta ) -> reverse_iterator
friend

Add an offset to the iterator.

Parameters
iterThe iterator to add the offset to.
deltaThe offset to add.
Returns
reverse_iterator The iterator equivalent to advancing iter by delta positions.

◆ operator- [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD friend constexpr auto operator- ( reverse_iterator< Itr, bool > const & iter,
difference_type const delta ) -> reverse_iterator
friend

Subtract an offset from the iterator.

Parameters
iterThe iterator to subtract the offset from.
deltaThe offset to subtract.
Returns
reverse_iterator The iterator equivalent to decrementing iter by delta positions.

◆ operator- [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
ARENE_NODISCARD friend constexpr auto operator- ( reverse_iterator< Itr, bool > const lhs,
reverse_iterator< Itr, bool > const rhs ) -> difference_type
friend

Compute the difference between two iterators.

Parameters
lhsThe left-hand iterator operand.
rhsThe right-hand iterator operand.
Returns
difference_type The number of positions between the two iterators.

◆ operator== [1/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_equality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator== ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator< U > const & rhs ) -> bool
friend

Compare two bidirectional iterators for equality.

Template Parameters
UThe type of the iterator to compare against. Must satisfy is_equality_comparable<Itr,U>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
true if the iterators point to the same position.
false if the iterators point to different positions.

◆ operator== [2/2]

template<typename Itr, bool = std::is_pointer<Itr>::value>
template<typename U, constraints< std::enable_if_t<!compare_three_way_supported_v< Itr, U > >, std::enable_if_t< is_equality_comparable_v< Itr, U > > > = nullptr>
ARENE_NODISCARD friend constexpr auto operator== ( reverse_iterator< Itr, bool > const & lhs,
reverse_iterator_detail::std_reverse_iterator< U > const & rhs ) -> bool
friend

Compare two bidirectional iterators for equality.

Template Parameters
UThe type of the iterator to compare against. Must satisfy is_equality_comparable<Itr,U>
Parameters
lhsThe first iterator.
rhsThe second iterator.
Returns
true if the iterators point to the same position.
false if the iterators point to different positions.

The documentation for this class was generated from the following file: