14#ifndef RANGES_V3_VIEW_TAKE_HPP
15#define RANGES_V3_VIEW_TAKE_HPP
27#include <range/v3/utility/static_const.hpp>
31#include <range/v3/detail/prologue.hpp>
38 template<
typename 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
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_);
194 constexpr auto CPP_fun(begin)()(
const
197#if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
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_);
214 constexpr auto CPP_fun(end)()(
215 requires(!simple_view<Rng>()))
217#if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
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_)};
235 constexpr auto CPP_fun(end)()(
const
238#if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
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_)};
257 constexpr auto CPP_fun(size)()(
261 return ranges::min(n,
static_cast<decltype(n)
>(count_));
264 constexpr auto CPP_fun(size)()(
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)(
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>
The random_access_range concept.
The viewable_range concept.
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