Chris@16
|
1 // (C) Copyright David Abrahams 2002.
|
Chris@16
|
2 // (C) Copyright Jeremy Siek 2002.
|
Chris@16
|
3 // (C) Copyright Thomas Witt 2002.
|
Chris@16
|
4 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
5 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 #ifndef BOOST_REVERSE_ITERATOR_23022003THW_HPP
|
Chris@16
|
8 #define BOOST_REVERSE_ITERATOR_23022003THW_HPP
|
Chris@16
|
9
|
Chris@16
|
10 #include <boost/next_prior.hpp>
|
Chris@16
|
11 #include <boost/iterator.hpp>
|
Chris@16
|
12 #include <boost/iterator/iterator_adaptor.hpp>
|
Chris@16
|
13
|
Chris@101
|
14 namespace boost {
|
Chris@101
|
15 namespace iterators {
|
Chris@16
|
16
|
Chris@16
|
17 //
|
Chris@16
|
18 //
|
Chris@16
|
19 //
|
Chris@16
|
20 template <class Iterator>
|
Chris@16
|
21 class reverse_iterator
|
Chris@16
|
22 : public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
|
Chris@16
|
23 {
|
Chris@16
|
24 typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
|
Chris@16
|
25
|
Chris@16
|
26 friend class iterator_core_access;
|
Chris@16
|
27
|
Chris@16
|
28 public:
|
Chris@16
|
29 reverse_iterator() {}
|
Chris@16
|
30
|
Chris@101
|
31 explicit reverse_iterator(Iterator x)
|
Chris@16
|
32 : super_t(x) {}
|
Chris@16
|
33
|
Chris@16
|
34 template<class OtherIterator>
|
Chris@16
|
35 reverse_iterator(
|
Chris@16
|
36 reverse_iterator<OtherIterator> const& r
|
Chris@16
|
37 , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
|
Chris@16
|
38 )
|
Chris@16
|
39 : super_t(r.base())
|
Chris@16
|
40 {}
|
Chris@16
|
41
|
Chris@16
|
42 private:
|
Chris@16
|
43 typename super_t::reference dereference() const { return *boost::prior(this->base()); }
|
Chris@101
|
44
|
Chris@16
|
45 void increment() { --this->base_reference(); }
|
Chris@16
|
46 void decrement() { ++this->base_reference(); }
|
Chris@16
|
47
|
Chris@16
|
48 void advance(typename super_t::difference_type n)
|
Chris@16
|
49 {
|
Chris@16
|
50 this->base_reference() += -n;
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 template <class OtherIterator>
|
Chris@16
|
54 typename super_t::difference_type
|
Chris@16
|
55 distance_to(reverse_iterator<OtherIterator> const& y) const
|
Chris@16
|
56 {
|
Chris@16
|
57 return this->base_reference() - y.base();
|
Chris@16
|
58 }
|
Chris@16
|
59 };
|
Chris@16
|
60
|
Chris@16
|
61 template <class BidirectionalIterator>
|
Chris@101
|
62 inline reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
|
Chris@16
|
63 {
|
Chris@16
|
64 return reverse_iterator<BidirectionalIterator>(x);
|
Chris@16
|
65 }
|
Chris@16
|
66
|
Chris@101
|
67 } // namespace iterators
|
Chris@101
|
68
|
Chris@101
|
69 using iterators::reverse_iterator;
|
Chris@101
|
70 using iterators::make_reverse_iterator;
|
Chris@101
|
71
|
Chris@16
|
72 } // namespace boost
|
Chris@16
|
73
|
Chris@16
|
74 #endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP
|