123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- .. Copyright David Abrahams 2006. Distributed under the Boost
- .. Software License, Version 1.0. (See accompanying
- .. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ::
- template <class Iterator>
- class reverse_iterator
- {
- public:
- typedef iterator_traits<Iterator>::value_type value_type;
- typedef iterator_traits<Iterator>::reference reference;
- typedef iterator_traits<Iterator>::pointer pointer;
- typedef iterator_traits<Iterator>::difference_type difference_type;
- typedef /* see below */ iterator_category;
- reverse_iterator() {}
- explicit reverse_iterator(Iterator x) ;
- template<class OtherIterator>
- reverse_iterator(
- reverse_iterator<OtherIterator> const& r
- , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
- );
- Iterator const& base() const;
- reference operator*() const;
- reverse_iterator& operator++();
- reverse_iterator& operator--();
- private:
- Iterator m_iterator; // exposition
- };
- If ``Iterator`` models Random Access Traversal Iterator and Readable
- Lvalue Iterator, then ``iterator_category`` is convertible to
- ``random_access_iterator_tag``. Otherwise, if
- ``Iterator`` models Bidirectional Traversal Iterator and Readable
- Lvalue Iterator, then ``iterator_category`` is convertible to
- ``bidirectional_iterator_tag``. Otherwise, ``iterator_category`` is
- convertible to ``input_iterator_tag``.
- ``reverse_iterator`` requirements
- .................................
- ``Iterator`` must be a model of Bidirectional Traversal Iterator. The
- type ``iterator_traits<Iterator>::reference`` must be the type of
- ``*i``, where ``i`` is an object of type ``Iterator``.
- ``reverse_iterator`` models
- ...........................
- A specialization of ``reverse_iterator`` models the same iterator
- traversal and iterator access concepts modeled by its ``Iterator``
- argument. In addition, it may model old iterator concepts
- specified in the following table:
- +---------------------------------------+-----------------------------------+
- | If ``I`` models |then ``reverse_iterator<I>`` models|
- +=======================================+===================================+
- | Readable Lvalue Iterator, | Bidirectional Iterator |
- | Bidirectional Traversal Iterator | |
- +---------------------------------------+-----------------------------------+
- | Writable Lvalue Iterator, | Mutable Bidirectional Iterator |
- | Bidirectional Traversal Iterator | |
- +---------------------------------------+-----------------------------------+
- | Readable Lvalue Iterator, | Random Access Iterator |
- | Random Access Traversal Iterator | |
- +---------------------------------------+-----------------------------------+
- | Writable Lvalue Iterator, | Mutable Random Access Iterator |
- | Random Access Traversal Iterator | |
- +---------------------------------------+-----------------------------------+
- ``reverse_iterator<X>`` is interoperable with
- ``reverse_iterator<Y>`` if and only if ``X`` is interoperable with
- ``Y``.
- ``reverse_iterator`` operations
- ...............................
- In addition to the operations required by the concepts modeled by
- ``reverse_iterator``, ``reverse_iterator`` provides the following
- operations.
- ``reverse_iterator();``
- :Requires: ``Iterator`` must be Default Constructible.
- :Effects: Constructs an instance of ``reverse_iterator`` with ``m_iterator``
- default constructed.
- ``explicit reverse_iterator(Iterator x);``
- :Effects: Constructs an instance of ``reverse_iterator`` with
- ``m_iterator`` copy constructed from ``x``.
- ::
- template<class OtherIterator>
- reverse_iterator(
- reverse_iterator<OtherIterator> const& r
- , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
- );
- :Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``.
- :Effects: Constructs instance of ``reverse_iterator`` whose
- ``m_iterator`` subobject is constructed from ``y.base()``.
- ``Iterator const& base() const;``
- :Returns: ``m_iterator``
- ``reference operator*() const;``
- :Effects:
- ::
- Iterator tmp = m_iterator;
- return *--tmp;
- ``reverse_iterator& operator++();``
- :Effects: ``--m_iterator``
- :Returns: ``*this``
- ``reverse_iterator& operator--();``
- :Effects: ``++m_iterator``
- :Returns: ``*this``
|