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