template <
class Derived
, class Base
, class Value = use_default
, class CategoryOrTraversal = use_default
, class Reference = use_default
, class Difference = use_default
>
class iterator_adaptor
: public iterator_facade<Derived, V, C, R, D> // see details
{
friend class iterator_core_access;
public:
iterator_adaptor();
explicit iterator_adaptor(Base iter);
Base base() const;
protected:
Base const& base_reference() const;
Base& base_reference();
private: // Core iterator interface for iterator_facade.
typename iterator_adaptor::reference dereference() const;
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
void advance(typename iterator_adaptor::difference_type n);
void increment();
void decrement();
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
typename iterator_adaptor::difference_type distance_to(
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
private:
Base m_iterator; // exposition only
};
The V, C, R, and D parameters of the iterator_facade used as a base class in the summary of iterator_adaptor above are defined as follows:
V = if (Value is use_default)
return iterator_traits<Base>::value_type
else
return Value
C = if (CategoryOrTraversal is use_default)
return iterator_traversal<Base>::type
else
return CategoryOrTraversal
R = if (Reference is use_default)
if (Value is use_default)
return iterator_traits<Base>::reference
else
return Value&
else
return Reference
D = if (Difference is use_default)
return iterator_traits<Base>::difference_type
else
return Difference
The Derived template parameter must be a publicly derived from iterator_adaptor. In order for Derived to model the iterator concepts corresponding to iterator_traits<Derived>::iterator_category, the expressions involving m_iterator in the specifications of those private member functions of iterator_adaptor that may be called by iterator_facade<Derived, V, C, R, D> in evaluating any valid expression involving Derived in those concepts' requirements.
iterator_adaptor();
| Requires: | The Base type must be Default Constructible. |
|---|---|
| Returns: | An instance of iterator_adaptor with m_iterator default constructed. |
explicit iterator_adaptor(Base iter);
| Returns: | An instance of iterator_adaptor with m_iterator copy constructed from iter. |
|---|
Base base() const;
| Returns: | m_iterator |
|---|
Base const& base_reference() const;
| Returns: | A const reference to m_iterator. |
|---|
Base& base_reference();
| Returns: | A non-const reference to m_iterator. |
|---|
typename iterator_adaptor::reference dereference() const;
| Returns: | *m_iterator |
|---|
template < class OtherDerived, class OtherIterator, class V, class C, class R, class D > bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
| Returns: | m_iterator == x.base() |
|---|
void advance(typename iterator_adaptor::difference_type n);
| Effects: | m_iterator += n; |
|---|
void increment();
| Effects: | ++m_iterator; |
|---|
void decrement();
| Effects: | --m_iterator; |
|---|
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
typename iterator_adaptor::difference_type distance_to(
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
| Returns: | y.base() - m_iterator |
|---|