139 static constexpr bool const_iterable()
noexcept
151 static constexpr bool can_bound()
noexcept
153 using CRng = meta::const_if_c<Const, Rng>;
162 friend struct adaptor<!Const>;
163 using CRng = meta::const_if_c<Const, Rng>;
164 using stride_view_t = meta::const_if_c<Const, stride_view>;
165 stride_view_t * rng_;
169 constexpr adaptor(stride_view_t * rng) noexcept
172 template(
bool Other)(
173 requires Const AND CPP_NOT(Other))
174 adaptor(adaptor<Other> that)
179 auto const last = ranges::end(rng_->base());
180 RANGES_EXPECT(it != last);
181 auto const delta = ranges::advance(it, rng_->stride_, last);
184 rng_->set_offset(delta);
192 RANGES_EXPECT(it != ranges::begin(rng_->base()));
193 auto delta = -rng_->stride_;
194 if(it == ranges::end(rng_->base()))
196 RANGES_EXPECT(rng_->get_offset() >= 0);
197 delta += rng_->get_offset();
199 ranges::advance(it, delta);
201 template(
typename Other)(
203 constexpr range_difference_t<Rng> distance_to(
iterator_t<CRng> const & here,
204 Other
const & there)
const
206 range_difference_t<Rng> delta = there - here;
208 delta -= rng_->stride_ - 1;
210 delta += rng_->stride_ - 1;
211 return delta / rng_->stride_;
221 auto const last = ranges::end(rng_->base());
224 RANGES_EXPECT(n < 0);
225 RANGES_EXPECT(rng_->get_offset() >= 0);
226 n += rng_->get_offset();
230 auto delta = ranges::advance(it, n, last);
234 rng_->set_offset(delta % rng_->stride_);
240 ranges::advance(it, n);
242 auto const first = ranges::begin(rng_->base());
243 auto const delta = ranges::advance(it, n, first);
244 RANGES_EXPECT(delta == 0);
249 constexpr adaptor<false> begin_adaptor()
noexcept
251 return adaptor<false>{
this};
254 constexpr auto begin_adaptor()
const noexcept
255 -> CPP_ret(adaptor<true>)(
256 requires(const_iterable()))
258 return adaptor<true>{
this};
261 constexpr meta::if_c<can_bound<false>(), adaptor<false>,
adaptor_base>
262 end_adaptor()
noexcept
267 constexpr auto end_adaptor()
const noexcept
268 -> CPP_ret(meta::if_c<can_bound<true>(), adaptor<true>,
adaptor_base>)(
269 requires (const_iterable()))
276 constexpr stride_view(Rng rng, range_difference_t<Rng>
const stride)
277 : detail::stride_view_base<Rng>{std::move(rng), stride}
280 constexpr auto CPP_fun(size)()(
283 using size_type = range_size_t<Rng>;
284 auto const n = ranges::size(this->base());
285 return (n +
static_cast<size_type
>(this->stride_) - 1) /
286 static_cast<size_type
>(this->stride_);
289 constexpr auto CPP_fun(size)()(
const
292 using size_type = range_size_t<Rng const>;
293 auto const n = ranges::size(this->base());
294 return (n +
static_cast<size_type
>(this->stride_) - 1) /
295 static_cast<size_type
>(this->stride_);