[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:

In that case,_iterator_​::​iterator_category is defined as follows:

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_).