46 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
47 ,
private detail::non_propagating_cache<iterator_t<Rng>, drop_view<Rng>,
48 !random_access_range<Rng>>
51 using difference_type_ = range_difference_t<Rng>;
55 template(
bool Const =
true)(
56 requires Const AND
range<meta::const_if_c<Const, Rng>>)
58 get_begin_(std::true_type, std::true_type)
const
61 return next(ranges::begin(rng_), n_, ranges::end(rng_));
66 return next(ranges::begin(rng_), n_, ranges::end(rng_));
73 auto & begin_ =
static_cast<cache_t &
>(*this);
75 begin_ = next(ranges::begin(rng_), n_, ranges::end(rng_));
82 : rng_(std::move(rng))
85 RANGES_EXPECT(n >= 0);
94 return ranges::end(rng_);
96 template(
bool Const =
true)(
100 return this->get_begin_(std::true_type{}, std::true_type{});
102 template(
bool Const =
true)(
104 sentinel_t<meta::const_if_c<Const, Rng>> end()
const
106 return ranges::end(rng_);
109 auto CPP_fun(size)()(
const
112 auto const s = ranges::size(rng_);
113 auto const n =
static_cast<range_size_t<Rng const>
>(n_);
114 return s < n ? 0 : s - n;
117 auto CPP_fun(size)()(
120 auto const s = ranges::size(rng_);
121 auto const n =
static_cast<range_size_t<Rng>
>(n_);
122 return s < n ? 0 : s - n;
145 template<
typename Rng>
146 static auto impl_(Rng && rng, range_difference_t<Rng> n,
input_range_tag)
149 return {all(
static_cast<Rng &&
>(rng)), n};
151 template(
typename Rng)(
156 return {begin(rng) + ranges::min(n, distance(rng)), end(rng)};
160 template(
typename Rng)(
162 auto operator()(Rng && rng, range_difference_t<Rng> n)
const
164 return drop_base_fn::impl_(
165 static_cast<Rng &&
>(rng), n, range_tag_of<Rng>{});