[range.filter.iterator] (original) (raw)
25 Ranges library [ranges]
25.7 Range adaptors [range.adaptors]
25.7.8 Filter view [range.filter]
25.7.8.3 Class filter_view::iterator [range.filter.iterator]
namespace std::ranges { template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class filter_view<V, Pred>::iterator { private: iterator_t<V> current_ = iterator_t<V>(); filter_view* parent_ = nullptr; public: using iterator_concept = see below;using iterator_category = see below; using value_type = range_value_t<V>;using difference_type = range_difference_t<V>;iterator() requires default_initializable<iterator_t<V>> = default;constexpr iterator(filter_view& parent, iterator_t<V> current);constexpr const iterator_t<V>& base() const & noexcept;constexpr iterator_t<V> base() &&;constexpr range_reference_t<V> operator*() const;constexpr iterator_t<V> operator->() const requires has-arrow<iterator_t<V>> && copyable<iterator_t<V>>;constexpr iterator& operator++();constexpr void operator++(int);constexpr iterator operator++(int) requires forward_range<V>;constexpr iterator& operator--() requires bidirectional_range<V>;constexpr iterator operator--(int) requires bidirectional_range<V>;friend constexpr bool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<V>>;friend constexpr range_rvalue_reference_t<V> iter_move(const iterator& i) noexcept(noexcept(ranges::iter_move(i.current_)));friend constexpr void iter_swap(const iterator& x, const iterator& y) noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires indirectly_swappable<iterator_t<V>>;};}
Modification of the element a filter_view::iterator denotes is permitted, but results in undefined behavior if the resulting value does not satisfy the filter predicate.
_iterator_::iterator_concept is defined as follows:
- Otherwise, if V models forward_range, theniterator_concept denotes forward_iterator_tag.
- Otherwise, iterator_concept denotes input_iterator_tag.
In that case,_iterator_::iterator_category is defined as follows:
- Let C denote the typeiterator_traits<iterator_t<V>>::iterator_category.
- If C modelsderived_from<bidirectional_iterator_tag>, then iterator_category denotes bidirectional_iterator_tag.
- Otherwise, if C modelsderived_from<forward_iterator_tag>, then iterator_category denotes forward_iterator_tag.
- Otherwise, iterator_category denotes C.
constexpr _iterator_(filter_view& parent, iterator_t<V> current);
Effects: Initializes current_ with std::move(current) and_parent__ with addressof(parent).
constexpr const iterator_t<V>& base() const & noexcept;
Effects: Equivalent to: return current_;
constexpr iterator_t<V> base() &&;
Effects: Equivalent to: return std::move(current_);
constexpr range_reference_t<V> operator*() const;
Effects: Equivalent to: return *current_;
constexpr iterator_t<V> operator->() const requires [_has-arrow_](range.utility.helpers#concept:has-arrow "25.5.2 Helper concepts [range.utility.helpers]")<iterator_t<V>> && [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")<iterator_t<V>>;
Effects: Equivalent to: return current_;
constexpr _iterator_& operator++();
Effects: Equivalent to:current_ = ranges::find_if(std::move(++current_), ranges::end(_parent__->base_), ref(*_parent__->pred_));return *this;
constexpr void operator++(int);
Effects: Equivalent to ++*this.
Effects: Equivalent to:auto tmp = *this;++*this;return tmp;
Effects: Equivalent to:do --current_;while (!invoke(*_parent__->pred_, *current_));return *this;
Effects: Equivalent to:auto tmp = *this;--*this;return tmp;
friend constexpr bool operator==(const _iterator_& x, const _iterator_& y) requires [equality_comparable](concept.equalitycomparable#concept:equality%5Fcomparable "18.5.4 Concept equality_comparable [concept.equalitycomparable]")<iterator_t<V>>;
Effects: Equivalent to: return x.current_ == y.current_;
friend constexpr range_rvalue_reference_t<V> iter_move(const _iterator_& i) noexcept(noexcept(ranges::iter_move(i._current_)));
Effects: Equivalent to: return ranges::iter_move(i.current_);
friend constexpr void iter_swap(const _iterator_& x, const _iterator_& y) noexcept(noexcept(ranges::iter_swap(x._current_, y._current_))) requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly%5Fswappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<iterator_t<V>>;
Effects: Equivalent to ranges::iter_swap(x.current_, y.current_).