84 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
92 meta::if_c<bidirectional_range<meta::const_if_c<Const, Rng>> ||
93 detail::can_sized_sentinel_<Rng, Const>(),
94 range_difference_t<Rng>, detail::zero<range_difference_t<Rng>>>;
96 range_difference_t<Rng> n_ = 0;
99 struct RANGES_EMPTY_BASES adaptor
101 ,
private box<offset_t<Const>>
104 friend adaptor<!Const>;
105 using CRng = meta::const_if_c<Const, Rng>;
107 range_difference_t<CRng> n_;
108 sentinel_t<CRng> end_;
110 constexpr offset_t<Const>
const & offset()
const
113 RANGES_EXPECT(0 <= result && result < n_);
116 constexpr offset_t<Const> & offset()
118 return const_cast<offset_t<Const> &
>(
119 const_cast<adaptor
const &
>(*this).offset());
124 constexpr adaptor(meta::const_if_c<Const, chunk_view_> * cv)
126 , n_((RANGES_EXPECT(0 < cv->n_), cv->n_))
127 , end_(ranges::end(cv->base()))
129 template(
bool Other)(
130 requires Const AND CPP_NOT(Other))
131 constexpr adaptor(adaptor<Other> that)
137 ->
decltype(views::take(make_subrange(it, end_), n_))
139 RANGES_EXPECT(it != end_);
140 RANGES_EXPECT(0 == offset());
141 return views::take(make_subrange(it, end_), n_);
145 RANGES_EXPECT(it != end_);
146 RANGES_EXPECT(0 == offset());
147 offset() = ranges::advance(it, n_, end_);
154 ranges::advance(it, -n_ + offset());
160 adaptor
const & that)
const
161 -> CPP_ret(range_difference_t<Rng>)(
162 requires (detail::can_sized_sentinel_<Rng, Const>()))
164 auto const delta = (there - here) + (that.offset() - offset());
168 RANGES_ENSURE(0 == delta % n_);
176 using Limits = std::numeric_limits<range_difference_t<CRng>>;
179 RANGES_EXPECT(0 == offset());
180 RANGES_EXPECT(n <= Limits::max() / n_);
181 auto const remainder = ranges::advance(it, n * n_, end_) % n_;
182 RANGES_EXPECT(0 <= remainder && remainder < n_);
183 offset() = remainder;
187 RANGES_EXPECT(n >= Limits::min() / n_);
188 ranges::advance(it, n * n_ + offset());
194 constexpr adaptor<simple_view<Rng>()> begin_adaptor()
196 return adaptor<simple_view<Rng>()>{
this};
199 constexpr auto begin_adaptor()
const
200 -> CPP_ret(adaptor<true>)(
203 return adaptor<true>{
this};
205 template<
typename Size>
206 constexpr Size size_(Size base_size)
const
208 auto const n =
static_cast<Size
>(n_);
209 return base_size / n + (0 != (base_size % n));
214 constexpr chunk_view_(Rng rng, range_difference_t<Rng> n)
215 : chunk_view_::view_adaptor(detail::move(rng))
216 , n_((RANGES_EXPECT(0 < n), n))
219 constexpr auto CPP_fun(size)()(
const
222 return size_(ranges::size(this->base()));
225 constexpr auto CPP_fun(size)()(
228 return size_(ranges::size(this->base()));
235 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
241 using iter_cache_t = detail::non_propagating_cache<iterator_t<Rng>>;
244 range_difference_t<Rng> n_;
245 range_difference_t<Rng> remainder_;
246 mutable iter_cache_t it_cache_;
260 struct inner_view :
view_facade<inner_view, finite>
265 using value_type = range_value_t<Rng>;
269 constexpr bool done()
const noexcept
272 return rng_->remainder_ == 0;
278 constexpr iter_reference_t<iterator_t<Rng>> read()
const
280 RANGES_EXPECT(!done());
283 constexpr iter_rvalue_reference_t<iterator_t<Rng>> move()
const
285 RANGES_EXPECT(!done());
286 return ranges::iter_move(rng_->it());
288 constexpr void next()
290 RANGES_EXPECT(!done());
293 if(rng_->remainder_ != 0 && rng_->it() == ranges::end(rng_->base_))
294 rng_->remainder_ = 0;
298 -> CPP_ret(range_difference_t<Rng>)(
302 auto const d = ranges::end(rng_->base_) - rng_->it();
303 return ranges::min(d, rng_->remainder_);
307 inner_view() =
default;
308 constexpr explicit inner_view(
chunk_view_ * view) noexcept
312 constexpr auto CPP_fun(size)()(
315 using size_type = detail::iter_size_t<iterator_t<Rng>>;
323 using value_type = inner_view;
325 outer_cursor() =
default;
326 constexpr explicit outer_cursor(
chunk_view_ * view) noexcept
329 constexpr inner_view read()
const
331 RANGES_EXPECT(!done());
332 return inner_view{rng_};
334 constexpr bool done()
const
337 return rng_->it() == ranges::end(rng_->base_) && rng_->remainder_ != 0;
343 constexpr void next()
345 RANGES_EXPECT(!done());
346 ranges::advance(rng_->it(), rng_->remainder_, ranges::end(rng_->base_));
347 rng_->remainder_ = rng_->n_;
351 -> CPP_ret(range_difference_t<Rng>)(
355 auto d = ranges::end(rng_->base_) - rng_->it();
356 if(d < rng_->remainder_)
359 d -= rng_->remainder_;
360 d = (d + rng_->n_ - 1) / rng_->n_;
361 d += (rng_->remainder_ != 0);
366 constexpr outer_cursor begin_cursor()
noexcept
368 it_cache_ = ranges::begin(base_);
369 return outer_cursor{
this};
371 template<
typename Size>
372 constexpr Size size_(Size base_size)
const
374 auto const n =
static_cast<Size
>(this->n_);
375 return base_size / n + (0 != base_size % n);
380 constexpr chunk_view_(Rng rng, range_difference_t<Rng> n)
381 : base_(detail::move(rng))
382 , n_((RANGES_EXPECT(0 < n), n))
387 constexpr auto CPP_fun(size)()(
const
390 return size_(ranges::size(base_));
393 constexpr auto CPP_fun(size)()(
396 return size_(ranges::size(base_));