Line data Source code
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_ITERATOR_REVERSE_ITERATOR_23022003THW_HPP 8 : #define BOOST_ITERATOR_REVERSE_ITERATOR_23022003THW_HPP 9 : 10 : #include <boost/iterator/iterator_adaptor.hpp> 11 : #include <boost/iterator/enable_if_convertible.hpp> 12 : 13 : namespace boost { 14 : namespace iterators { 15 : 16 : template< typename Iterator > 17 : class reverse_iterator : 18 : public iterator_adaptor< reverse_iterator< Iterator >, Iterator > 19 : { 20 : friend class iterator_core_access; 21 : 22 : private: 23 : using super_t = iterator_adaptor< reverse_iterator< Iterator >, Iterator >; 24 : 25 : public: 26 : reverse_iterator() = default; 27 : 28 81522 : explicit reverse_iterator(Iterator x) : 29 40761 : super_t(x) 30 81522 : {} 31 : 32 : template< 33 : typename OtherIterator, 34 : typename = enable_if_convertible_t< OtherIterator, Iterator > 35 : > 36 : reverse_iterator(reverse_iterator< OtherIterator > const& r) : 37 : super_t(r.base()) 38 : {} 39 : 40 : private: 41 61040 : typename super_t::reference dereference() const 42 : { 43 61040 : Iterator it = this->base_reference(); 44 61040 : --it; 45 61040 : return *it; 46 : } 47 : 48 27799 : void increment() { --this->base_reference(); } 49 : void decrement() { ++this->base_reference(); } 50 : 51 : void advance(typename super_t::difference_type n) 52 : { 53 : this->base_reference() -= n; 54 : } 55 : 56 : template< typename OtherIterator > 57 : typename super_t::difference_type distance_to(reverse_iterator< OtherIterator > const& y) const 58 : { 59 : return this->base_reference() - y.base(); 60 : } 61 : }; 62 : 63 : template< typename Iterator > 64 40761 : inline reverse_iterator< Iterator > make_reverse_iterator(Iterator x) 65 : { 66 40761 : return reverse_iterator< Iterator >(x); 67 : } 68 : 69 : } // namespace iterators 70 : 71 : using iterators::reverse_iterator; 72 : using iterators::make_reverse_iterator; 73 : 74 : } // namespace boost 75 : 76 : #endif // BOOST_ITERATOR_REVERSE_ITERATOR_23022003THW_HPP