indirect_iterator_ref.rst 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. .. Copyright David Abrahams 2006. 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. ::
  5. template <
  6. class Iterator
  7. , class Value = use_default
  8. , class CategoryOrTraversal = use_default
  9. , class Reference = use_default
  10. , class Difference = use_default
  11. >
  12. class indirect_iterator
  13. {
  14. public:
  15. typedef /* see below */ value_type;
  16. typedef /* see below */ reference;
  17. typedef /* see below */ pointer;
  18. typedef /* see below */ difference_type;
  19. typedef /* see below */ iterator_category;
  20. indirect_iterator();
  21. indirect_iterator(Iterator x);
  22. template <
  23. class Iterator2, class Value2, class Category2
  24. , class Reference2, class Difference2
  25. >
  26. indirect_iterator(
  27. indirect_iterator<
  28. Iterator2, Value2, Category2, Reference2, Difference2
  29. > const& y
  30. , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
  31. );
  32. Iterator const& base() const;
  33. reference operator*() const;
  34. indirect_iterator& operator++();
  35. indirect_iterator& operator--();
  36. private:
  37. Iterator m_iterator; // exposition
  38. };
  39. The member types of ``indirect_iterator`` are defined according to
  40. the following pseudo-code, where ``V`` is
  41. ``iterator_traits<Iterator>::value_type``
  42. .. parsed-literal::
  43. if (Value is use_default) then
  44. typedef remove_const<pointee<V>::type>::type value_type;
  45. else
  46. typedef remove_const<Value>::type value_type;
  47. if (Reference is use_default) then
  48. if (Value is use_default) then
  49. typedef indirect_reference<V>::type reference;
  50. else
  51. typedef Value& reference;
  52. else
  53. typedef Reference reference;
  54. if (Value is use_default) then
  55. typedef pointee<V>::type\* pointer;
  56. else
  57. typedef Value\* pointer;
  58. if (Difference is use_default)
  59. typedef iterator_traits<Iterator>::difference_type difference_type;
  60. else
  61. typedef Difference difference_type;
  62. if (CategoryOrTraversal is use_default)
  63. typedef *iterator-category* (
  64. iterator_traversal<Iterator>::type,``reference``,``value_type``
  65. ) iterator_category;
  66. else
  67. typedef *iterator-category* (
  68. CategoryOrTraversal,``reference``,``value_type``
  69. ) iterator_category;
  70. ``indirect_iterator`` requirements
  71. ..................................
  72. The expression ``*v``, where ``v`` is an object of
  73. ``iterator_traits<Iterator>::value_type``, shall be valid
  74. expression and convertible to ``reference``. ``Iterator`` shall
  75. model the traversal concept indicated by ``iterator_category``.
  76. ``Value``, ``Reference``, and ``Difference`` shall be chosen so
  77. that ``value_type``, ``reference``, and ``difference_type`` meet
  78. the requirements indicated by ``iterator_category``.
  79. [Note: there are further requirements on the
  80. ``iterator_traits<Iterator>::value_type`` if the ``Value``
  81. parameter is not ``use_default``, as implied by the algorithm for
  82. deducing the default for the ``value_type`` member.]
  83. ``indirect_iterator`` models
  84. ............................
  85. In addition to the concepts indicated by ``iterator_category``
  86. and by ``iterator_traversal<indirect_iterator>::type``, a
  87. specialization of ``indirect_iterator`` models the following
  88. concepts, Where ``v`` is an object of
  89. ``iterator_traits<Iterator>::value_type``:
  90. * Readable Iterator if ``reference(*v)`` is convertible to
  91. ``value_type``.
  92. * Writable Iterator if ``reference(*v) = t`` is a valid
  93. expression (where ``t`` is an object of type
  94. ``indirect_iterator::value_type``)
  95. * Lvalue Iterator if ``reference`` is a reference type.
  96. ``indirect_iterator<X,V1,C1,R1,D1>`` is interoperable with
  97. ``indirect_iterator<Y,V2,C2,R2,D2>`` if and only if ``X`` is
  98. interoperable with ``Y``.
  99. ``indirect_iterator`` operations
  100. ................................
  101. In addition to the operations required by the concepts described
  102. above, specializations of ``indirect_iterator`` provide the
  103. following operations.
  104. ``indirect_iterator();``
  105. :Requires: ``Iterator`` must be Default Constructible.
  106. :Effects: Constructs an instance of ``indirect_iterator`` with
  107. a default-constructed ``m_iterator``.
  108. ``indirect_iterator(Iterator x);``
  109. :Effects: Constructs an instance of ``indirect_iterator`` with
  110. ``m_iterator`` copy constructed from ``x``.
  111. ::
  112. template <
  113. class Iterator2, class Value2, unsigned Access, class Traversal
  114. , class Reference2, class Difference2
  115. >
  116. indirect_iterator(
  117. indirect_iterator<
  118. Iterator2, Value2, Access, Traversal, Reference2, Difference2
  119. > const& y
  120. , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
  121. );
  122. :Requires: ``Iterator2`` is implicitly convertible to ``Iterator``.
  123. :Effects: Constructs an instance of ``indirect_iterator`` whose
  124. ``m_iterator`` subobject is constructed from ``y.base()``.
  125. ``Iterator const& base() const;``
  126. :Returns: ``m_iterator``
  127. ``reference operator*() const;``
  128. :Returns: ``**m_iterator``
  129. ``indirect_iterator& operator++();``
  130. :Effects: ``++m_iterator``
  131. :Returns: ``*this``
  132. ``indirect_iterator& operator--();``
  133. :Effects: ``--m_iterator``
  134. :Returns: ``*this``