123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- .. Copyright David Abrahams, Jeremy Siek, and Thomas Witt
- .. 2004. Use, modification and distribution is subject to the Boost
- .. Software License, Version 1.0. (See accompanying file
- .. LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ::
- template <class Predicate, class Iterator>
- class filter_iterator
- {
- public:
- typedef iterator_traits<Iterator>::value_type value_type;
- typedef iterator_traits<Iterator>::reference reference;
- typedef iterator_traits<Iterator>::pointer pointer;
- typedef iterator_traits<Iterator>::difference_type difference_type;
- typedef /* see below */ iterator_category;
- filter_iterator();
- filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
- filter_iterator(Iterator x, Iterator end = Iterator());
- template<class OtherIterator>
- filter_iterator(
- filter_iterator<Predicate, OtherIterator> const& t
- , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
- );
- Predicate predicate() const;
- Iterator end() const;
- Iterator const& base() const;
- reference operator*() const;
- filter_iterator& operator++();
- private:
- Predicate m_pred; // exposition only
- Iterator m_iter; // exposition only
- Iterator m_end; // exposition only
- };
- If ``Iterator`` models Readable Lvalue Iterator and Bidirectional Traversal
- Iterator then ``iterator_category`` is convertible to
- ``std::bidirectional_iterator_tag``.
- Otherwise, if ``Iterator`` models Readable Lvalue Iterator and Forward Traversal
- Iterator then ``iterator_category`` is convertible to
- ``std::forward_iterator_tag``.
- Otherwise ``iterator_category`` is
- convertible to ``std::input_iterator_tag``.
- ``filter_iterator`` requirements
- ................................
- The ``Iterator`` argument shall meet the requirements of Readable
- Iterator and Single Pass Iterator or it shall meet the requirements of
- Input Iterator.
- The ``Predicate`` argument must be Assignable, Copy Constructible, and
- the expression ``p(x)`` must be valid where ``p`` is an object of type
- ``Predicate``, ``x`` is an object of type
- ``iterator_traits<Iterator>::value_type``, and where the type of
- ``p(x)`` must be convertible to ``bool``.
- ``filter_iterator`` models
- ..........................
- The concepts that ``filter_iterator`` models are dependent on which
- concepts the ``Iterator`` argument models, as specified in the
- following tables.
- +---------------------------------+------------------------------------------+
- |If ``Iterator`` models |then ``filter_iterator`` models |
- +=================================+==========================================+
- |Single Pass Iterator |Single Pass Iterator |
- +---------------------------------+------------------------------------------+
- |Forward Traversal Iterator |Forward Traversal Iterator |
- +---------------------------------+------------------------------------------+
- |Bidirectional Traversal Iterator |Bidirectional Traversal Iterator |
- +---------------------------------+------------------------------------------+
- +--------------------------------+----------------------------------------------+
- | If ``Iterator`` models | then ``filter_iterator`` models |
- +================================+==============================================+
- | Readable Iterator | Readable Iterator |
- +--------------------------------+----------------------------------------------+
- | Writable Iterator | Writable Iterator |
- +--------------------------------+----------------------------------------------+
- | Lvalue Iterator | Lvalue Iterator |
- +--------------------------------+----------------------------------------------+
- +-------------------------------------------------------+---------------------------------+
- |If ``Iterator`` models | then ``filter_iterator`` models |
- +=======================================================+=================================+
- |Readable Iterator, Single Pass Iterator | Input Iterator |
- +-------------------------------------------------------+---------------------------------+
- |Readable Lvalue Iterator, Forward Traversal Iterator | Forward Iterator |
- +-------------------------------------------------------+---------------------------------+
- |Writable Lvalue Iterator, Forward Traversal Iterator | Mutable Forward Iterator |
- +-------------------------------------------------------+---------------------------------+
- |Writable Lvalue Iterator, Bidirectional Iterator | Mutable Bidirectional Iterator |
- +-------------------------------------------------------+---------------------------------+
- ``filter_iterator<P1, X>`` is interoperable with ``filter_iterator<P2, Y>``
- if and only if ``X`` is interoperable with ``Y``.
- ``filter_iterator`` operations
- ..............................
- In addition to those operations required by the concepts that
- ``filter_iterator`` models, ``filter_iterator`` provides the following
- operations.
- ``filter_iterator();``
- :Requires: ``Predicate`` and ``Iterator`` must be Default Constructible.
- :Effects: Constructs a ``filter_iterator`` whose``m_pred``, ``m_iter``, and ``m_end``
- members are a default constructed.
- ``filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());``
- :Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either
- the first position in the range ``[x,end)`` such that ``f(*m_iter) == true``
- or else``m_iter == end``. The member ``m_pred`` is constructed from
- ``f`` and ``m_end`` from ``end``.
- ``filter_iterator(Iterator x, Iterator end = Iterator());``
- :Requires: ``Predicate`` must be Default Constructible and
- ``Predicate`` is a class type (not a function pointer).
- :Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either
- the first position in the range ``[x,end)`` such that ``m_pred(*m_iter) == true``
- or else``m_iter == end``. The member ``m_pred`` is default constructed.
- ::
- template <class OtherIterator>
- filter_iterator(
- filter_iterator<Predicate, OtherIterator> const& t
- , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
- );``
- :Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``.
- :Effects: Constructs a filter iterator whose members are copied from ``t``.
- ``Predicate predicate() const;``
- :Returns: ``m_pred``
- ``Iterator end() const;``
- :Returns: ``m_end``
- ``Iterator const& base() const;``
- :Returns: ``m_iterator``
- ``reference operator*() const;``
- :Returns: ``*m_iter``
- ``filter_iterator& operator++();``
- :Effects: Increments ``m_iter`` and then continues to
- increment ``m_iter`` until either ``m_iter == m_end``
- or ``m_pred(*m_iter) == true``.
- :Returns: ``*this``
|