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
13namespace boost {
14namespace 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:
28 reverse_iterator() {}
29
30 explicit reverse_iterator(Iterator x)
31 : super_t(x) {}
32
33 template<class OtherIterator>
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:
42 typename super_t::reference dereference() const
43 {
44 Iterator it = this->base_reference();
45 --it;
46 return *it;
47 }
48
49 void increment() { --this->base_reference(); }
50 void decrement() { ++this->base_reference(); }
51
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
59 distance_to(reverse_iterator<OtherIterator> const& y) const
60 {
61 return this->base_reference() - y.base();
62 }
63 };
64
65 template <class BidirectionalIterator>
66 inline reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
67 {
68 return reverse_iterator<BidirectionalIterator>(x);
69 }
70
71} // namespace iterators
72
73using iterators::reverse_iterator;
74using iterators::make_reverse_iterator;
75
76} // namespace boost
77
78#endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP
79