14#ifndef RANGES_V3_VIEW_SPLIT_WHEN_HPP
15#define RANGES_V3_VIEW_SPLIT_WHEN_HPP
32#include <range/v3/utility/static_const.hpp>
40#include <range/v3/detail/prologue.hpp>
47 template<
typename Rng,
typename Fun>
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_;
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))
156#if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
157 template(
typename Rng,
typename Fun)(
158 requires copy_constructible<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)}};
209 using split_when_base_fn::operator();
212 constexpr auto operator()(T && t)
const
214 return make_view_closure(
226#include <range/v3/detail/epilogue.hpp>
227#include <range/v3/detail/satisfy_boost_range.hpp>
The forward_range concept.
The sentinel_for concept.
The viewable_range concept.
decltype(begin(declval(Rng &))) iterator_t
Definition: access.hpp:698
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector > >, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition: meta.hpp:541
defer< bind_back, Fn, Ts... > bind_back
Definition: meta.hpp:994
front< Pair > first
Retrieve the first element of the pair Pair.
Definition: meta.hpp:2251
list< F, S > pair
A list with exactly two elements.
Definition: meta.hpp:2246
Definition: default_sentinel.hpp:26
Definition: indirect.hpp:40
Definition: split_when.hpp:51
A utility for constructing a view from a (derived) type that implements begin and end cursors.
Definition: facade.hpp:66
Definition: split_when.hpp:166
Definition: split_when.hpp:208