14 #ifndef RANGES_V3_VIEW_TAKE_HPP
15 #define RANGES_V3_VIEW_TAKE_HPP
17 #include <type_traits>
27 #include <range/v3/utility/static_const.hpp>
31 #include <range/v3/detail/prologue.hpp>
38 template<
typename Rng>
42 CPP_assert(view_<Rng>);
44 range_difference_t<Rng> count_ = 0;
50 using CI = counted_iterator<iterator_t<Base>>;
51 sentinel_t<Base> end_ = sentinel_t<Base>();
55 constexpr
explicit sentinel(sentinel_t<Base> last)
56 : end_(std::move(last))
59 requires Const AND CPP_NOT(Other) AND
60 convertible_to<sentinel_t<Rng>,
62 constexpr sentinel(sentinel<Other> that)
63 : end_(std::move(that.end_))
65 constexpr sentinel_t<Base> base()
const
69 #ifdef RANGES_WORKAROUND_MSVC_756601
70 template<
typename =
void>
72 friend constexpr
bool operator==(sentinel
const & x, CI
const & y)
74 return y.count() == 0 || y.base() == x.end_;
76 #ifdef RANGES_WORKAROUND_MSVC_756601
77 template<
typename =
void>
79 friend constexpr
bool operator==(CI
const & y, sentinel
const & x)
81 return y.count() == 0 || y.base() == x.end_;
83 #ifdef RANGES_WORKAROUND_MSVC_756601
84 template<
typename =
void>
86 friend constexpr
bool operator!=(sentinel
const & x, CI
const & y)
88 return y.count() != 0 && y.base() != x.end_;
90 #ifdef RANGES_WORKAROUND_MSVC_756601
91 template<
typename =
void>
93 friend constexpr
bool operator!=(CI
const & y, sentinel
const & x)
95 return y.count() != 0 && y.base() != x.end_;
99 #if RANGES_CXX_IF_CONSTEXPR < RANGES_CXX_IF_CONSTEXPR_17
100 template<
typename Take>
101 static auto begin_random_access_(Take & take, std::true_type)
103 return ranges::begin(take.base_);
105 template<
typename Take>
106 static auto begin_random_access_(Take & take, std::false_type)
108 auto s =
static_cast<range_difference_t<Rng>
>(take.size());
109 return make_counted_iterator(ranges::begin(take.base_), s);
111 template<
typename Take>
112 static auto begin_sized_(Take & take, std::true_type)
114 return begin_random_access_(
117 template<
typename Take>
118 static auto begin_sized_(Take & take, std::false_type)
120 return make_counted_iterator(ranges::begin(take.base_), take.count_);
123 template<
typename Take>
124 static auto end_random_access_(Take & take, std::true_type)
126 return ranges::begin(take.base_) +
127 static_cast<range_difference_t<Rng>
>(take.size());
129 static auto end_random_access_(detail::ignore_t, std::false_type)
131 return default_sentinel;
133 template<
typename Take>
134 static auto end_sized_(Take & take, std::true_type, std::false_type)
136 return end_random_access_(
139 static auto end_sized_(detail::ignore_t, std::false_type,
142 return default_sentinel;
144 static auto end_sized_(
take_view & take, std::false_type, std::false_type)
146 return sentinel<false>{ranges::end(take.base_)};
148 static auto end_sized_(
take_view const & take, std::false_type, std::false_type)
150 return sentinel<true>{ranges::end(take.base_)};
156 constexpr
take_view(Rng base, range_difference_t<Rng> cnt)
157 : base_(std::move(base))
161 constexpr Rng base()
const
167 constexpr
auto CPP_fun(begin)()(
168 requires(!simple_view<Rng>()))
170 #if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
171 if constexpr(sized_range<Rng>)
172 if constexpr(random_access_range<Rng>)
173 return ranges::begin(base_);
177 #if defined(__cpp_concepts) && __cpp_concepts <= 201507
178 auto s = ranges::min(
179 static_cast<range_difference_t<Rng>
>(count_),
180 static_cast<range_difference_t<Rng>
>(
ranges::size(base_)));
182 auto s =
static_cast<range_difference_t<Rng>
>(size());
184 return make_counted_iterator(ranges::begin(base_), s);
187 return make_counted_iterator(ranges::begin(base_), count_);
189 return begin_sized_(*
this,
meta::bool_<sized_range<Rng>>{});
194 constexpr
auto CPP_fun(begin)()(
const
195 requires range<Rng const>)
197 #if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
198 if constexpr(sized_range<Rng const>)
199 if constexpr(random_access_range<Rng const>)
200 return ranges::begin(base_);
203 auto s =
static_cast<range_difference_t<Rng>
>(size());
204 return make_counted_iterator(ranges::begin(base_), s);
207 return make_counted_iterator(ranges::begin(base_), count_);
209 return begin_sized_(*
this,
meta::bool_<sized_range<Rng const>>{});
214 constexpr
auto CPP_fun(end)()(
215 requires(!simple_view<Rng>()))
217 #if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
218 if constexpr(sized_range<Rng>)
219 if constexpr(random_access_range<Rng>)
220 return ranges::begin(base_) +
221 static_cast<range_difference_t<Rng>
>(size());
223 return default_sentinel;
225 else if constexpr(is_infinite<Rng>::value)
226 return default_sentinel;
228 return sentinel<false>{ranges::end(base_)};
230 return end_sized_(*
this,
meta::bool_<sized_range<Rng>>{}, is_infinite<Rng>{});
235 constexpr
auto CPP_fun(end)()(
const
236 requires range<Rng const>)
238 #if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
239 if constexpr(sized_range<Rng const>)
240 if constexpr(random_access_range<Rng const>)
241 return ranges::begin(base_) +
242 static_cast<range_difference_t<Rng>
>(size());
244 return default_sentinel;
246 else if constexpr(is_infinite<Rng const>::value)
247 return default_sentinel;
249 return sentinel<true>{ranges::end(base_)};
252 *
this,
meta::bool_<sized_range<Rng const>>{}, is_infinite<Rng const>{});
257 constexpr
auto CPP_fun(size)()(
258 requires sized_range<Rng>)
261 return ranges::min(n,
static_cast<decltype(n)
>(count_));
264 constexpr
auto CPP_fun(size)()(
const
265 requires sized_range<Rng const>)
268 return ranges::min(n,
static_cast<decltype(n)
>(count_));
272 template<
typename Rng>
273 RANGES_INLINE_VAR constexpr
bool enable_borrowed_range<take_view<Rng>> =
274 enable_borrowed_range<Rng>;
276 #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
277 template<
typename Rng>
278 take_view(Rng &&, range_difference_t<Rng>)
286 template(
typename Rng)(
287 requires viewable_range<Rng>)
290 return {all(
static_cast<Rng &&
>(rng)), n};
296 using take_base_fn::operator();
298 template(
typename Int)(
299 requires detail::integer_like_<Int>)
300 constexpr
auto operator()(Int n)
const
314 using ranges::views::take;
316 template(
typename Rng)(
323 #include <range/v3/detail/epilogue.hpp>
324 #include <range/v3/detail/satisfy_boost_range.hpp>
CPP_concept random_access_range
\concept random_access_range
Definition: concepts.hpp:140
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
typename detail::_cond< If >::template invoke< Then, Else > conditional_t
Select one type or another depending on a compile-time Boolean.
Definition: meta.hpp:1148
Definition: interface.hpp:129