2003-08-05 19:42:37 +00:00
|
|
|
::
|
|
|
|
|
|
|
|
template <
|
|
|
|
class Iterator
|
|
|
|
, class Value = use_default
|
2003-12-16 22:10:51 +00:00
|
|
|
, class CategoryOrTraversal = use_default
|
2003-08-05 19:42:37 +00:00
|
|
|
, class Reference = use_default
|
|
|
|
, class Difference = use_default
|
|
|
|
>
|
|
|
|
class indirect_iterator
|
|
|
|
{
|
|
|
|
public:
|
2004-01-04 04:29:50 +00:00
|
|
|
typedef /* see below */ value_type;
|
|
|
|
typedef /* see below */ reference;
|
|
|
|
typedef /* see below */ pointer;
|
|
|
|
typedef /* see below */ difference_type;
|
|
|
|
typedef /* see below */ iterator_category;
|
|
|
|
|
2003-08-05 19:42:37 +00:00
|
|
|
indirect_iterator();
|
|
|
|
indirect_iterator(Iterator x);
|
2003-12-16 22:10:51 +00:00
|
|
|
|
2003-08-05 19:42:37 +00:00
|
|
|
template <
|
2003-12-16 22:10:51 +00:00
|
|
|
class Iterator2, class Value2, class Category2
|
2003-08-05 19:42:37 +00:00
|
|
|
, class Reference2, class Difference2
|
|
|
|
>
|
|
|
|
indirect_iterator(
|
|
|
|
indirect_iterator<
|
2003-12-16 22:10:51 +00:00
|
|
|
Iterator2, Value2, Category2, Reference2, Difference2
|
2003-08-05 19:42:37 +00:00
|
|
|
> const& y
|
|
|
|
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
|
|
|
);
|
2004-01-12 04:17:26 +00:00
|
|
|
|
|
|
|
Iterator base() const;
|
2004-01-12 15:53:04 +00:00
|
|
|
reference operator*() const;
|
|
|
|
indirect_iterator& operator++();
|
|
|
|
indirect_iterator& operator--();
|
2004-01-12 04:17:26 +00:00
|
|
|
private:
|
|
|
|
Iterator m_iterator; // exposition
|
2003-08-05 19:42:37 +00:00
|
|
|
};
|
|
|
|
|
2003-12-16 22:10:51 +00:00
|
|
|
|
2004-01-04 04:29:50 +00:00
|
|
|
The member types of ``indirect_iterator`` are defined according to the
|
|
|
|
following pseudo-code. We use the abbreviation
|
2004-01-04 18:17:32 +00:00
|
|
|
``V=iterator_traits<Iterator>::value_type``.::
|
2003-08-05 19:42:37 +00:00
|
|
|
|
2004-01-04 04:29:50 +00:00
|
|
|
if (Value is use_default) then
|
2004-01-04 18:17:32 +00:00
|
|
|
typedef iterator_traits<V>::value_type value_type;
|
2004-01-04 04:29:50 +00:00
|
|
|
else
|
|
|
|
typedef remove_const<Value>::type value_type;
|
|
|
|
|
|
|
|
if (Reference is use_default) then
|
2004-01-04 18:44:29 +00:00
|
|
|
if (Value is use_default) then
|
|
|
|
typedef iterator_traits<V>::reference reference;
|
|
|
|
else
|
|
|
|
typedef Value& reference;
|
2004-01-04 04:29:50 +00:00
|
|
|
else
|
|
|
|
typedef Reference reference;
|
|
|
|
|
|
|
|
if (Value is use_default) then
|
2004-01-04 18:44:29 +00:00
|
|
|
typedef ?? pointer;
|
2004-01-04 04:29:50 +00:00
|
|
|
else
|
|
|
|
typedef Value* pointer;
|
|
|
|
|
|
|
|
if (Difference is use_default)
|
|
|
|
typedef iterator_traits<Iterator>::difference_type difference_type;
|
|
|
|
else
|
|
|
|
typedef Difference difference_type;
|
|
|
|
|
|
|
|
|
2004-01-12 19:01:57 +00:00
|
|
|
The member ``iterator_category`` is a type that satisfies the
|
|
|
|
requirements of the concepts modeled by the ``indirect_iterator`` as
|
|
|
|
specified in the models section.
|
2003-08-05 19:42:37 +00:00
|
|
|
|
|
|
|
|
2003-12-17 19:32:31 +00:00
|
|
|
``indirect_iterator`` requirements
|
|
|
|
..................................
|
|
|
|
|
2004-01-04 18:17:32 +00:00
|
|
|
The ``Iterator`` argument shall meet the requirements of Readable
|
|
|
|
Iterator. The ``CategoryOrTraversal`` argument shall be one of the
|
|
|
|
standard iterator tags or ``use_default``. If ``CategoryOrTraversal``
|
|
|
|
is an iterator tag, the template parameter ``Iterator`` argument shall
|
|
|
|
meet the traversal requirements corresponding to the iterator tag.
|
2003-12-19 16:47:47 +00:00
|
|
|
|
2003-12-19 21:20:36 +00:00
|
|
|
The expression ``*v``, where ``v`` is an object of type
|
2003-12-19 16:47:47 +00:00
|
|
|
``iterator_traits<Iterator>::value_type``, must be a valid expression
|
2004-01-04 18:17:32 +00:00
|
|
|
and must be convertible to ``indirect_iterator::reference``. Also
|
|
|
|
``indirect_iterator::reference`` must be convertible to
|
|
|
|
``indirect_iterator::value``. There are further requirements on the
|
2003-12-19 16:47:47 +00:00
|
|
|
``iterator_traits<Iterator>::value_type`` if the ``Value`` parameter
|
|
|
|
is not ``use_default``, as implied by the algorithm for deducing the
|
2004-01-04 04:29:50 +00:00
|
|
|
default for the ``value_type`` member.
|
2003-08-05 19:42:37 +00:00
|
|
|
|
|
|
|
|
2004-01-04 18:17:32 +00:00
|
|
|
``indirect_iterator`` models
|
|
|
|
............................
|
|
|
|
|
|
|
|
If ``CategoryOrTraversal`` is a standard iterator tag,
|
|
|
|
``indirect_iterator`` is a model of the iterator concept corresponding
|
|
|
|
to the tag, otherwise ``indirect_iterator`` satisfies the requirements
|
|
|
|
of the most refined standard traversal concept that is satisfied by
|
|
|
|
the ``Iterator`` argument.
|
|
|
|
|
|
|
|
``indirect_iterator`` models Readable Iterator. If
|
|
|
|
``indirect_iterator::reference(*v) = t`` is a valid expression (where
|
|
|
|
``t`` is an object of type ``indirect_iterator::value_type``) then
|
|
|
|
``indirect_iterator`` models Writable Iterator. If
|
|
|
|
``indirect_iterator::reference`` is a reference then
|
|
|
|
``indirect_iterator`` models Lvalue Iterator.
|
|
|
|
|
2003-08-05 19:42:37 +00:00
|
|
|
|
|
|
|
``indirect_iterator`` operations
|
|
|
|
................................
|
|
|
|
|
2004-01-12 15:53:04 +00:00
|
|
|
In addition to the operations required by the concepts modeled by
|
|
|
|
``indirect_iterator``, ``indirect_iterator`` provides the following
|
|
|
|
operations.
|
|
|
|
|
|
|
|
|
2003-08-05 19:42:37 +00:00
|
|
|
``indirect_iterator();``
|
|
|
|
|
|
|
|
:Requires: ``Iterator`` must be Default Constructible.
|
2003-12-16 22:10:51 +00:00
|
|
|
:Returns: An instance of ``indirect_iterator`` with
|
2004-01-12 04:17:26 +00:00
|
|
|
a default-constructed ``m_iterator``.
|
2003-08-05 19:42:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
``indirect_iterator(Iterator x);``
|
|
|
|
|
|
|
|
:Returns: An instance of ``indirect_iterator`` with
|
2004-01-12 04:17:26 +00:00
|
|
|
``m_iterator`` copy constructed from ``x``.
|
2003-08-05 19:42:37 +00:00
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
template <
|
2003-09-22 19:55:01 +00:00
|
|
|
class Iterator2, class Value2, unsigned Access, class Traversal
|
2003-08-05 19:42:37 +00:00
|
|
|
, class Reference2, class Difference2
|
|
|
|
>
|
|
|
|
indirect_iterator(
|
|
|
|
indirect_iterator<
|
2003-09-22 19:55:01 +00:00
|
|
|
Iterator2, Value2, Access, Traversal, Reference2, Difference2
|
2003-08-05 19:42:37 +00:00
|
|
|
> const& y
|
|
|
|
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
|
|
|
);
|
|
|
|
|
|
|
|
:Requires: ``Iterator2`` is implicitly convertible to ``Iterator``.
|
2003-12-16 22:10:51 +00:00
|
|
|
:Returns: An instance of ``indirect_iterator`` whose
|
2004-01-12 04:17:26 +00:00
|
|
|
``m_iterator`` subobject is constructed from ``y.base()``.
|
|
|
|
|
2003-12-16 22:10:51 +00:00
|
|
|
|
2004-01-12 04:17:26 +00:00
|
|
|
``Iterator base() const;``
|
2003-08-05 19:42:37 +00:00
|
|
|
|
2004-01-12 04:17:26 +00:00
|
|
|
:Returns: ``m_iterator``
|
2004-01-12 15:53:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
``reference operator*() const;``
|
|
|
|
|
|
|
|
:Returns: ``**m_iterator``
|
|
|
|
|
|
|
|
|
|
|
|
``indirect_iterator& operator++();``
|
|
|
|
|
|
|
|
:Effects: ``++m_iterator``
|
|
|
|
:Returns: ``*this``
|
|
|
|
|
|
|
|
|
|
|
|
``indirect_iterator& operator--();``
|
|
|
|
|
|
|
|
:Effects: ``--m_iterator``
|
|
|
|
:Returns: ``*this``
|