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