namespace std::ranges {
template<view V, class Pred>
requires input_range<V> && is_object_v<Pred> &&
indirect_unary_predicate<const Pred, iterator_t<V>>
template<bool Const>
class take_while_view<V, Pred>::sentinel {
using Base = conditional_t<Const, const V, V>;
sentinel_t<Base> end_ = sentinel_t<Base>();
const Pred* pred_ = nullptr;
public:
sentinel() = default;
constexpr explicit sentinel(sentinel_t<Base> end, const Pred* pred);
constexpr sentinel(sentinel<!Const> s)
requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;
constexpr sentinel_t<Base> base() const { return end_; }
friend constexpr bool operator==(const iterator_t<Base>& x, const sentinel& y);
};
}
constexpr explicit sentinel(sentinel_t<Base> end, const Pred* pred);
Effects: Initializes
end_ with
end and
pred_ with
pred. constexpr sentinel(sentinel<!Const> s)
requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;
Effects: Initializes
end_ with
s.end_ and
pred_ with
s.pred_. friend constexpr bool operator==(const iterator_t<Base>& x, const sentinel& y);
Effects: Equivalent to:
return y.end_ == x || !invoke(*y.pred_, *x);