14 #ifndef RANGES_V3_VIEW_DROP_HPP
15 #define RANGES_V3_VIEW_DROP_HPP
17 #include <type_traits>
31 #include <range/v3/utility/static_const.hpp>
37 #include <range/v3/detail/prologue.hpp>
43 template<
typename Rng>
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_));
65 CPP_assert(random_access_range<Rng>);
66 return next(ranges::begin(rng_), n_, ranges::end(rng_));
70 CPP_assert(!random_access_range<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);
89 return this->get_begin_(
meta::bool_<random_access_range<Rng>>{},
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
110 requires sized_range<Rng const>)
113 auto const n =
static_cast<range_size_t<Rng const>
>(n_);
114 return s < n ? 0 : s - n;
117 auto CPP_fun(
size)()(
118 requires sized_range<Rng>)
121 auto const n =
static_cast<range_size_t<Rng>
>(n_);
122 return s < n ? 0 : s - n;
130 template<
typename Rng>
131 RANGES_INLINE_VAR constexpr
bool enable_borrowed_range<drop_view<Rng>> =
132 enable_borrowed_range<Rng>;
134 #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
135 template<
typename Rng>
136 drop_view(Rng &&, range_difference_t<Rng>)
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)(
152 requires borrowed_range<Rng> AND sized_range<Rng>)
156 return {begin(rng) + ranges::min(n, distance(rng)), end(rng)};
160 template(
typename Rng)(
161 requires viewable_range<Rng> AND input_range<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>{});
171 using drop_base_fn::operator();
173 template(
typename Int)(
174 requires detail::integer_like_<Int>)
175 constexpr
auto operator()(Int n)
const
192 template(
typename Rng)(
199 #include <range/v3/detail/epilogue.hpp>
200 #include <range/v3/detail/satisfy_boost_range.hpp>
CPP_concept random_access_range
\concept random_access_range
Definition: concepts.hpp:140
CPP_concept range
\concept range
Definition: concepts.hpp:69
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
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition: meta.hpp:168
defer< bind_back, Fn, Ts... > bind_back
Definition: meta.hpp:994
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
Definition: concepts.hpp:277
Definition: subrange.hpp:196
Definition: interface.hpp:129