5 #ifndef VCCC_RANGES_VIEWS_FILTER_VIEW_HPP
6 #define VCCC_RANGES_VIEWS_FILTER_VIEW_HPP
11 #include <type_traits>
50 class filter_view_cache;
53 class filter_view_cache<V, true> {
55 template<
typename I,
typename This,
typename Base,
typename Pred>
56 constexpr I
begin(This& thiz, Base& base, Pred& pred) {
57 if (!begin_.has_value()) {
60 return I{thiz, begin_.value()};
64 non_propagating_cache<iterator_t<V>> begin_;
68 class filter_view_cache<V, false> {
70 template<
typename I,
typename This,
typename Base,
typename Pred>
71 constexpr I
begin(This& thiz, Base& base, Pred& pred) {
77 struct filter_view_iterator_category {
78 #if __cplusplus < 202002L
79 using iterator_category = iterator_ignore;
84 struct filter_view_iterator_category<V, true> {
86 using C =
typename cxx20_iterator_traits<iterator_t<V>>::iterator_category;
89 using iterator_category =
99 struct has_arrow : std::false_type {};
101 struct has_arrow<I, true>
104 has_operator_arrow<I&>
112 template<
typename V,
typename Pred>
116 using cache_base = detail::filter_view_cache<V>;
124 class iterator :
public detail::filter_view_iterator_category<V> {
135 #if __cplusplus < 202002L
150 return std::move(current_);
157 template<
typename V2 = V, std::enable_if_t<
conjunction<
158 detail::has_arrow<iterator_t<V2>>,
167 std::move(++current_),
ranges::end(parent_->base_), std::ref(*parent_->pred_));
198 template<
typename V2 = V, std::enable_if_t<equality_comparable<iterator_t<V2>>::value,
int> = 0>
200 return x.current_ == y.current_;
203 template<
typename V2 = V, std::enable_if_t<equality_comparable<iterator_t<V2>>::value,
int> = 0>
214 template<
typename V2 = V, std::enable_if_t<indirectly_swappable<iterator_t<V2>>::value,
int> = 0>
237 return x.
base() == y.end_;
269 return std::move(base_);
272 constexpr
const Pred&
pred()
const {
273 assert(((
void)
"pred_ must contatin a value", pred_.has_value()));
278 return cache_base::template begin<iterator>(*
this, base_, pred_);
289 constexpr sentinel
end(std::false_type ) {
295 #if __cplusplus >= 201703L
297 template<
typename R,
typename Pred>
298 filter_view(R&&, Pred) -> filter_view<views::all_t<R>, Pred>;
Definition: filter_view.hpp:124
constexpr iterator & operator--()
Definition: filter_view.hpp:184
range_reference_t< V > reference
Definition: filter_view.hpp:137
constexpr iterator & operator--(int)
Definition: filter_view.hpp:192
constexpr const iterator_t< V > & base() const &noexcept
Definition: filter_view.hpp:145
void pointer
Definition: filter_view.hpp:136
constexpr void operator++(int)
Definition: filter_view.hpp:172
range_value_t< V > value_type
Definition: filter_view.hpp:133
constexpr friend bool operator==(const iterator &x, const iterator &y)
Definition: filter_view.hpp:199
constexpr range_reference_t< V > operator*() const
Definition: filter_view.hpp:153
constexpr friend bool operator!=(const iterator &x, const iterator &y)
Definition: filter_view.hpp:204
constexpr iterator_t< V > operator->() const
Definition: filter_view.hpp:161
constexpr friend range_rvalue_reference_t< V > iter_move(const iterator &i) noexcept(noexcept(ranges::iter_move(i.current_)))
Definition: filter_view.hpp:209
std::conditional_t< bidirectional_range< V >::value, bidirectional_iterator_tag, std::conditional_t< forward_range< V >::value, forward_iterator_tag, input_iterator_tag > > iterator_concept
Definition: filter_view.hpp:132
constexpr iterator operator++(int)
Definition: filter_view.hpp:177
constexpr iterator_t< V > base() &&noexcept
Definition: filter_view.hpp:149
constexpr friend void iter_swap(const iterator &x, const iterator &y) noexcept(noexcept(ranges::iter_swap(x.current_, y.current_)))
Definition: filter_view.hpp:215
range_difference_t< V > difference_type
Definition: filter_view.hpp:134
constexpr iterator & operator++()
Definition: filter_view.hpp:165
constexpr iterator(filter_view &parent, iterator_t< V > current)
Definition: filter_view.hpp:142
Definition: filter_view.hpp:226
constexpr friend bool operator!=(const iterator &x, const sentinel &y)
Definition: filter_view.hpp:244
constexpr friend bool operator==(const iterator &x, const sentinel &y)
Definition: filter_view.hpp:236
constexpr friend bool operator==(const sentinel &y, const iterator &x)
Definition: filter_view.hpp:240
constexpr friend bool operator!=(const sentinel &y, const iterator &x)
Definition: filter_view.hpp:248
Definition: filter_view.hpp:113
constexpr V base() const &
Definition: filter_view.hpp:264
friend class iterator
Definition: filter_view.hpp:256
constexpr const Pred & pred() const
Definition: filter_view.hpp:272
constexpr iterator begin()
Definition: filter_view.hpp:277
constexpr auto end()
Definition: filter_view.hpp:281
constexpr filter_view(V base, Pred pred)
Definition: filter_view.hpp:260
constexpr V base() const &&
Definition: filter_view.hpp:268
helper class template for defining a view, using the curiously recurring template pattern
Definition: view_interface.hpp:78
constexpr VCCC_INLINE_OR_STATIC detail::find_if_niebloid find_if
Definition: find_if.hpp:53
constexpr invoke_result_t< F, Args... > invoke(F &&f, Args &&... args) noexcept(is_nothrow_invocable< F, Args... >::value)
Definition: invoke.hpp:38
constexpr VCCC_INLINE_OR_STATIC detail_iter_move::iter_move_niebloid iter_move
Definition: iter_move.hpp:92
constexpr VCCC_INLINE_OR_STATIC detail_iter_swap::iter_swap_niebloid iter_swap
Definition: iter_swap.hpp:90
std::forward_iterator_tag forward_iterator_tag
Definition: iterator_tag.hpp:17
std::input_iterator_tag input_iterator_tag
Definition: iterator_tag.hpp:15
std::bidirectional_iterator_tag bidirectional_iterator_tag
Definition: iterator_tag.hpp:18
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
typename sentinel< R >::type sentinel_t
Definition: sentinel_t.hpp:29
typename ranges::iterator< T >::type iterator_t
Definition: iterator_t.hpp:32
constexpr VCCC_INLINE_OR_STATIC detail::begin_niebloid begin
returns an iterator to the beginning of a range
Definition: begin.hpp:116
typename range_rvalue_reference< R >::type range_rvalue_reference_t
Used to obtain the rvalue reference type of the iterator type of range type R.
Definition: range_rvalue_reference_t.hpp:38
constexpr VCCC_INLINE_OR_STATIC detail::end_niebloid end
returns a sentinel indicating the end of a range
Definition: end.hpp:120
typename range_difference< R >::type range_difference_t
Used to obtain the difference type of the iterator type of range type R.
Definition: range_difference_t.hpp:41
typename range_reference< R >::type range_reference_t
Used to obtain the reference type of the iterator type of range type R.
Definition: range_reference_t.hpp:42
typename range_value< R >::type range_value_t
Used to obtain the value type of the iterator type of range type R.
Definition: range_value_t.hpp:42
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: conjunction.hpp:22
specifies that an object of a type can be copied, moved, and swapped
Definition: copyable.hpp:59
specifies that a callable type, when invoked with the result of dereferencing an indirectly_readable ...
Definition: indirect_unary_predicate.hpp:49
specifies a range whose iterator type satisfies bidirectional_iterator
Definition: bidirectional_range.hpp:49
Definition: common_range.hpp:41
specifies a range whose iterator type satisfies forward_iterator
Definition: forward_range.hpp:47
specifies that a range is a view, that is, it has constant time copy/move/assignment
Definition: view.hpp:31