1
// (C) Copyright David Abrahams 2002.
2
// (C) Copyright Jeremy Siek 2002.
3
// (C) Copyright Thomas Witt 2002.
4
// Distributed under the Boost Software License, Version 1.0. (See
5
// accompanying file LICENSE_1_0.txt or copy at
6
// http://www.boost.org/LICENSE_1_0.txt)
7
#ifndef BOOST_REVERSE_ITERATOR_23022003THW_HPP
8
#define BOOST_REVERSE_ITERATOR_23022003THW_HPP
10
#include <boost/next_prior.hpp>
11
#include <boost/iterator.hpp>
12
#include <boost/iterator/iterator_adaptor.hpp>
20
template <class Iterator>
21
class reverse_iterator
22
: public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
24
typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
26
friend class iterator_core_access;
31
explicit reverse_iterator(Iterator x)
34
template<class OtherIterator>
36
reverse_iterator<OtherIterator> const& r
37
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
43
typename super_t::reference dereference() const { return *boost::prior(this->base()); }
45
void increment() { --this->base_reference(); }
46
void decrement() { ++this->base_reference(); }
48
void advance(typename super_t::difference_type n)
50
this->base_reference() += -n;
53
template <class OtherIterator>
54
typename super_t::difference_type
55
distance_to(reverse_iterator<OtherIterator> const& y) const
57
return this->base_reference() - y.base();
61
template <class BidirectionalIterator>
62
reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
64
return reverse_iterator<BidirectionalIterator>(x);
69
#endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP