53 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
59 detail::non_propagating_cache<iterator_t<Rng>> second_;
60 semiregular_box_t<Fun> fun_;
65 semiregular_box_ref_or_val_t<Fun, false> fun_;
66 bool operator()(range_reference_t<Rng> r)
const
68 return invoke(fun_, *first_, r);
79 sentinel_t<Rng> last_;
80 semiregular_box_ref_or_val_t<Fun, false> fun_;
88 constexpr explicit mixin(cursor && cur)
91 constexpr explicit mixin(cursor
const & cur)
97 return this->get().cur_;
102 template<
typename I = iterator_t<Rng>>
105 return {cur_, next_cur_};
110 return {cur_, next_cur_};
116 next_cur_ = cur_ != last_
117 ? find_if_not(ranges::next(cur_), last_, pred{cur_, fun_})
123 return cur_ == last_;
125 bool equal(cursor
const & that)
const
127 return cur_ == that.cur_;
129 cursor(semiregular_box_ref_or_val_t<Fun, false> fun,
iterator_t<Rng> first,
132 , next_cur_(next_cur)
140 cursor begin_cursor()
142 auto b = ranges::begin(rng_);
143 auto e = ranges::end(rng_);
146 second_ = b != e ? find_if_not(ranges::next(b), e, pred{b, fun_}) : b;
148 return {fun_, b, *second_, e};
154 : rng_(std::move(rng))
155 , fun_(std::move(fun))