iterator_adaptor_ref.rst 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. .. Distributed under the Boost
  2. .. Software License, Version 1.0. (See accompanying
  3. .. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. .. Version 1.4 of this ReStructuredText document corresponds to
  5. n1530_, the paper accepted by the LWG for TR1.
  6. .. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
  7. .. parsed-literal::
  8. template <
  9. class Derived
  10. , class Base
  11. , class Value = use_default
  12. , class CategoryOrTraversal = use_default
  13. , class Reference = use_default
  14. , class Difference = use_default
  15. >
  16. class iterator_adaptor
  17. : public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details__
  18. {
  19. friend class iterator_core_access;
  20. public:
  21. iterator_adaptor();
  22. explicit iterator_adaptor(Base const& iter);
  23. typedef Base base_type;
  24. Base const& base() const;
  25. protected:
  26. typedef iterator_adaptor iterator_adaptor\_;
  27. Base const& base_reference() const;
  28. Base& base_reference();
  29. private: // Core iterator interface for iterator_facade.
  30. typename iterator_adaptor::reference dereference() const;
  31. template <
  32. class OtherDerived, class OtherIterator, class V, class C, class R, class D
  33. >
  34. bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
  35. void advance(typename iterator_adaptor::difference_type n);
  36. void increment();
  37. void decrement();
  38. template <
  39. class OtherDerived, class OtherIterator, class V, class C, class R, class D
  40. >
  41. typename iterator_adaptor::difference_type distance_to(
  42. iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
  43. private:
  44. Base m_iterator; // exposition only
  45. };
  46. __ base_parameters_
  47. .. _requirements:
  48. ``iterator_adaptor`` requirements
  49. ---------------------------------
  50. ``static_cast<Derived*>(iterator_adaptor*)`` shall be well-formed.
  51. The ``Base`` argument shall be Assignable and Copy Constructible.
  52. .. _base_parameters:
  53. ``iterator_adaptor`` base class parameters
  54. ------------------------------------------
  55. The *V'*, *C'*, *R'*, and *D'* parameters of the ``iterator_facade``
  56. used as a base class in the summary of ``iterator_adaptor``
  57. above are defined as follows:
  58. .. parsed-literal::
  59. *V'* = if (Value is use_default)
  60. return iterator_traits<Base>::value_type
  61. else
  62. return Value
  63. *C'* = if (CategoryOrTraversal is use_default)
  64. return iterator_traversal<Base>::type
  65. else
  66. return CategoryOrTraversal
  67. *R'* = if (Reference is use_default)
  68. if (Value is use_default)
  69. return iterator_traits<Base>::reference
  70. else
  71. return Value&
  72. else
  73. return Reference
  74. *D'* = if (Difference is use_default)
  75. return iterator_traits<Base>::difference_type
  76. else
  77. return Difference
  78. .. ``iterator_adaptor`` models
  79. ---------------------------
  80. In order for ``Derived`` to model the iterator concepts corresponding
  81. to ``iterator_traits<Derived>::iterator_category``, the expressions
  82. involving ``m_iterator`` in the specifications of those private member
  83. functions of ``iterator_adaptor`` that may be called by
  84. ``iterator_facade<Derived, V, C, R, D>`` in evaluating any valid
  85. expression involving ``Derived`` in those concepts' requirements.
  86. .. The above is confusing and needs a rewrite. -JGS
  87. .. That's why it's removed. We're embracing inheritance, remember?
  88. ``iterator_adaptor`` public operations
  89. --------------------------------------
  90. ``iterator_adaptor();``
  91. :Requires: The ``Base`` type must be Default Constructible.
  92. :Returns: An instance of ``iterator_adaptor`` with
  93. ``m_iterator`` default constructed.
  94. ``explicit iterator_adaptor(Base const& iter);``
  95. :Returns: An instance of ``iterator_adaptor`` with
  96. ``m_iterator`` copy constructed from ``iter``.
  97. ``Base const& base() const;``
  98. :Returns: ``m_iterator``
  99. ``iterator_adaptor`` protected member functions
  100. -----------------------------------------------
  101. ``Base const& base_reference() const;``
  102. :Returns: A const reference to ``m_iterator``.
  103. ``Base& base_reference();``
  104. :Returns: A non-const reference to ``m_iterator``.
  105. ``iterator_adaptor`` private member functions
  106. ---------------------------------------------
  107. ``typename iterator_adaptor::reference dereference() const;``
  108. :Returns: ``*m_iterator``
  109. ::
  110. template <
  111. class OtherDerived, class OtherIterator, class V, class C, class R, class D
  112. >
  113. bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
  114. :Returns: ``m_iterator == x.base()``
  115. ``void advance(typename iterator_adaptor::difference_type n);``
  116. :Effects: ``m_iterator += n;``
  117. ``void increment();``
  118. :Effects: ``++m_iterator;``
  119. ``void decrement();``
  120. :Effects: ``--m_iterator;``
  121. ::
  122. template <
  123. class OtherDerived, class OtherIterator, class V, class C, class R, class D
  124. >
  125. typename iterator_adaptor::difference_type distance_to(
  126. iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
  127. :Returns: ``y.base() - m_iterator``