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)()(
260 auto n = ranges::size(base_);
261 return ranges::min(n,
static_cast<decltype(n)
>(count_));
264 constexpr auto CPP_fun(size)()(
const
267 auto n = ranges::size(base_);
268 return ranges::min(n,
static_cast<decltype(n)
>(count_));