45 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
46 ,
private detail::non_propagating_cache<iterator_t<Rng>, drop_exactly_view<Rng>,
47 !random_access_range<Rng>>
50 using difference_type_ = range_difference_t<Rng>;
55 template(
bool Const =
true)(
59 return next(ranges::begin(rng_), n_);
63 return next(ranges::begin(rng_), n_);
70 auto & begin_ =
static_cast<cache_t &
>(*this);
72 begin_ = next(ranges::begin(rng_), n_);
79 : rng_(std::move(rng))
82 RANGES_EXPECT(n >= 0);
90 return ranges::end(rng_);
92 template(
bool Const =
true)(
96 return this->get_begin_(std::true_type{});
98 template(
bool Const =
true)(
100 sentinel_t<meta::const_if_c<Const, Rng>> end()
const
102 return ranges::end(rng_);
105 auto CPP_fun(size)()(
const
108 return ranges::size(rng_) -
static_cast<range_size_t<Rng const>
>(n_);
111 auto CPP_fun(size)()(
114 return ranges::size(rng_) -
static_cast<range_size_t<Rng>
>(n_);
137 template<
typename Rng>
138 static auto impl_(Rng && rng, range_difference_t<Rng> n,
input_range_tag)
141 return {all(
static_cast<Rng &&
>(rng)), n};
143 template(
typename Rng)(
148 return {begin(rng) + n, end(rng)};
152 template(
typename Rng)(
154 auto operator()(Rng && rng, range_difference_t<Rng> n)
const
156 return drop_exactly_base_fn::impl_(
157 static_cast<Rng &&
>(rng), n, range_tag_of<Rng>{});