namespace std { namespace experimental { namespace ranges { inline namespace v1 {
template <BidirectionalIterator I>
class reverse_iterator {
public:
using iterator_type = I;
using difference_type = difference_type_t<I>;
using value_type = value_type_t<I>;
using iterator_category = iterator_category_t<I>;
using reference = reference_t<I>;
using pointer = I;
constexpr reverse_iterator();
explicit constexpr reverse_iterator(I x);
constexpr reverse_iterator(const reverse_iterator<ConvertibleTo<I>>& i);
constexpr reverse_iterator& operator=(const reverse_iterator<ConvertibleTo<I>>& i);
constexpr I base() const;
constexpr reference operator*() const;
constexpr pointer operator->() const;
constexpr reverse_iterator& operator++();
constexpr reverse_iterator operator++(int);
constexpr reverse_iterator& operator--();
constexpr reverse_iterator operator--(int);
constexpr reverse_iterator operator+ (difference_type n) const
requires RandomAccessIterator<I>;
constexpr reverse_iterator& operator+=(difference_type n)
requires RandomAccessIterator<I>;
constexpr reverse_iterator operator- (difference_type n) const
requires RandomAccessIterator<I>;
constexpr reverse_iterator& operator-=(difference_type n)
requires RandomAccessIterator<I>;
constexpr reference operator[](difference_type n) const
requires RandomAccessIterator<I>;
friend constexpr rvalue_reference_t<I> iter_move(const reverse_iterator& i)
noexcept(see below);
template <IndirectlySwappable<I> I2>
friend constexpr void iter_swap(const reverse_iterator& x, const reverse_iterator<I2>& y)
noexcept(see below);
private:
I current; };
template <class I1, class I2>
requires EqualityComparableWith<I1, I2>
constexpr bool operator==(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires EqualityComparableWith<I1, I2>
constexpr bool operator!=(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires StrictTotallyOrderedWith<I1, I2>
constexpr bool operator<(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires StrictTotallyOrderedWith<I1, I2>
constexpr bool operator>(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires StrictTotallyOrderedWith<I1, I2>
constexpr bool operator>=(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires StrictTotallyOrderedWith<I1, I2>
constexpr bool operator<=(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <class I1, class I2>
requires SizedSentinel<I1, I2>
constexpr difference_type_t<I2> operator-(
const reverse_iterator<I1>& x,
const reverse_iterator<I2>& y);
template <RandomAccessIterator I>
constexpr reverse_iterator<I> operator+(
difference_type_t<I> n,
const reverse_iterator<I>& x);
template <BidirectionalIterator I>
constexpr reverse_iterator<I> make_reverse_iterator(I i);
}}}}