16#ifndef RANGES_V3_VIEW_SLIDING_HPP
17#define RANGES_V3_VIEW_SLIDING_HPP
31#include <range/v3/utility/static_const.hpp>
37#include <range/v3/detail/prologue.hpp>
42 namespace sliding_view_detail
51 template<
typename Rng>
52 using caching = std::integral_constant<
53 cache, random_access_range<Rng> && sized_range<Rng>
55 : bidirectional_range<Rng> && common_range<Rng> ? cache::last
60 template<
typename Rng,
61 sliding_view_detail::cache = sliding_view_detail::caching<Rng>::value>
65 namespace sliding_view_detail
67 template<
typename Rng>
71 template<
typename Rng,
bool = (
bool)random_access_range<Rng>>
75 constexpr trailing(Rng & rng)
76 : it_{uncounted(ranges::begin(rng))}
79 range_difference_t<Rng>)
const
90 requires bidirectional_range<Rng>)
99 template<
typename Rng>
100 struct trailing<Rng, true>
102 trailing() =
default;
103 constexpr trailing(Rng &)
noexcept
105 constexpr uncounted_t<Rng> get(iterator_t<Rng>
const & it,
106 range_difference_t<Rng> n)
const
108 return uncounted(it - (n - 1));
116 template<
typename Rng>
117 struct RANGES_EMPTY_BASES sv_base
118 : view_adaptor<sliding_view<Rng>, Rng,
119 is_finite<Rng>::value ? finite : range_cardinality<Rng>::value>
120 ,
private detail::non_propagating_cache<iterator_t<Rng>, sv_base<Rng>,
121 caching<Rng>::value != cache::none>
123 CPP_assert(forward_range<Rng>);
125 sv_base(Rng rng, range_difference_t<Rng> n)
126 : sv_base::view_adaptor(std::move(rng))
129 RANGES_ASSERT(0 < n_);
132 auto CPP_fun(size)()(
const
133 requires sized_range<Rng const>)
135 auto const count = ranges::size(this->base());
136 auto const n =
static_cast<range_size_t<Rng const>
>(n_);
140 auto CPP_fun(size)()(
141 requires sized_range<Rng>)
143 auto const count = ranges::size(this->base());
144 auto const n =
static_cast<range_size_t<Rng>
>(n_);
149 range_difference_t<Rng> n_;
151 optional<iterator_t<Rng>> & cache() &
153 return static_cast<cache_t &
>(*this);
155 optional<iterator_t<Rng>>
const & cache() const &
157 return static_cast<cache_t
const &
>(*this);
161 using cache_t = detail::non_propagating_cache<iterator_t<Rng>, sv_base<Rng>>;
168 template<
typename Rng>
170 : sliding_view_detail::sv_base<Rng>
177 auto & first = this->cache();
180 first = ranges::next(
181 ranges::begin(this->base()), this->n_ - 1, ranges::end(this->base()));
186 struct RANGES_EMPTY_BASES adaptor
188 , sliding_view_detail::trailing<Rng>
191 using base_t = sliding_view_detail::trailing<Rng>;
192 range_difference_t<Rng> n_ = {};
202 return v.get_first();
205 ->
decltype(views::counted(uncounted(it), n_))
207 return views::counted(base_t::get(it, n_), n_);
231 adaptor begin_adaptor()
235 meta::if_c<common_range<Rng>, adaptor,
adaptor_base> end_adaptor()
241 using sliding_view::sv_base::sv_base;
244 template<
typename Rng>
246 : sliding_view_detail::sv_base<Rng>
253 auto & last = this->cache();
257 ranges::end(this->base()), this->n_ - 1, ranges::begin(this->base()));
265 range_difference_t<Rng> n_ = {};
277 ->
decltype(views::counted(uncounted(it), n_))
279 return views::counted(uncounted(it), n_);
283 adaptor begin_adaptor()
287 adaptor end_adaptor()
293 using sliding_view::sv_base::sv_base;
296 template<
typename Rng>
298 : sliding_view_detail::sv_base<Rng>
307 friend adaptor<!Const>;
308 using CRng = meta::const_if_c<Const, Rng>;
309 range_difference_t<Rng> n_ = 0;
313 adaptor(range_difference_t<Rng> n)
316 template(
bool Other)(
317 requires Const AND CPP_NOT(Other))
318 adaptor(adaptor<Other> that)
323 auto const sz = ranges::distance(v.base());
324 auto const offset = n_ - 1 < sz ? n_ - 1 : sz;
325 return ranges::begin(v.base()) + (sz - offset);
328 ->
decltype(views::counted(uncounted(it), n_))
330 return views::counted(uncounted(it), n_);
334 adaptor<simple_view<Rng>()> begin_adaptor()
339 auto begin_adaptor()
const
340 -> CPP_ret(adaptor<true>)(
345 adaptor<simple_view<Rng>()> end_adaptor()
350 auto end_adaptor()
const
351 -> CPP_ret(adaptor<true>)(
358 using sliding_view::sv_base::sv_base;
361 template<
typename Rng>
362 RANGES_INLINE_VAR
constexpr bool enable_borrowed_range<sliding_view<Rng>> =
363 enable_borrowed_range<Rng>;
365#if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
366 template<
typename Rng>
377 template(
typename Rng)(
380 operator()(Rng && rng, range_difference_t<Rng> n)
const
382 return {all(
static_cast<Rng &&
>(rng)), n};
388 using sliding_base_fn::operator();
390 template<
typename Int>
391 constexpr auto CPP_fun(
operator())(Int n)(
const
392 requires detail::integer_like_<Int>)
405#include <range/v3/detail/epilogue.hpp>
The bidirectional_range concept.
The forward_range concept.
The random_access_range concept.
The viewable_range concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
front< Pair > first
Retrieve the first element of the pair Pair.
Definition meta.hpp:2251
_t< detail::count_< L, T > > count
Count the number of times a type T appears in the list L.
Definition meta.hpp:2725
Definition adaptor.hpp:110
Definition sliding.hpp:62
Definition sliding.hpp:376
Definition sliding.hpp:387