mirror of https://github.com/saitohirga/WSJT-X.git
178 lines
6.9 KiB
ReStructuredText
178 lines
6.9 KiB
ReStructuredText
.. 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``
|