14#ifndef RANGES_V3_VIEW_TAKE_EXACTLY_HPP
15#define RANGES_V3_VIEW_TAKE_EXACTLY_HPP
28#include <range/v3/utility/static_const.hpp>
35#include <range/v3/detail/prologue.hpp>
42 template<
typename Rng>
43 struct is_random_access_common_
44 :
meta::bool_<(bool)random_access_range<Rng> && (bool)common_range<Rng>>
50 template<
typename Rng,
51 bool IsRandomAccessCommon >
52 struct take_exactly_view_
53 : view_interface<take_exactly_view_<Rng, IsRandomAccessCommon>, finite>
57 range_difference_t<Rng> n_;
60 take_exactly_view_() =
default;
61 take_exactly_view_(Rng rng, range_difference_t<Rng> n)
62 : rng_(std::move(rng))
65 RANGES_EXPECT(n >= 0);
67 counted_iterator<iterator_t<Rng>> begin()
69 return {ranges::begin(rng_), n_};
71 template(
typename BaseRng = Rng)(
72 requires range<BaseRng const>)
73 counted_iterator<iterator_t<BaseRng const>> begin()
const
75 return {ranges::begin(rng_), n_};
77 default_sentinel_t end()
const
83 return static_cast<detail::iter_size_t<iterator_t<Rng>
>>(n_);
91 template<
typename Rng>
92 struct take_exactly_view_<Rng, true>
93 : view_interface<take_exactly_view_<Rng, true>, finite>
97 range_difference_t<Rng> n_;
100 take_exactly_view_() =
default;
101 take_exactly_view_(Rng rng, range_difference_t<Rng> n)
102 : rng_(std::move(rng))
105 RANGES_EXPECT(n >= 0);
106 RANGES_EXPECT(!(
bool)sized_range<Rng> || n <= ranges::distance(rng_));
108 iterator_t<Rng> begin()
110 return ranges::begin(rng_);
112 iterator_t<Rng> end()
114 return ranges::begin(rng_) + n_;
117 auto CPP_fun(begin)()(
const
118 requires range<Rng const>)
120 return ranges::begin(rng_);
123 auto CPP_fun(end)()(
const
124 requires range<Rng const>)
126 return ranges::begin(rng_) + n_;
128 detail::iter_size_t<iterator_t<Rng>>
size()
const
130 return static_cast<detail::iter_size_t<iterator_t<Rng>
>>(n_);
142 template<
typename Rng>
143 using take_exactly_view = detail::take_exactly_view_<Rng>;
145 template<
typename Rng,
bool B>
146 RANGES_INLINE_VAR
constexpr bool
147 enable_borrowed_range<detail::take_exactly_view_<Rng, B>> =
148 enable_borrowed_range<Rng>;
155 template<
typename Rng>
156 static constexpr take_exactly_view<all_t<Rng>> impl_(
159 return {all(
static_cast<Rng &&
>(rng)), n};
161 template(
typename Rng)(
164 range_difference_t<Rng> n,
167 return {begin(rng), next(begin(rng), n)};
171 template(
typename Rng)(
173 constexpr auto operator()(Rng && rng, range_difference_t<Rng> n)
const
175 return take_exactly_base_fn::impl_(
176 static_cast<Rng &&
>(rng), n, range_tag_of<Rng>{});
182 using take_exactly_base_fn::operator();
184 template(
typename Int)(
185 requires detail::integer_like_<Int>)
186 constexpr auto operator()(Int n)
const
199#include <range/v3/detail/epilogue.hpp>
200#include <range/v3/detail/satisfy_boost_range.hpp>
201RANGES_SATISFY_BOOST_RANGE(::ranges::detail::take_exactly_view_)
The borrowed_range concept.
The viewable_range concept.
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition meta.hpp:168
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 take_exactly.hpp:153
Definition take_exactly.hpp:181