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