epoc32/include/stdapis/boost/iterator/reverse_iterator.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     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