50 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
55 semiregular_box_t<Fun> fun_;
57 template<
bool IsConst>
63 friend struct cursor<!IsConst>;
65 using CRng = meta::const_if_c<IsConst, Rng>;
67 sentinel_t<CRng> last_;
68 using fun_ref_t = semiregular_box_ref_or_val_t<Fun, IsConst>;
75 sentinel_t<CRng> last_;
79 return (zero_ && cur == first_) ||
80 (cur != last_ && !invoke(fun_, cur, last_).first);
85 reference_ read()
const
87 return reference_{{views::iota(cur_), {zero_, cur_, last_, fun_}}};
91 RANGES_EXPECT(cur_ != last_);
98 for(; cur_ != last_; ++cur_)
100 auto p = invoke(fun_, cur_, last_);
103 zero_ = (cur_ == p.second);
111 return cur_ == last_;
113 bool equal(cursor
const & that)
const
115 return cur_ == that.cur_;
123 auto p = invoke(fun, first, last);
124 zero_ = p.first && first == p.second;
129 template(
bool Other)(
130 requires IsConst AND CPP_NOT(Other))
131 cursor(cursor<Other> that)
132 : cursor{std::move(that.cur_), std::move(that.last_), std::move(that.fun_)}
135 cursor<false> begin_cursor()
137 return {fun_, ranges::begin(rng_), ranges::end(rng_)};
139 template(
bool Const =
true)(
140 requires Const AND
range<meta::const_if_c<Const, Rng>> AND
142 sentinel_t<meta::const_if_c<Const, Rng>>>)
143 cursor<Const> begin_cursor()
const
145 return {fun_, ranges::begin(rng_), ranges::end(rng_)};
151 : rng_(std::move(rng))
152 , fun_(std::move(fun))
168 template<
typename Pred>
169 struct predicate_pred_
171 semiregular_box_t<Pred> pred_;
173 template(
typename I,
typename S)(
175 std::pair<bool, I> operator()(I cur, S last)
const
177 auto where = ranges::find_if_not(cur, last, std::ref(pred_));
178 return {cur != where, where};
183 template(
typename Rng,
typename Fun)(
187 copy_constructible<Fun> AND
193 return {all(
static_cast<Rng &&
>(rng)), std::move(fun)};
195 template(
typename Rng,
typename Fun)(
197 predicate<Fun
const &, range_reference_t<Rng>> AND
198 copy_constructible<Fun>)
200 operator()(Rng && rng, Fun fun)
const
202 return {all(
static_cast<Rng &&
>(rng)),
203 predicate_pred_<Fun>{std::move(fun)}};