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/next_prior.hpp> 11 #include <boost/iterator.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: reverse_iterator()29 reverse_iterator() {} 30 reverse_iterator(Iterator x)31 explicit reverse_iterator(Iterator x) 32 : super_t(x) {} 33 34 template<class OtherIterator> reverse_iterator(reverse_iterator<OtherIterator> const & r,typename enable_if_convertible<OtherIterator,Iterator>::type * =0)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: dereference() const43 typename super_t::reference dereference() const { return *boost::prior(this->base()); } 44 increment()45 void increment() { --this->base_reference(); } decrement()46 void decrement() { ++this->base_reference(); } 47 advance(typename super_t::difference_type n)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 distance_to(reverse_iterator<OtherIterator> const & y) const55 distance_to(reverse_iterator<OtherIterator> const& y) const 56 { 57 return this->base_reference() - y.base(); 58 } 59 }; 60 61 template <class BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)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 70