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 @@ - + Reverse Iterator - +
@@ -47,15 +47,19 @@ invoking operator--() moves th

Table of Contents

+
+

reverse_iterator synopsis

 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
 };
 
+
-

reverse_iterator requirements

+

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 modelsthen reverse_iterator models
Bidirectional IteratorBidirectional Iterator, Readable Lvalue Iterator, +Bidirectional Traversal Iterator
Mutable Bidirectional IteratorMutable Bidirectional Iterator, Writable Lvalue Iterator, +Bidirectional Traversal Iterator
+
+
+

reverse_iterator operations

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;

+ +++ + + + +
Effects:
+
+Iterator tmp = current;
+return *--tmp;
+
+

reverse_iterator& operator++();

+ +++ + + + + + +
Effects:--current
Returns:*this
+
+

Example

+

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``