1#ifndef NEFORCE_CORE_ITERATOR_RANGES_HPP__
2#define NEFORCE_CORE_ITERATOR_RANGES_HPP__
4#ifdef NEFORCE_STANDARD_20
7NEFORCE_BEGIN_NAMESPACE__
11concept Range =
requires(R& r) {
24template <Range R,
typename Adaptor>
25constexpr auto operator|(R&& range, Adaptor&& adaptor) {
31 requires(!View<remove_cvref_t<R>>)
32class ref_view : public
view_base<ref_view<R>> {
36 constexpr explicit ref_view(R& range) noexcept :
39 constexpr auto begin()
const {
return ptr_->
begin(); }
40 constexpr auto end()
const {
return ptr_->end(); }
41 constexpr auto begin() {
return ptr_->begin(); }
42 constexpr auto end() {
return ptr_->end(); }
44 constexpr R& base()
const {
return *ptr_; }
52class owning_view :
public view_base<owning_view<R>> {
57 owning_view() =
default;
60 obj_(_NEFORCE
move(range)) {}
62 owning_view(owning_view&&) =
delete;
63 owning_view& operator=(owning_view&&) =
delete;
65 owning_view(
const owning_view&) =
delete;
66 owning_view& operator=(
const owning_view&) =
delete;
68 constexpr auto begin()
const {
return obj_.begin(); }
69 constexpr auto end()
const {
return obj_.end(); }
70 constexpr auto begin() {
return obj_.begin(); }
71 constexpr auto end() {
return obj_.end(); }
73 constexpr R& base() & {
return obj_; }
74 constexpr const R& base() const& {
return obj_; }
75 constexpr R&& base() && {
return _NEFORCE
move(obj_); }
76 constexpr const R&& base() const&& {
return _NEFORCE
move(obj_); }
80struct all_view_factory {
82 requires View<remove_cvref_t<V>>
83 constexpr auto operator()(V&& v)
const noexcept {
88 requires Range<R> && (!View<remove_cvref_t<R>>)
89 constexpr auto operator()(R& r)
const noexcept {
90 return ref_view<remove_cvref_t<R>>{r};
94 requires Range<R> && (!View<remove_cvref_t<R>>)
96 return owning_view<remove_cvref_t<R>>{_NEFORCE
move(r)};
100NEFORCE_INLINE17
constexpr all_view_factory all{};
103template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
104class filter_iterator {
108 bidirectional_iterator_tag, forward_iterator_tag>;
116 BaseIter base_begin_{};
119 const Pred* pred_ =
nullptr;
121 constexpr void satisfy_predicate_forward() {
122 while (current_ != end_ && !(*pred_)(*current_)) {
127 constexpr void satisfy_predicate_backward() {
128 while (current_ != base_begin_) {
129 if ((*pred_)(*current_)) {
137 constexpr filter_iterator() =
default;
139 constexpr filter_iterator(BaseIter base_begin, BaseIter current, Sentinel
end,
const Pred* pred) :
140 base_begin_(base_begin),
144 satisfy_predicate_forward();
147 constexpr reference operator*()
const {
return *current_; }
148 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
150 constexpr filter_iterator& operator++() {
152 satisfy_predicate_forward();
156 constexpr filter_iterator operator++(
int) {
162 constexpr filter_iterator& operator--()
163 requires bidirectional_iterator<BaseIter>
167 }
while (current_ != base_begin_ && !(*pred_)(*current_));
171 constexpr filter_iterator operator--(
int)
172 requires bidirectional_iterator<BaseIter>
179 constexpr bool operator==(
const filter_iterator& other)
const {
return current_ == other.current_; }
180 constexpr bool operator!=(
const filter_iterator& other)
const {
return !(*
this == other); }
182 template <
typename S>
183 requires(!same_as<S, filter_iterator>)
184 constexpr bool operator==(
const S& s)
const {
185 return current_ == s;
188 template <
typename S>
189 requires(!same_as<S, filter_iterator>)
190 constexpr bool operator!=(
const S& s)
const {
191 return current_ != s;
194 friend constexpr bool operator==(Sentinel s,
const filter_iterator& it) {
return it.current_ == s; }
195 friend constexpr bool operator!=(Sentinel s,
const filter_iterator& it) {
return it.current_ != s; }
197 constexpr bool operator<(
const filter_iterator& other)
const
198 requires totally_ordered<BaseIter>
200 return current_ < other.current_;
202 constexpr bool operator>(
const filter_iterator& other)
const
203 requires totally_ordered<BaseIter>
205 return current_ > other.current_;
207 constexpr bool operator<=(
const filter_iterator& other)
const
208 requires totally_ordered<BaseIter>
210 return current_ <= other.current_;
212 constexpr bool operator>=(
const filter_iterator& other)
const
213 requires totally_ordered<BaseIter>
215 return current_ >= other.current_;
218 constexpr bool operator<(Sentinel s)
const
219 requires totally_ordered_with<BaseIter, Sentinel>
223 constexpr bool operator>(Sentinel s)
const
224 requires totally_ordered_with<BaseIter, Sentinel>
228 constexpr bool operator<=(Sentinel s)
const
229 requires totally_ordered_with<BaseIter, Sentinel>
231 return current_ <= s;
233 constexpr bool operator>=(Sentinel s)
const
234 requires totally_ordered_with<BaseIter, Sentinel>
236 return current_ >= s;
239 friend constexpr bool operator<(Sentinel s,
const filter_iterator& it)
240 requires totally_ordered_with<BaseIter, Sentinel>
242 return s < it.current_;
244 friend constexpr bool operator>(Sentinel s,
const filter_iterator& it)
245 requires totally_ordered_with<BaseIter, Sentinel>
247 return s > it.current_;
249 friend constexpr bool operator<=(Sentinel s,
const filter_iterator& it)
250 requires totally_ordered_with<BaseIter, Sentinel>
252 return s <= it.current_;
254 friend constexpr bool operator>=(Sentinel s,
const filter_iterator& it)
255 requires totally_ordered_with<BaseIter, Sentinel>
257 return s >= it.current_;
260 constexpr difference_type operator-(
const filter_iterator& other)
const noexcept
261 requires sized_sentinel_for<BaseIter, BaseIter>
263 return static_cast<difference_type
>(current_ - other.current_);
266 constexpr BaseIter base()
const {
return current_; }
270template <View V,
typename Pred>
271class filter_view :
public view_base<filter_view<V, Pred>> {
277 using iterator = filter_iterator<base_iterator, base_sentinel, Pred>;
278 using const_iterator = filter_iterator<const_base_iterator, const_base_sentinel, Pred>;
279 using sentinel = base_sentinel;
280 using const_sentinel = const_base_sentinel;
287 constexpr filter_view() =
default;
289 constexpr filter_view(
const filter_view& other)
290 requires copy_constructible<V> && copy_constructible<Pred>
293 pred_(other.pred_) {}
295 constexpr filter_view& operator=(
const filter_view& other)
296 requires copyable<V> && copyable<Pred>
306 constexpr filter_view(filter_view&&) =
default;
312 base_ = _NEFORCE
move(other.base_);
313 pred_ = _NEFORCE
move(other.pred_);
317 constexpr filter_view(V base, Pred pred) :
318 base_(_NEFORCE
move(base)),
319 pred_(_NEFORCE
move(pred)) {}
321 constexpr iterator
begin() {
return iterator(base_.begin(), base_.begin(), base_.end(), &pred_); }
322 constexpr sentinel
end() {
return base_.end(); }
324 constexpr const_iterator
begin() const
325 requires Range<const V>
327 return const_iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
329 constexpr const_sentinel
end() const
330 requires Range<const V>
335 constexpr iterator
end()
336 requires common_range<V>
338 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
340 constexpr const_iterator
end() const
341 requires common_range<const V>
343 return const_iterator(base_.begin(), base_.end(), base_.end(), &pred_);
346 constexpr V base() const&
347 requires copy_constructible<V>
351 constexpr V base() && {
return _NEFORCE
move(base_); }
355template <input_iterator BaseIter,
typename Func>
356class transform_iterator {
358 using iterator_category = forward_iterator_tag;
363 using pointer = void;
365 constexpr transform_iterator() =
default;
367 constexpr transform_iterator(BaseIter current,
const Func* func) :
371 constexpr reference operator*()
const {
return (*func_)(*current_); }
373 constexpr transform_iterator& operator++() {
378 constexpr transform_iterator operator++(
int) {
384 constexpr bool operator==(
const transform_iterator& other)
const {
return current_ == other.current_; }
385 constexpr bool operator!=(
const transform_iterator& other)
const {
return !(*
this == other); }
387 template <
typename S>
388 requires(!same_as<S, transform_iterator>) && sentinel_for<S, BaseIter>
389 constexpr bool operator==(
const S& s)
const {
390 return current_ == s;
392 template <
typename S>
393 requires(!same_as<S, transform_iterator>) && sentinel_for<S, BaseIter>
394 constexpr bool operator!=(
const S& s)
const {
395 return !(current_ == s);
398 template <
typename Sentinel>
399 friend constexpr bool operator==(
const Sentinel& s,
const transform_iterator& it) {
400 return s == it.current_;
402 template <
typename Sentinel>
403 friend constexpr bool operator!=(
const Sentinel& s,
const transform_iterator& it) {
404 return !(s == it.current_);
409 const Func* func_ =
nullptr;
413template <View V,
typename Func>
414class transform_view :
public view_base<transform_view<V, Func>> {
418 using iterator = transform_iterator<base_iterator, Func>;
419 using const_iterator = transform_iterator<const_base_iterator, Func>;
428 constexpr transform_view() =
default;
430 constexpr transform_view(V base, Func func) :
431 base_(_NEFORCE
move(base)),
432 func_(_NEFORCE
move(func)) {}
434 constexpr transform_view(transform_view&&)
435 requires movable<V> && movable<Func>
438 constexpr transform_view& operator=(transform_view&& other) noexcept
439 requires movable<V> && movable<Func>
441 base_ = _NEFORCE
move(other.base_);
442 func_ = _NEFORCE
move(other.func_);
446 constexpr transform_view(
const transform_view& other)
447 requires copy_constructible<V> && copy_constructible<Func>
450 func_(other.func_) {}
452 constexpr transform_view& operator=(
const transform_view& other)
453 requires copyable<V> && copyable<Func>
463 constexpr iterator
begin() {
return iterator(base_.begin(), &func_); }
465 constexpr sentinel
end() {
return base_.end(); }
467 constexpr const_iterator
begin() const
468 requires Range<const V>
470 return const_iterator(base_.begin(), &func_);
473 constexpr const_sentinel
end() const
474 requires Range<const V>
479 constexpr V base() const&
480 requires copy_constructible<V>
484 constexpr V base() && {
return _NEFORCE
move(base_); }
488template <input_iterator BaseIter>
491 using iterator_category = forward_iterator_tag;
497 constexpr take_iterator() =
default;
499 constexpr take_iterator(BaseIter current, difference_type count) :
503 constexpr reference operator*()
const {
return *current_; }
504 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
506 constexpr take_iterator& operator++() {
512 constexpr take_iterator operator++(
int) {
518 constexpr bool operator==(
const take_iterator& other)
const {
519 return current_ == other.current_ || count_ == other.count_;
521 constexpr bool operator!=(
const take_iterator& other)
const {
return !(*
this == other); }
523 template <
typename S>
524 requires(!same_as<S, take_iterator>)
525 constexpr bool operator==(
const S& s)
const {
526 return current_ == s || count_ == 0;
529 template <
typename S>
530 requires(!same_as<S, take_iterator>)
531 constexpr bool operator!=(
const S& s)
const {
532 return !(*
this == s);
535 constexpr const BaseIter& current()
const {
return current_; }
536 constexpr difference_type count()
const {
return count_; }
540 difference_type count_ = 0;
543template <input_iterator BaseIter,
typename BaseSentinel>
546 constexpr take_sentinel() =
default;
552 friend constexpr bool operator==(
const take_iterator<BaseIter>& it,
const take_sentinel& s) {
553 return it.count() == 0 || it.current() == s.base_sen_;
555 friend constexpr bool operator!=(
const take_iterator<BaseIter>& it,
const take_sentinel& s) {
return !(it == s); }
556 friend constexpr bool operator==(
const take_sentinel& s,
const take_iterator<BaseIter>& it) {
return it == s; }
557 friend constexpr bool operator!=(
const take_sentinel& s,
const take_iterator<BaseIter>& it) {
return it != s; }
560 BaseSentinel base_sen_{};
565class take_view :
public view_base<take_view<V>> {
569 using iterator = take_iterator<base_iterator>;
570 using sentinel = take_sentinel<base_iterator, base_sentinel>;
574 using const_iterator = take_iterator<const_base_iterator>;
575 using const_sentinel = take_sentinel<const_base_iterator, const_base_sentinel>;
581 difference_type count_ = 0;
584 constexpr take_view() =
default;
586 constexpr take_view(V base, difference_type
count) :
587 base_(_NEFORCE
move(base)),
590 constexpr take_view(take_view&&)
593 constexpr take_view& operator=(take_view&&)
597 constexpr take_view(const take_view&)
598 requires copy_constructible<V>
600 constexpr take_view& operator=(const take_view&)
604 constexpr iterator begin() {
return iterator(base_.begin(), count_); }
605 constexpr sentinel
end() {
return sentinel(base_.end(), 0); }
607 constexpr const_iterator
begin() const
608 requires Range<const V>
610 return const_iterator(base_.begin(), count_);
612 constexpr const_sentinel
end() const
613 requires Range<const V>
615 return const_sentinel(base_.end(), 0);
618 constexpr V base() const&
619 requires copy_constructible<V>
623 constexpr V base() && {
return _NEFORCE
move(base_); }
630template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
631class take_while_iterator {
633 using iterator_category = forward_iterator_tag;
639 constexpr take_while_iterator() =
default;
641 constexpr take_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred) :
645 done_(current ==
end || !(*pred)(*current)) {}
647 constexpr reference operator*()
const {
return *current_; }
649 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
651 constexpr take_while_iterator& operator++() {
653 if (current_ == end_ || !(*pred_)(*current_)) {
659 constexpr take_while_iterator operator++(
int) {
665 constexpr bool operator==(
const take_while_iterator& other)
const {
666 return current_ == other.current_ && done_ == other.done_;
668 constexpr bool operator!=(
const take_while_iterator& other)
const {
return !(*
this == other); }
670 template <
typename S>
671 requires(!same_as<S, take_while_iterator>)
672 constexpr bool operator==(
const S& s)
const {
673 return done_ || current_ == s;
675 template <
typename S>
676 requires(!same_as<S, take_while_iterator>)
677 constexpr bool operator!=(
const S& s)
const {
678 return !(*
this == s);
681 template <
typename S>
682 friend constexpr bool operator==(
const S& s,
const take_while_iterator& t) {
683 return t.done_ || t.current_ == s;
686 template <
typename S>
687 friend constexpr bool operator!=(
const S& s,
const take_while_iterator& t) {
694 const Pred* pred_ =
nullptr;
698template <View V,
typename Pred>
699class take_while_view :
public view_base<take_while_view<V, Pred>> {
705 using iterator = take_while_iterator<base_iterator, base_sentinel, Pred>;
706 using const_iterator = take_while_iterator<const_base_iterator, const_base_sentinel, Pred>;
707 using sentinel = base_sentinel;
708 using const_sentinel = const_base_sentinel;
715 constexpr take_while_view() =
default;
717 constexpr take_while_view(V base, Pred pred) :
718 base_(_NEFORCE
move(base)),
719 pred_(_NEFORCE
move(pred)) {}
721 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end(), &pred_); }
722 constexpr sentinel
end() {
return base_.end(); }
724 constexpr const_iterator
begin() const
725 requires Range<const V>
727 return const_iterator(base_.begin(), base_.end(), &pred_);
729 constexpr const_sentinel
end() const
730 requires Range<const V>
735 constexpr V base() const&
736 requires copy_constructible<V>
740 constexpr V base() && {
return _NEFORCE
move(base_); }
743template <
typename V,
typename Pred>
744take_while_view(V&&, Pred) -> take_while_view<V, Pred>;
748class drop_view :
public view_base<drop_view<V>> {
758 difference_type count_ = 0;
761 constexpr drop_view() =
default;
763 constexpr drop_view(V base, difference_type
count) :
764 base_(_NEFORCE
move(base)),
767 constexpr drop_view(drop_view&&)
770 constexpr drop_view& operator=(drop_view&&)
774 constexpr drop_view(const drop_view&)
775 requires copy_constructible<V>
777 constexpr drop_view& operator=(const drop_view&)
781 constexpr iterator begin() {
782 auto it = base_.begin();
783 auto end = base_.end();
785 while (n > 0 && it != end) {
792 constexpr sentinel
end() {
return base_.end(); }
794 constexpr const_iterator
begin() const
795 requires Range<const V>
797 auto it = base_.begin();
798 auto end = base_.end();
800 while (n > 0 && it != end) {
807 constexpr const_sentinel
end() const
808 requires Range<const V>
813 constexpr V base() const&
814 requires copy_constructible<V>
818 constexpr V base() && {
return _NEFORCE
move(base_); }
825template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
826class drop_while_iterator {
828 using iterator_category = forward_iterator_tag;
834 constexpr drop_while_iterator() =
default;
836 constexpr drop_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred) :
840 satisfy_predicate_forward();
843 constexpr reference operator*()
const {
return *current_; }
845 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
847 constexpr drop_while_iterator& operator++() {
852 constexpr drop_while_iterator operator++(
int) {
858 constexpr bool operator==(
const drop_while_iterator& other)
const {
return current_ == other.current_; }
859 constexpr bool operator!=(
const drop_while_iterator& other)
const {
return !(*
this == other); }
861 template <
typename S>
862 requires(!same_as<S, drop_while_iterator>)
863 constexpr bool operator==(
const S& s)
const {
864 return current_ == s;
866 template <
typename S>
867 requires(!same_as<S, drop_while_iterator>)
868 constexpr bool operator!=(
const S& s)
const {
869 return !(*
this == s);
872 template <
typename S>
873 friend constexpr bool operator==(
const S& s,
const drop_while_iterator& t) {
874 return t.current_ == s;
877 template <
typename S>
878 friend constexpr bool operator!=(
const S& s,
const drop_while_iterator& t) {
879 return t.current_ != s;
883 constexpr void satisfy_predicate_forward() {
888 while (current_ != end_ && (*pred_)(*current_)) {
895 const Pred* pred_ =
nullptr;
896 bool started_ =
false;
899template <View V,
typename Pred>
900class drop_while_view :
public view_base<drop_while_view<V, Pred>> {
906 using iterator = drop_while_iterator<base_iterator, base_sentinel, Pred>;
907 using const_iterator = drop_while_iterator<const_base_iterator, const_base_sentinel, Pred>;
908 using sentinel = base_sentinel;
909 using const_sentinel = const_base_sentinel;
916 constexpr drop_while_view() =
default;
918 constexpr drop_while_view(V base, Pred pred) :
919 base_(_NEFORCE
move(base)),
920 pred_(_NEFORCE
move(pred)) {}
922 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end(), &pred_); }
923 constexpr sentinel
end() {
return base_.end(); }
925 constexpr const_iterator
begin() const
926 requires Range<const V>
928 return const_iterator(base_.begin(), base_.end(), &pred_);
930 constexpr const_sentinel
end() const
931 requires Range<const V>
936 constexpr V base() const&
937 requires copy_constructible<V>
941 constexpr V base() && {
return _NEFORCE
move(base_); }
944template <
typename V,
typename Pred>
945drop_while_view(V&&, Pred) -> drop_while_view<V, Pred>;
948template <b
idirectional_iterator Iter>
949class reverse_iterator {
993 constexpr bool operator==(
const reverse_iterator& other)
const {
return current_ == other.current_; }
995 constexpr bool operator!=(
const reverse_iterator& other)
const {
return !(*
this == other); }
1003class reverse_view : public
view_base<reverse_view<V>> {
1014 constexpr reverse_view() =
default;
1015 constexpr explicit reverse_view(V base) :
1016 base_(_NEFORCE
move(base)) {}
1018 constexpr reverse_view(reverse_view&&)
1021 constexpr reverse_view& operator=(reverse_view&&)
1025 constexpr reverse_view(const reverse_view&)
1028 constexpr reverse_view& operator=(const reverse_view&)
1032 constexpr iterator
begin() {
return iterator(base_.end()); }
1033 constexpr iterator
end() {
return iterator(base_.begin()); }
1036 requires Range<const V>
1041 requires Range<const V>
1046 constexpr V base() const&
1051 constexpr V base() && {
return _NEFORCE
move(base_); }
1054template <
typename V>
1055reverse_view(V&&) -> reverse_view<V>;
1058template <
typename T>
1059class iota_iterator {
1061 using iterator_category = forward_iterator_tag;
1062 using value_type = T;
1064 using pointer =
const T*;
1065 using reference = T;
1067 constexpr iota_iterator() =
default;
1068 constexpr explicit iota_iterator(T value) :
1071 constexpr reference operator*()
const {
return value_; }
1072 constexpr pointer operator->()
const {
return &value_; }
1074 constexpr iota_iterator& operator++() {
1079 constexpr iota_iterator operator++(
int) {
1085 constexpr bool operator==(
const iota_iterator& other)
const {
return value_ == other.value_; }
1086 constexpr bool operator!=(
const iota_iterator& other)
const {
return value_ != other.value_; }
1088 constexpr bool operator<(
const iota_iterator& other)
const
1089 requires totally_ordered<T>
1091 return value_ < other.value_;
1098template <
typename T>
1099class iota_sentinel {
1101 bool has_bound_ =
false;
1102 iota_iterator<T> bound_iter_;
1105 constexpr iota_sentinel() noexcept = default;
1106 constexpr explicit iota_sentinel(T bound) noexcept :
1108 bound_iter_(bound) {}
1110 friend constexpr bool operator==(
const iota_iterator<T>& it,
const iota_sentinel& s)
noexcept {
1111 return s.has_bound_ && it == s.bound_iter_;
1113 friend constexpr bool operator!=(
const iota_iterator<T>& it,
const iota_sentinel& s)
noexcept {
return !(it == s); }
1114 friend constexpr bool operator==(
const iota_sentinel& s,
const iota_iterator<T>& it)
noexcept {
return it == s; }
1115 friend constexpr bool operator!=(
const iota_sentinel& s,
const iota_iterator<T>& it)
noexcept {
return !(it == s); }
1118template <
typename T>
1119class iota_view :
public view_base<iota_view<T>> {
1121 using iterator = iota_iterator<T>;
1122 using sentinel = iota_sentinel<T>;
1124 constexpr iota_view() =
default;
1125 constexpr explicit iota_view(T start) :
1127 constexpr iota_view(T start, T bound) :
1132 constexpr iterator
begin()
const {
return iterator(start_); }
1133 constexpr sentinel
end()
const {
return has_bound_ ? sentinel(bound_) : sentinel(); }
1138 bool has_bound_ =
false;
1141template <
typename T>
1142iota_view(T) -> iota_view<T>;
1144template <
typename T>
1145iota_view(T, T) -> iota_view<T>;
1148template <
typename T>
1149class repeat_iterator {
1151 using iterator_category = forward_iterator_tag;
1152 using value_type = T;
1154 using pointer =
const T*;
1155 using reference =
const T&;
1157 constexpr repeat_iterator() =
default;
1158 constexpr repeat_iterator(
const T* value, difference_type count) :
1162 constexpr reference operator*()
const {
return *value_; }
1163 constexpr pointer operator->()
const {
return value_; }
1165 constexpr repeat_iterator& operator++() {
1172 constexpr repeat_iterator operator++(
int) {
1178 constexpr bool operator==(
const repeat_iterator& other)
const {
return count_ == other.count_; }
1179 constexpr bool operator!=(
const repeat_iterator& other)
const {
return count_ != other.count_; }
1181 NEFORCE_NODISCARD
ptrdiff_t count() const noexcept {
return count_; }
1184 const T* value_ =
nullptr;
1185 difference_type count_ = 0;
1188template <
typename T>
1189class repeat_sentinel {
1190 bool has_bound_ =
false;
1194 constexpr repeat_sentinel() noexcept = default;
1195 constexpr explicit repeat_sentinel(
ptrdiff_t bound) noexcept :
1197 bound_count_(bound) {}
1199 friend constexpr bool operator==(
const repeat_iterator<T>& it,
const repeat_sentinel& s)
noexcept {
1201 return it.count() <= s.bound_count_;
1206 friend constexpr bool operator!=(
const repeat_iterator<T>& it,
const repeat_sentinel& s)
noexcept {
1209 friend constexpr bool operator==(
const repeat_sentinel& s,
const repeat_iterator<T>& it)
noexcept {
1212 friend constexpr bool operator!=(
const repeat_sentinel& s,
const repeat_iterator<T>& it)
noexcept {
1217template <
typename T>
1218class repeat_view :
public view_base<repeat_view<T>> {
1220 using iterator = repeat_iterator<T>;
1221 using sentinel = repeat_sentinel<T>;
1224 constexpr repeat_view() =
default;
1226 constexpr explicit repeat_view(T value) :
1227 value_(_NEFORCE
move(value)) {}
1229 constexpr repeat_view(T value,
const difference_type
count) :
1230 value_(_NEFORCE
move(value)),
1234 constexpr iterator
begin()
const {
return has_bound_ ? iterator(&value_, count_) : iterator(&value_, -1); }
1235 constexpr sentinel
end()
const {
return has_bound_ ? sentinel(0) : sentinel(); }
1239 difference_type count_ = 0;
1240 bool has_bound_ =
false;
1243template <
typename T>
1244repeat_view(T) -> repeat_view<T>;
1246template <
typename T,
typename N>
1247repeat_view(T, N) -> repeat_view<T>;
1250template <
typename OuterIter,
typename OuterSentinel>
1251class join_iterator {
1259 using iterator_category = forward_iterator_tag;
1265 constexpr join_iterator() =
default;
1267 constexpr join_iterator(OuterIter outer_current, OuterSentinel outer_end) :
1268 outer_current_(outer_current),
1269 outer_end_(outer_end) {
1270 if (outer_current_ != outer_end_) {
1271 inner_current_ = (*outer_current_).begin();
1272 inner_end_ = (*outer_current_).end();
1277 constexpr reference operator*()
const {
return *inner_current_; }
1278 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*inner_current_); }
1280 constexpr join_iterator& operator++() {
1286 constexpr join_iterator operator++(
int) {
1292 constexpr bool operator==(
const join_iterator& other)
const {
1293 return outer_current_ == other.outer_current_ &&
1294 (outer_current_ == outer_end_ || inner_current_ == other.inner_current_);
1296 constexpr bool operator!=(
const join_iterator& other)
const {
return !(*
this == other); }
1299 constexpr void satisfy() {
1300 while (outer_current_ != outer_end_ && inner_current_ == inner_end_) {
1302 if (outer_current_ != outer_end_) {
1303 inner_current_ = (*outer_current_).begin();
1304 inner_end_ = (*outer_current_).end();
1309 OuterIter outer_current_{};
1310 OuterSentinel outer_end_{};
1311 inner_iterator inner_current_{};
1312 inner_sentinel inner_end_{};
1316 requires Range<iter_reference_t<decltype(_NEFORCE declval<V>().begin())>>
1317class join_view : public
view_base<join_view<V>> {
1319 using outer_iterator =
decltype(_NEFORCE
declval<V>().begin());
1320 using outer_sentinel =
decltype(_NEFORCE
declval<V>().end());
1321 using iterator = join_iterator<outer_iterator, outer_sentinel>;
1323 constexpr join_view() =
default;
1324 constexpr explicit join_view(V base) :
1325 base_(_NEFORCE
move(base)) {}
1327 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end()); }
1328 constexpr iterator
end() {
return iterator(base_.end(), base_.end()); }
1330 constexpr iterator
begin() const
1331 requires Range<const V>
1333 return iterator(base_.begin(), base_.end());
1335 constexpr iterator
end() const
1336 requires Range<const V>
1338 return iterator(base_.end(), base_.end());
1341 constexpr V base() const&
1346 constexpr V base() && {
return _NEFORCE
move(base_); }
1352template <
typename V>
1353join_view(V&&) -> join_view<V>;
1356template <
size_t N,
typename BaseIter>
1357class element_iterator {
1361 using iterator_category = forward_iterator_tag;
1365 using reference = element_type;
1367 constexpr element_iterator() =
default;
1368 constexpr explicit element_iterator(BaseIter current) :
1369 current_(current) {}
1371 constexpr reference operator*()
const {
return _NEFORCE
get<N>(*current_); }
1373 constexpr pointer operator->()
const {
return _NEFORCE
addressof(_NEFORCE
get<N>(*current_)); }
1375 constexpr element_iterator& operator++() {
1380 constexpr element_iterator operator++(
int) {
1386 constexpr bool operator==(
const element_iterator& other)
const {
return current_ == other.current_; }
1387 constexpr bool operator!=(
const element_iterator& other)
const {
return current_ != other.current_; }
1389 template <
typename S>
1390 requires(!same_as<S, element_iterator>) && sentinel_for<S, BaseIter>
1391 constexpr bool operator==(
const S& s)
const {
1392 return current_ == s;
1394 template <
typename S>
1395 requires(!same_as<S, element_iterator>) && sentinel_for<S, BaseIter>
1396 constexpr bool operator!=(
const S& s)
const {
1397 return current_ != s;
1401 BaseIter current_{};
1404template <
size_t N, View V>
1405class element_view :
public view_base<element_view<N, V>> {
1407 using base_iterator =
decltype(_NEFORCE
declval<V>().begin());
1408 using base_sentinel =
decltype(_NEFORCE
declval<V>().end());
1409 using iterator = element_iterator<N, base_iterator>;
1410 using sentinel = base_sentinel;
1412 constexpr element_view() =
default;
1413 constexpr explicit element_view(V base) :
1414 base_(_NEFORCE
move(base)) {}
1416 constexpr iterator
begin() {
return iterator(base_.begin()); }
1417 constexpr sentinel
end() {
return base_.end(); }
1419 constexpr iterator
begin() const
1420 requires Range<const V>
1422 return iterator(base_.begin());
1424 constexpr sentinel
end() const
1425 requires Range<const V>
1430 constexpr V base() const&
1431 requires copy_constructible<V>
1435 constexpr V base() && {
return _NEFORCE
move(base_); }
1443 requires(!common_range<V>)
1444class common_view : public
view_base<common_view<V>> {
1446 using base_iterator =
decltype(_NEFORCE
declval<V>().begin());
1447 using base_sentinel =
decltype(_NEFORCE
declval<V>().end());
1448 using iterator = base_iterator;
1449 using sentinel = base_iterator;
1451 constexpr common_view() =
default;
1452 constexpr explicit common_view(V base) :
1453 base_(_NEFORCE
move(base)) {}
1455 constexpr iterator
begin() {
return base_.begin(); }
1457 constexpr iterator
end() {
1458 auto it = base_.begin();
1459 auto sen = base_.end();
1466 constexpr iterator
begin() const
1467 requires Range<const V>
1469 return base_.begin();
1472 constexpr iterator
end() const
1473 requires Range<const V>
1475 auto it = base_.begin();
1476 auto sen = base_.end();
1483 constexpr V base() const&
1488 constexpr V base() && {
return _NEFORCE
move(base_); }
1494template <
typename V>
1495common_view(V&&) -> common_view<V>;
1498template <
typename Iter>
1499class counted_iterator {
1501 using iterator_category = forward_iterator_tag;
1507 constexpr counted_iterator() =
default;
1508 constexpr counted_iterator(Iter current, difference_type count) :
1512 constexpr reference operator*()
const {
return *current_; }
1513 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
1515 constexpr counted_iterator& operator++() {
1521 constexpr counted_iterator operator++(
int) {
1527 constexpr bool operator==(
const counted_iterator& other)
const {
return count_ == other.count_; }
1528 constexpr bool operator!=(
const counted_iterator& other)
const {
return count_ != other.count_; }
1530 constexpr Iter base()
const {
return current_; }
1531 constexpr difference_type count()
const {
return count_; }
1535 difference_type count_ = 0;
1538template <
typename Iter>
1539class counted_view :
public view_base<counted_view<Iter>> {
1541 using iterator = counted_iterator<Iter>;
1544 constexpr counted_view() =
default;
1545 constexpr counted_view(Iter iter, difference_type
count) :
1549 constexpr iterator
begin()
const {
return iterator(iter_, count_); }
1550 constexpr iterator
end()
const {
return iterator(iter_, 0); }
1554 difference_type count_ = 0;
1557template <
typename Iter,
typename N>
1558counted_view(Iter, N) -> counted_view<Iter>;
1561template <
bool IsConst, View V1, View V2>
1562struct concat_iterator {
1570 using iterator_category = forward_iterator_tag;
1573 using pointer = void;
1576 iterator1 current1_;
1578 iterator2 current2_;
1580 bool in_first_ =
true;
1582 concat_iterator() =
default;
1584 concat_iterator(iterator1 first1, iterator1 last1, iterator2 first2, iterator2 last2) :
1589 if (current1_ == end1_) {
1594 reference operator*()
const {
return in_first_ ? *current1_ : *current2_; }
1596 concat_iterator& operator++() {
1599 if (current1_ == end1_) {
1608 concat_iterator operator++(
int) {
1614 bool operator==(
const concat_iterator& other)
const {
1615 if (in_first_ != other.in_first_) {
1619 return current1_ == other.current1_;
1621 return current2_ == other.current2_;
1624 bool operator!=(
const concat_iterator& other)
const {
return !(*
this == other); }
1627template <View V1, View V2>
1628class concat_view :
public view_base<concat_view<V1, V2>> {
1632 using iterator = concat_iterator<false, V1, V2>;
1633 using const_iterator = concat_iterator<true, V1, V2>;
1636 concat_view() =
default;
1637 concat_view(V1 v1, V2 v2) :
1638 v1_(_NEFORCE
move(v1)),
1639 v2_(_NEFORCE
move(v2)) {}
1641 auto begin() {
return iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end()); }
1642 auto end() {
return iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end()); }
1643 auto begin()
const {
return const_iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end()); }
1644 auto end()
const {
return const_iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end()); }
1648template <
typename Iterator>
1649class subrange_view :
public view_base<subrange_view<Iterator>> {
1654 subrange_view() =
default;
1655 subrange_view(Iterator first, Iterator last) :
1659 Iterator
begin()
const {
return first_; }
1660 Iterator
end()
const {
return last_; }
1664template <
bool IsConst, View V,
typename T>
1665struct split_iterator {
1678 bool trailing_empty_ =
false;
1680 using iterator_category = forward_iterator_tag;
1681 using value_type = subrange_view<iterator>;
1683 using pointer = void;
1684 using reference = value_type;
1686 split_iterator() =
default;
1688 split_iterator(iterator cur, sentinel
end, T delim) :
1691 delimiter_(delim) {}
1693 value_type operator*()
const {
1694 if (trailing_empty_) {
1695 return value_type{end_, end_};
1697 iterator start = current_;
1698 iterator iter = current_;
1699 while (iter != end_ && !(*iter == delimiter_)) {
1702 return value_type{start, iter};
1705 split_iterator& operator++() {
1706 if (current_ == end_) {
1707 trailing_empty_ =
false;
1711 iterator
next = current_;
1712 while (
next != end_ && !(*
next == delimiter_)) {
1718 trailing_empty_ = (
next == end_);
1720 trailing_empty_ =
false;
1727 split_iterator operator++(
int) {
1733 bool operator==(
const split_iterator& other)
const {
1734 return current_ == other.current_ && trailing_empty_ == other.trailing_empty_;
1736 bool operator!=(
const split_iterator& other)
const {
return !(*
this == other); }
1739template <View V,
typename T>
1740class split_view :
public view_base<split_view<V, T>> {
1745 using iterator = split_iterator<false, V, T>;
1746 using const_iterator = split_iterator<true, V, T>;
1748 split_view() =
default;
1750 split_view(V base, T delimiter) :
1751 base_(_NEFORCE
move(base)),
1752 delimiter_(delimiter) {}
1754 iterator
begin() {
return iterator{base_.begin(), base_.end(), delimiter_}; }
1755 iterator
end() {
return iterator{base_.end(), base_.end(), delimiter_}; }
1757 const_iterator
begin()
const {
return const_iterator{base_.begin(), base_.end(), delimiter_}; }
1758 const_iterator
end()
const {
return const_iterator{base_.end(), base_.end(), delimiter_}; }
1763class slice_view :
public view_base<slice_view<V>> {
1775 difference_type start_;
1776 difference_type end_;
1777 mutable cache_t cache_;
1778 mutable bool has_value_ =
false;
1780 void ensure_cache()
const {
1788 for (
auto i = 0; i < start_ && b != e; ++i, ++b) {
1792 auto n = end_ - start_;
1793 for (
auto i = 0; i < n && b != e; ++i, ++b) {
1797 cache_ = {begin_it, end_it};
1802 slice_view() =
default;
1804 constexpr slice_view(V base, difference_type start, difference_type end) :
1805 base_(_NEFORCE
move(base)),
1811 return cache_.begin_;
1818 iterator
begin() const
1819 requires Range<const V>
1822 return cache_.begin_;
1824 iterator
end() const
1825 requires Range<const V>
1833template <
typename Derived>
1834struct range_adaptor_closure {
1836 constexpr range_adaptor_closure() noexcept = default;
1839 template <typename OtherClosure>
1840 friend constexpr auto operator|(range_adaptor_closure<Derived> lhs, range_adaptor_closure<OtherClosure> rhs) {
1841 return [lhs =
static_cast<const Derived&
>(lhs), rhs =
static_cast<const OtherClosure&
>(rhs)](
auto&& range) {
1848NEFORCE_BEGIN_RANGES_VIEWS__
1852 constexpr auto operator()(R&& range)
const {
1857NEFORCE_INLINE17
constexpr all_adaptor all;
1860template <
typename Pred>
1861struct filter_adaptor_closure : range_adaptor_closure<filter_adaptor_closure<Pred>> {
1864 constexpr explicit filter_adaptor_closure(Pred p) :
1865 pred(_NEFORCE
move(p)) {}
1868 constexpr auto operator()(R&& range)
const {
1869 return filter_view{all(_NEFORCE
forward<R>(range)), pred};
1873struct filter_adaptor {
1874 template <
typename Pred>
1875 constexpr auto operator()(Pred pred)
const {
1876 return filter_adaptor_closure<Pred>{_NEFORCE
move(pred)};
1879 template <Range R,
typename Pred>
1880 constexpr auto operator()(R&& range, Pred pred)
const {
1881 return filter_view{all(_NEFORCE
forward<R>(range)), _NEFORCE
move(pred)};
1885NEFORCE_INLINE17
constexpr filter_adaptor filter;
1888template <
typename Func>
1889struct transform_adaptor_closure : range_adaptor_closure<transform_adaptor_closure<Func>> {
1892 constexpr explicit transform_adaptor_closure(Func f) :
1893 func(_NEFORCE
move(f)) {}
1896 constexpr auto operator()(R&& range)
const {
1897 return transform_view{all(_NEFORCE
forward<R>(range)), func};
1901struct transform_adaptor {
1902 template <
typename Func>
1903 constexpr auto operator()(Func func)
const {
1904 return transform_adaptor_closure<Func>{_NEFORCE
move(func)};
1907 template <Range R,
typename Func>
1908 constexpr auto operator()(R&& range, Func func)
const {
1909 return transform_view{all(_NEFORCE
forward<R>(range)), _NEFORCE
move(func)};
1913NEFORCE_INLINE17
constexpr transform_adaptor transform;
1916template <
typename DiffType>
1917struct take_adaptor_closure : range_adaptor_closure<take_adaptor_closure<DiffType>> {
1920 constexpr explicit take_adaptor_closure(DiffType n) :
1924 constexpr auto operator()(R&& range)
const {
1925 return take_view{all(_NEFORCE
forward<R>(range)), count};
1929struct take_adaptor {
1930 template <
typename N>
1932 constexpr auto operator()(N
count)
const {
1933 return take_adaptor_closure<N>{
count};
1936 template <Range R,
typename N>
1938 constexpr auto operator()(R&& range, N
count)
const {
1943NEFORCE_INLINE17
constexpr take_adaptor take;
1946template <
typename Pred>
1947struct take_while_adaptor_closure : range_adaptor_closure<take_while_adaptor_closure<Pred>> {
1950 constexpr explicit take_while_adaptor_closure(Pred p) :
1951 pred(_NEFORCE
move(p)) {}
1954 constexpr auto operator()(R&& range)
const {
1955 return take_while_view{all(_NEFORCE
forward<R>(range)), pred};
1959struct take_while_adaptor {
1960 template <
typename Pred>
1961 constexpr auto operator()(Pred pred)
const {
1962 return take_while_adaptor_closure<Pred>{_NEFORCE
move(pred)};
1965 template <Range R,
typename Pred>
1966 constexpr auto operator()(R&& range, Pred pred)
const {
1967 return take_while_view{all(_NEFORCE
forward<R>(range)), _NEFORCE
move(pred)};
1971NEFORCE_INLINE17
constexpr take_while_adaptor take_while;
1974template <
typename DiffType>
1975struct drop_adaptor_closure : range_adaptor_closure<drop_adaptor_closure<DiffType>> {
1978 constexpr explicit drop_adaptor_closure(DiffType n) :
1982 constexpr auto operator()(R&& range)
const {
1983 return drop_view{all(_NEFORCE
forward<R>(range)), count};
1987struct drop_adaptor {
1988 template <
typename N>
1990 constexpr auto operator()(N
count)
const {
1991 return drop_adaptor_closure<N>{
count};
1994 template <Range R,
typename N>
1996 constexpr auto operator()(R&& range, N
count)
const {
2001NEFORCE_INLINE17
constexpr drop_adaptor drop;
2004template <
typename Pred>
2005struct drop_while_adaptor_closure : range_adaptor_closure<drop_while_adaptor_closure<Pred>> {
2008 constexpr explicit drop_while_adaptor_closure(Pred p) :
2009 pred(_NEFORCE
move(p)) {}
2012 constexpr auto operator()(R&& range)
const {
2013 return drop_while_view{all(_NEFORCE
forward<R>(range)), pred};
2017struct drop_while_adaptor {
2018 template <
typename Pred>
2019 constexpr auto operator()(Pred pred)
const {
2020 return drop_while_adaptor_closure<Pred>{_NEFORCE
move(pred)};
2023 template <Range R,
typename Pred>
2024 constexpr auto operator()(R&& range, Pred pred)
const {
2025 return drop_while_view{all(_NEFORCE
forward<R>(range)), _NEFORCE
move(pred)};
2029NEFORCE_INLINE17
constexpr drop_while_adaptor drop_while;
2032struct reverse_adaptor_closure : range_adaptor_closure<reverse_adaptor_closure> {
2034 reverse_adaptor_closure() noexcept = default;
2037 requires bidirectional_iterator<decltype(_NEFORCE
declval<R>().
begin())>
2038 constexpr auto operator()(R&& range)
const {
2039 return reverse_view{all(_NEFORCE
forward<R>(range))};
2043struct reverse_adaptor {
2044 constexpr auto operator()()
const {
return reverse_adaptor_closure{}; }
2047 requires bidirectional_iterator<decltype(_NEFORCE declval<R>().begin())>
2048 constexpr auto operator()(R&& range)
const {
2049 return reverse_view{all(_NEFORCE
forward<R>(range))};
2053NEFORCE_INLINE17
constexpr reverse_adaptor reverse;
2056struct iota_adaptor {
2057 template <
typename T>
2058 constexpr auto operator()(T start)
const {
2059 return iota_view<T>{start};
2062 template <
typename T>
2063 constexpr auto operator()(T start, T bound)
const {
2064 return iota_view<T>{start, bound};
2068NEFORCE_INLINE17
constexpr iota_adaptor iota;
2071struct repeat_adaptor {
2072 template <
typename T>
2073 constexpr auto operator()(T value)
const {
2074 return repeat_view<T>{_NEFORCE
move(value)};
2077 template <
typename T,
typename N>
2079 constexpr auto operator()(T value, N
count)
const {
2084NEFORCE_INLINE17
constexpr repeat_adaptor repeat;
2087struct join_adaptor_closure : range_adaptor_closure<join_adaptor_closure> {
2089 join_adaptor_closure() noexcept = default;
2093 constexpr auto operator()(R&& range)
const {
2094 return join_view{all(_NEFORCE
forward<R>(range))};
2098struct join_adaptor {
2099 constexpr auto operator()()
const {
return join_adaptor_closure{}; }
2102 requires Range<iter_reference_t<decltype(_NEFORCE declval<R>().begin())>>
2103 constexpr auto operator()(R&& range)
const {
2104 return join_view{all(_NEFORCE
forward<R>(range))};
2108NEFORCE_INLINE17
constexpr join_adaptor join;
2112struct elements_adaptor_closure : range_adaptor_closure<elements_adaptor_closure<N>> {
2114 elements_adaptor_closure() noexcept = default;
2117 constexpr auto operator()(R&& range)
const {
2118 return element_view<N, decltype(all(_NEFORCE forward<R>(range)))>{all(_NEFORCE
forward<R>(range))};
2123struct elements_adaptor {
2124 constexpr auto operator()()
const {
return elements_adaptor_closure<N>{}; }
2127 constexpr auto operator()(R&& range)
const {
2128 return element_view<N, decltype(all(_NEFORCE forward<R>(range)))>{all(_NEFORCE
forward<R>(range))};
2133NEFORCE_INLINE17
constexpr elements_adaptor<N> elements;
2135NEFORCE_INLINE17
constexpr auto keys = elements<0>;
2136NEFORCE_INLINE17
constexpr auto values = elements<1>;
2139struct common_adaptor_closure : range_adaptor_closure<common_adaptor_closure> {
2141 common_adaptor_closure() noexcept = default;
2144 constexpr auto operator()(R&& range)
const {
2145 if constexpr (common_range<R>) {
2148 return common_view{all(_NEFORCE
forward<R>(range))};
2153struct common_adaptor {
2154 constexpr auto operator()()
const {
return common_adaptor_closure{}; }
2157 constexpr auto operator()(R&& range)
const {
2158 if constexpr (common_range<R>) {
2161 return common_view{all(_NEFORCE
forward<R>(range))};
2166NEFORCE_INLINE17
constexpr common_adaptor common;
2169struct counted_adaptor {
2170 template <
typename Iter,
typename N>
2172 constexpr auto operator()(Iter iter, N
count)
const {
2177NEFORCE_INLINE17
constexpr counted_adaptor counted;
2180template <
typename V2>
2181struct concat_adaptor_closure : range_adaptor_closure<concat_adaptor_closure<V2>> {
2183 using view_type =
decltype(all(_NEFORCE
declval<V2>()));
2189 concat_adaptor_closure() noexcept = default;
2191 constexpr explicit concat_adaptor_closure(V2&& v2) :
2192 view_(all(_NEFORCE
forward<V2>(v2))) {}
2194 template <
typename V>
2196 constexpr auto operator()(V&& v)
const {
2197 return concat_view{all(_NEFORCE
forward<V>(v)), view_};
2201struct concat_adaptor {
2202 template <
typename V2>
2203 constexpr auto operator()(V2&& v2)
const {
2204 return concat_adaptor_closure<V2>{_NEFORCE
forward<V2>(v2)};
2207 template <
typename V1,
typename V2>
2208 constexpr auto operator()(V1&& v1, V2&& v2)
const {
2213NEFORCE_INLINE17
constexpr concat_adaptor concat;
2216template <
typename T>
2217struct split_adaptor_closure : range_adaptor_closure<split_adaptor_closure<T>> {
2222 split_adaptor_closure() noexcept = default;
2224 constexpr explicit split_adaptor_closure(T d) :
2228 constexpr auto operator()(R&& range)
const {
2229 return split_view{all(_NEFORCE
forward<R>(range)), delim_};
2233struct split_adaptor {
2234 template <
typename T>
2235 constexpr auto operator()(T delim)
const {
2236 return split_adaptor_closure<T>{delim};
2239 template <Range R,
typename T>
2240 constexpr auto operator()(R&& range, T delim)
const {
2241 return split_view{all(_NEFORCE
forward<R>(range)), delim};
2245NEFORCE_INLINE17
constexpr split_adaptor split;
2248struct slice_adaptor_closure : range_adaptor_closure<slice_adaptor_closure> {
2254 slice_adaptor_closure() noexcept = default;
2261 constexpr auto operator()(R&& range)
const {
2262 return slice_view{all(_NEFORCE
forward<R>(range)), start_, end_};
2266struct slice_adaptor {
2271 return slice_view{all(_NEFORCE
forward<R>(range)), start,
end};
2275NEFORCE_INLINE17
constexpr slice_adaptor slice;
2277NEFORCE_END_RANGES_VIEWS__
2280NEFORCE_END_NAMESPACE__
constexpr reverse_iterator()=default
默认构造函数
constexpr reference operator*() const noexcept(is_nothrow_copy_assignable< Iterator >::value &&noexcept(*--(_NEFORCE declval< Iterator & >())))
解引用运算符
constexpr pointer operator->() const noexcept(is_nothrow_copy_constructible< Iterator >::value &&noexcept(--(_NEFORCE declval< Iterator & >())) &&is_nothrow_arrow< Iterator &, pointer >::value)
成员访问运算符
constexpr reverse_iterator & operator++() noexcept(noexcept(--current))
前缀递增运算符
constexpr reverse_iterator & operator--() noexcept(noexcept(++current))
前缀递减运算符
typename add_pointer< T >::type add_pointer_t
add_pointer的便捷别名
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr T * addressof(T &x) noexcept
获取对象的地址
enable_if_t< is_void_v< T >, future_result_t< T > > get(future< T > &f)
通用future结果获取函数
constexpr bool is_integral_v
is_integral的便捷变量模板
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
typename inner::__invoke_result_aux< F, Args... >::type invoke_result_t
invoke_result的便捷别名
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
typename iterator_traits< Iterator >::reference iter_reference_t
获取迭代器的引用类型
typename iterator_traits< Iterator >::iterator_category iter_category_t
获取迭代器的类别标签
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
typename remove_const< T >::type remove_const_t
remove_const的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
typename common_type< Types... >::type common_type_t
common_type的便捷别名
typename common_reference< Types... >::type common_reference_t
common_reference的便捷别名
constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
constexpr bool is_move_assignable_v
is_move_assignable的便捷变量模板
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
constexpr decltype(auto) end() const
constexpr decltype(auto) begin() const
获取范围的起始const迭代器