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/iterator.hpp>
11 #include <boost/utility.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