Ugly, not-to-be-pushed sucking in of all of Boost to get windows to work.
[dyninst.git] / external / boost / iterator / reverse_iterator.hpp
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