diff --git a/doc/reverse_iterator.html b/doc/reverse_iterator.html
index ac3ceaf..59349ae 100644
--- a/doc/reverse_iterator.html
+++ b/doc/reverse_iterator.html
@@ -3,13 +3,13 @@
@@ -47,15 +47,19 @@ invoking
operator--() moves th
+
+
template <class Iterator>
-class reverse_iterator :
- public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
+class reverse_iterator
{
- friend class iterator_core_access;
public:
reverse_iterator() {}
explicit reverse_iterator(Iterator x) ;
@@ -65,33 +69,49 @@ public:
reverse_iterator<OtherIterator> const& r
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
-
-private: // as-if specification
- typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
-
- void increment() { --this->base_reference(); }
- void decrement() { ++this->base_reference(); }
-
- void advance(typename reverse_iterator::difference_type n)
- {
- this->base_reference() += -n;
- }
-
- template <class OtherIterator>
- typename reverse_iterator::difference_type
- distance_to(reverse_iterator<OtherIterator> const& y) const
- {
- return this->base_reference() - y.base();
- }
-
+ reference operator*() const;
+ reverse_iterator& operator++();
+private:
+ Iterator current; // exposition
};
+
-
+
The base Iterator must be a model of Bidirectional Traversal
-Iterator. The resulting reverse_iterator will be a model of the
-most refined standard traversal and access concepts that are modeled
-by Iterator.
+Iterator and Readable Iterator.
+
+
+
+
reverse_iterator models Bidirectional Traversal Iterator and
+Readable Iterator. In addition, reverse_iterator models the same
+standard iterator access concepts (if any) that the Iterator
+argument models. Also, reverse_iterator models concepts
+according to the following table.
+
+
+
+
+
+
+If Iterator models |
+then reverse_iterator models |
+
+
+
+Bidirectional Iterator |
+Bidirectional Iterator, Readable Lvalue Iterator,
+Bidirectional Traversal Iterator |
+
+Mutable Bidirectional Iterator |
+Mutable Bidirectional Iterator, Writable Lvalue Iterator,
+Bidirectional Traversal Iterator |
+
+
+
+
+
+
reverse_iterator();
@@ -99,8 +119,8 @@ by Iterator.
Requires: | Iterator must be Default Constructible. |
-Returns: | An instance of reverse_iterator with a
-default constructed base object. |
+
---|
Returns: | An instance of reverse_iterator with current
+default constructed. |
@@ -110,7 +130,7 @@ default constructed base object.
Returns: | An instance of reverse_iterator with a
-base object copy constructed from x. |
+current constructed from x.
@@ -131,13 +151,57 @@ reverse_iterator(
+
reference operator*() const;
+
+
+Iterator tmp = current;
+return *--tmp;
+
+
reverse_iterator& operator++();
+
+
+
+
+Effects: | --current |
+
+Returns: | *this |
+
+
+
+
+
+
The following example prints an array of characters in reverse order
+using reverse_iterator.
+
+char letters_[] = "hello world!";
+const int N = sizeof(letters_)/sizeof(char) - 1;
+typedef char* base_iterator;
+base_iterator letters(letters_);
+std::cout << "original sequence of letters:\t" << letters_ << std::endl;
+
+boost::reverse_iterator<base_iterator>
+ reverse_letters_first(letters + N),
+ reverse_letters_last(letters);
+
+std::cout << "sequence in reverse order:\t";
+std::copy(reverse_letters_first, reverse_letters_last,
+ std::ostream_iterator<char>(std::cout));
+std::cout << std::endl;
+
+
The output is:
+
+original sequence of letters: hello world!
+sequence in reverse order: !dlrow olleh
+
-
-
diff --git a/doc/reverse_iterator.rst b/doc/reverse_iterator.rst
index 5265076..83d1e49 100644
--- a/doc/reverse_iterator.rst
+++ b/doc/reverse_iterator.rst
@@ -20,4 +20,9 @@
.. contents:: Table of Contents
+``reverse_iterator`` synopsis
+-----------------------------
+
.. include:: reverse_iterator_ref.rst
+
+.. include:: reverse_iterator_eg.rst
diff --git a/doc/reverse_iterator_ref.rst b/doc/reverse_iterator_ref.rst
index c0acc2b..e8e8d2b 100644
--- a/doc/reverse_iterator_ref.rst
+++ b/doc/reverse_iterator_ref.rst
@@ -1,10 +1,8 @@
::
template
- class reverse_iterator :
- public iterator_adaptor< reverse_iterator, Iterator >
+ class reverse_iterator
{
- friend class iterator_core_access;
public:
reverse_iterator() {}
explicit reverse_iterator(Iterator x) ;
@@ -14,47 +12,54 @@
reverse_iterator const& r
, typename enable_if_convertible::type* = 0 // exposition
);
-
- private: // as-if specification
- typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
-
- void increment() { --this->base_reference(); }
- void decrement() { ++this->base_reference(); }
-
- void advance(typename reverse_iterator::difference_type n)
- {
- this->base_reference() += -n;
- }
-
- template
- typename reverse_iterator::difference_type
- distance_to(reverse_iterator const& y) const
- {
- return this->base_reference() - y.base();
- }
-
+ reference operator*() const;
+ reverse_iterator& operator++();
+ private:
+ Iterator current; // exposition
};
``reverse_iterator`` requirements
-.................................
+---------------------------------
The base ``Iterator`` must be a model of Bidirectional Traversal
-Iterator. The resulting ``reverse_iterator`` will be a model of the
-most refined standard traversal and access concepts that are modeled
-by ``Iterator``.
+Iterator and Readable Iterator.
+``reverse_iterator`` models
+---------------------------
+
+``reverse_iterator`` models Bidirectional Traversal Iterator and
+Readable Iterator. In addition, ``reverse_iterator`` models the same
+standard iterator access concepts (if any) that the ``Iterator``
+argument models. Also, ``reverse_iterator`` models concepts
+according to the following table.
+
++--------------------------------+-----------------------------------------------------------+
+| If ``Iterator`` models | then ``reverse_iterator`` models |
++================================+===========================================================+
+| Bidirectional Iterator | Bidirectional Iterator, Readable Lvalue Iterator, |
+| | Bidirectional Traversal Iterator |
++--------------------------------+-----------------------------------------------------------+
+| Mutable Bidirectional Iterator | Mutable Bidirectional Iterator, Writable Lvalue Iterator, |
+| | Bidirectional Traversal Iterator |
++--------------------------------+-----------------------------------------------------------+
+
+
+
+``reverse_iterator`` operations
+-------------------------------
+
``reverse_iterator();``
:Requires: ``Iterator`` must be Default Constructible.
-:Returns: An instance of ``reverse_iterator`` with a
- default constructed base object.
+:Returns: An instance of ``reverse_iterator`` with ``current``
+ default constructed.
``explicit reverse_iterator(Iterator x);``
:Returns: An instance of ``reverse_iterator`` with a
- base object copy constructed from ``x``.
+ ``current`` constructed from ``x``.
::
@@ -67,3 +72,19 @@ by ``Iterator``.
:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``.
:Returns: An instance of ``reverse_iterator`` that is a copy of ``r``.
+
+
+``reference operator*() const;``
+
+:Effects:
+
+::
+
+ Iterator tmp = current;
+ return *--tmp;
+
+
+``reverse_iterator& operator++();``
+
+:Effects: ``--current``
+:Returns: ``*this``