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/iterator_adaptor.hpp>
18 template <class Iterator>
19 class reverse_iterator
20 : public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
22 typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
24 friend class iterator_core_access;
29 explicit reverse_iterator(Iterator x)
32 template<class OtherIterator>
34 reverse_iterator<OtherIterator> const& r
35 , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
41 typename super_t::reference dereference() const
43 Iterator it = this->base_reference();
48 void increment() { --this->base_reference(); }
49 void decrement() { ++this->base_reference(); }
51 void advance(typename super_t::difference_type n)
53 this->base_reference() -= n;
56 template <class OtherIterator>
57 typename super_t::difference_type
58 distance_to(reverse_iterator<OtherIterator> const& y) const
60 return this->base_reference() - y.base();
64 template <class BidirectionalIterator>
65 inline reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
67 return reverse_iterator<BidirectionalIterator>(x);
70 } // namespace iterators
72 using iterators::reverse_iterator;
73 using iterators::make_reverse_iterator;
77 #endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP