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
9 
10 #include <boost/iterator.hpp>
11 #include <boost/iterator/iterator_adaptor.hpp>
12 
13 namespace boost {
14 namespace iterators {
15 
16   //
17   //
18   //
19   template <class Iterator>
20   class reverse_iterator
21       : public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
22   {
23       typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
24 
25       friend class iterator_core_access;
26 
27    public:
reverse_iterator()28       reverse_iterator() {}
29 
reverse_iterator(Iterator x)30       explicit reverse_iterator(Iterator x)
31           : super_t(x) {}
32 
33       template<class OtherIterator>
reverse_iterator(reverse_iterator<OtherIterator> const & r,typename enable_if_convertible<OtherIterator,Iterator>::type * =0)34       reverse_iterator(
35           reverse_iterator<OtherIterator> const& r
36           , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
37           )
38           : super_t(r.base())
39       {}
40 
41    private:
dereference() const42       typename super_t::reference dereference() const
43       {
44           Iterator it = this->base_reference();
45           --it;
46           return *it;
47       }
48 
increment()49       void increment() { --this->base_reference(); }
decrement()50       void decrement() { ++this->base_reference(); }
51 
advance(typename super_t::difference_type n)52       void advance(typename super_t::difference_type n)
53       {
54           this->base_reference() -= n;
55       }
56 
57       template <class OtherIterator>
58       typename super_t::difference_type
distance_to(reverse_iterator<OtherIterator> const & y) const59       distance_to(reverse_iterator<OtherIterator> const& y) const
60       {
61           return this->base_reference() - y.base();
62       }
63   };
64 
65   template <class BidirectionalIterator>
make_reverse_iterator(BidirectionalIterator x)66   inline reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
67   {
68       return reverse_iterator<BidirectionalIterator>(x);
69   }
70 
71 } // namespace iterators
72 
73 using iterators::reverse_iterator;
74 using iterators::make_reverse_iterator;
75 
76 } // namespace boost
77 
78 #endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP
79