1#ifndef MSTL_CORE_ITERATOR_RANGES_HPP__
2#define MSTL_CORE_ITERATOR_RANGES_HPP__
5#ifdef MSTL_STANDARD_20__
10concept Range =
requires(R& r) {
11 { r.begin() } -> input_iterator;
12 { r.end() } -> sentinel_for<
decltype(r.begin())>;
16concept common_range = Range<R> && same_as<
22concept View = Range<V> && move_constructible<V>;
25template <Range R,
typename Adaptor>
26constexpr auto operator |(R&& range, Adaptor&& adaptor) {
31template <Range R>
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;
59 constexpr explicit owning_view(R&& range)
60 noexcept(is_nothrow_move_constructible_v<R>)
63 owning_view(owning_view&&) =
delete;
64 owning_view& operator =(owning_view&&) =
delete;
66 owning_view(
const owning_view&) =
delete;
67 owning_view& operator = (
const owning_view&) =
delete;
69 constexpr auto begin()
const {
return obj_.begin(); }
70 constexpr auto end()
const {
return obj_.end(); }
71 constexpr auto begin() {
return obj_.begin(); }
72 constexpr auto end() {
return obj_.end(); }
74 constexpr R& base() & {
return obj_; }
75 constexpr const R& base() const & {
return obj_; }
76 constexpr R&& base() && {
return _MSTL move(obj_); }
77 constexpr const R&& base() const && {
return _MSTL move(obj_); }
81struct all_view_factory {
82 template <
typename V>
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>>)
95 constexpr auto operator ()(R&& r)
const
97 return owning_view<remove_cvref_t<R>>{
_MSTL move(r)};
101MSTL_INLINE17
constexpr all_view_factory all{};
104template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
105class filter_iterator {
109 is_base_of_v<bidirectional_iterator_tag, base_category>,
110 bidirectional_iterator_tag,
120 BaseIter base_begin_{};
123 const Pred* pred_ =
nullptr;
125 constexpr void satisfy_predicate_forward() {
126 while (current_ != end_ && !(*pred_)(*current_)) {
131 constexpr void satisfy_predicate_backward() {
132 while (current_ != base_begin_) {
133 if ((*pred_)(*current_)) {
141 constexpr filter_iterator() =
default;
143 constexpr filter_iterator(BaseIter base_begin, BaseIter current, Sentinel
end,
const Pred* pred)
144 : base_begin_(base_begin), current_(current), end_(
end), pred_(pred) {
145 satisfy_predicate_forward();
148 constexpr reference
operator*()
const {
return *current_; }
149 constexpr pointer operator->()
const {
return _MSTL addressof(*current_); }
151 constexpr filter_iterator& operator++() {
153 satisfy_predicate_forward();
157 constexpr filter_iterator operator++(
int) {
163 constexpr filter_iterator& operator--()
164 requires bidirectional_iterator<BaseIter> {
167 }
while (current_ != base_begin_ && !(*pred_)(*current_));
171 constexpr filter_iterator operator--(
int)
172 requires bidirectional_iterator<BaseIter> {
178 constexpr bool operator==(
const filter_iterator& other)
const {
179 return current_ == other.current_;
181 constexpr bool operator!=(
const filter_iterator& other)
const {
182 return !(*
this == other);
185 template <
typename S>
186 requires (!same_as<S, filter_iterator>)
187 constexpr bool operator ==(
const S& s)
const {
188 return current_ == s;
191 template <
typename S>
192 requires (!same_as<S, filter_iterator>)
193 constexpr bool operator !=(
const S& s)
const {
194 return current_ != s;
197 friend constexpr bool operator==(Sentinel s,
const filter_iterator& it) {
198 return it.current_ == s;
200 friend constexpr bool operator!=(Sentinel s,
const filter_iterator& it) {
201 return it.current_ != s;
204 constexpr bool operator <(
const filter_iterator& other)
const
205 requires totally_ordered<BaseIter> {
206 return current_ < other.current_;
208 constexpr bool operator >(
const filter_iterator& other)
const
209 requires totally_ordered<BaseIter> {
210 return current_ > other.current_;
212 constexpr bool operator <=(
const filter_iterator& other)
const
213 requires totally_ordered<BaseIter> {
214 return current_ <= other.current_;
216 constexpr bool operator >=(
const filter_iterator& other)
const
217 requires totally_ordered<BaseIter> {
218 return current_ >= other.current_;
222 requires totally_ordered_with<BaseIter, Sentinel> {
226 requires totally_ordered_with<BaseIter, Sentinel> {
230 requires totally_ordered_with<BaseIter, Sentinel> {
231 return current_ <= s;
234 requires totally_ordered_with<BaseIter, Sentinel> {
235 return current_ >= s;
238 friend constexpr bool operator <(Sentinel s,
const filter_iterator& it)
239 requires totally_ordered_with<BaseIter, Sentinel> {
240 return s < it.current_;
242 friend constexpr bool operator >(Sentinel s,
const filter_iterator& it)
243 requires totally_ordered_with<BaseIter, Sentinel> {
244 return s > it.current_;
246 friend constexpr bool operator <=(Sentinel s,
const filter_iterator& it)
247 requires totally_ordered_with<BaseIter, Sentinel> {
248 return s <= it.current_;
250 friend constexpr bool operator >=(Sentinel s,
const filter_iterator& it)
251 requires totally_ordered_with<BaseIter, Sentinel> {
252 return s >= it.current_;
255 constexpr difference_type
operator -(
const filter_iterator& other)
const noexcept
256 requires sized_sentinel_for<BaseIter, BaseIter> {
257 return static_cast<difference_type
>(current_ - other.current_);
260 constexpr BaseIter base()
const {
return current_; }
264template <View V,
typename Pred>
265class filter_view :
public view_base<filter_view<V, Pred>> {
269 using iterator = filter_iterator<base_iterator, base_sentinel, Pred>;
270 using sentinel = base_sentinel;
277 constexpr filter_view() =
default;
279 constexpr filter_view(
const filter_view& other)
280 requires copy_constructible<V> && copy_constructible<Pred>
281 : base_(other.base_), pred_(other.pred_) {}
283 constexpr filter_view& operator =(
const filter_view& other)
284 requires copyable<V> && copyable<Pred> {
285 if (
this != &other) {
292 constexpr filter_view(filter_view&&) =
default;
294 constexpr filter_view& operator =(filter_view&& other)
295 noexcept(is_nothrow_move_assignable_v<V> && is_nothrow_move_assignable_v<Pred>)
296 requires is_move_assignable_v<V> && is_move_assignable_v<Pred> {
302 constexpr filter_view(V base, Pred pred)
305 constexpr iterator
begin() {
306 return iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
308 constexpr sentinel
end() {
312 constexpr iterator
begin() const
313 requires Range<const V> {
314 return iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
316 constexpr sentinel
end() const
317 requires Range<const V> {
321 constexpr iterator
end()
requires common_range<V> {
322 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
324 constexpr iterator
end() const requires common_range<const V> {
325 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
328 constexpr V base() const & requires copy_constructible<V> {
return base_; }
329 constexpr V base() && {
return _MSTL move(base_); }
333template <input_iterator BaseIter,
typename Func>
334class transform_iterator {
336 using iterator_category = forward_iterator_tag;
341 using pointer = void;
343 constexpr transform_iterator() =
default;
345 constexpr transform_iterator(BaseIter current,
const Func* func)
346 : current_(current), func_(func) {}
348 constexpr reference
operator *()
const {
return (*func_)(*current_); }
350 constexpr transform_iterator& operator++() {
355 constexpr transform_iterator operator++(
int) {
361 constexpr bool operator==(
const transform_iterator& other)
const {
362 return current_ == other.current_;
364 constexpr bool operator!=(
const transform_iterator& other)
const {
365 return !(*
this == other);
368 template <
typename S>
369 requires (!same_as<S, transform_iterator>) && sentinel_for<S, BaseIter>
370 constexpr bool operator==(
const S& s)
const {
371 return current_ == s;
373 template <
typename S>
374 requires (!same_as<S, transform_iterator>) && sentinel_for<S, BaseIter>
375 constexpr bool operator!=(
const S& s)
const {
376 return !(current_ == s);
379 template <
typename Sentinel>
380 friend constexpr bool operator==(
const Sentinel& s,
const transform_iterator& it) {
381 return s == it.current_;
383 template <
typename Sentinel>
384 friend constexpr bool operator!=(
const Sentinel& s,
const transform_iterator& it) {
385 return !(s == it.current_);
390 const Func* func_ =
nullptr;
394template <View V,
typename Func>
395class transform_view :
public view_base<transform_view<V, Func>> {
398 using iterator = transform_iterator<base_iterator, Func>;
406 constexpr transform_view() =
default;
408 constexpr transform_view(V base, Func func)
411 constexpr transform_view(transform_view&&)
412 requires movable<V> && movable<Func> = default;
414 constexpr transform_view& operator =(transform_view&& other) noexcept
415 requires movable<V> && movable<Func> {
421 constexpr transform_view(
const transform_view& other)
422 requires copy_constructible<V> && copy_constructible<Func>
423 : base_(other.base_), func_(other.func_) {}
425 constexpr transform_view& operator =(
const transform_view& other)
426 requires copyable<V> && copyable<Func> {
427 if (
this != &other) {
434 constexpr iterator
begin() {
435 return iterator(base_.begin(), &func_);
438 constexpr sentinel
end() {
442 constexpr iterator
begin() const
443 requires Range<const V> {
444 return iterator(base_.begin(), &func_);
447 constexpr sentinel
end() const
448 requires Range<const V> {
452 constexpr V base() const & requires copy_constructible<V> {
return base_; }
453 constexpr V base() && {
return _MSTL move(base_); }
457template <input_iterator BaseIter>
460 using iterator_category = forward_iterator_tag;
466 constexpr take_iterator() =
default;
468 constexpr take_iterator(BaseIter current, difference_type
count)
469 : current_(current), count_(
count) {}
475 constexpr pointer operator->()
const {
479 constexpr take_iterator& operator++() {
485 constexpr take_iterator operator++(
int) {
491 constexpr bool operator==(
const take_iterator& other)
const {
492 return current_ == other.current_ || count_ == other.count_;
495 constexpr bool operator!=(
const take_iterator& other)
const {
496 return !(*
this == other);
499 template <
typename S>
500 requires (!same_as<S, take_iterator>)
501 constexpr bool operator==(
const S& s)
const {
502 return current_ == s || count_ == 0;
505 template <
typename S>
506 requires (!same_as<S, take_iterator>)
507 constexpr bool operator!=(
const S& s)
const {
508 return !(*
this == s);
513 difference_type count_ = 0;
518class take_view :
public view_base<take_view<V>> {
521 using iterator = take_iterator<base_iterator>;
526 difference_type count_ = 0;
529 constexpr take_view() =
default;
531 constexpr take_view(V base, difference_type
count)
534 constexpr take_view(take_view&&)
requires movable<V> = default;
535 constexpr take_view& operator =(take_view&&) requires movable<V> = default;
537 constexpr take_view(const take_view&) requires copy_constructible<V> = default;
538 constexpr take_view& operator =(const take_view&) requires copyable<V> = default;
540 constexpr iterator
begin() {
541 return iterator(base_.begin(), count_);
544 constexpr iterator
end() {
545 auto it = base_.begin();
547 return iterator(it, 0);
550 constexpr iterator
begin() const
551 requires Range<const V> {
552 return iterator(base_.begin(), count_);
555 constexpr iterator
end() const
556 requires Range<const V> {
557 auto it = base_.begin();
559 return iterator(it, 0);
562 constexpr V base() const & requires copy_constructible<V> {
return base_; }
563 constexpr V base() && {
return _MSTL move(base_); }
570template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
571class take_while_iterator {
573 using iterator_category = forward_iterator_tag;
579 constexpr take_while_iterator() =
default;
581 constexpr take_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred)
582 : current_(current), end_(
end), pred_(pred), done_(current ==
end || !(*pred)(*current)) {}
588 constexpr pointer operator->()
const {
592 constexpr take_while_iterator& operator++() {
594 if (current_ == end_ || !(*pred_)(*current_)) done_ =
true;
598 constexpr take_while_iterator operator++(
int) {
604 constexpr bool operator==(
const take_while_iterator& other)
const {
605 return current_ == other.current_ && done_ == other.done_;
607 constexpr bool operator!=(
const take_while_iterator& other)
const {
608 return !(*
this == other);
611 template <
typename S>
612 requires (!same_as<S, take_while_iterator>)
613 constexpr bool operator==(
const S& s)
const {
614 return done_ || current_ == s;
616 template <
typename S>
617 requires (!same_as<S, take_while_iterator>)
618 constexpr bool operator!=(
const S& s)
const {
619 return !(*
this == s);
622 template <
typename S>
623 friend constexpr bool operator ==(
const S& s,
const take_while_iterator& t) {
624 return t.done_ || t.current_ == s;
627 template <
typename S>
628 friend constexpr bool operator !=(
const S& s,
const take_while_iterator& t) {
635 const Pred* pred_ =
nullptr;
639template <View V,
typename Pred>
640class take_while_view :
public view_base<take_while_view<V, Pred>> {
644 using iterator = take_while_iterator<base_iterator, base_sentinel, Pred>;
645 using sentinel = base_sentinel;
652 constexpr take_while_view() =
default;
654 constexpr take_while_view(V base, Pred pred)
657 constexpr iterator
begin() {
658 return iterator(base_.begin(), base_.end(), &pred_);
660 constexpr sentinel
end() {
664 constexpr iterator
begin() const
665 requires Range<const V> {
666 return iterator(base_.begin(), base_.end(), &pred_);
668 constexpr sentinel
end() const
669 requires Range<const V> {
673 constexpr V base() const & requires copy_constructible<V> {
return base_; }
674 constexpr V base() && {
return _MSTL move(base_); }
677template <
typename V,
typename Pred>
678take_while_view(V&&, Pred) -> take_while_view<V, Pred>;
682class drop_view :
public view_base<drop_view<V>> {
690 difference_type count_ = 0;
693 constexpr drop_view() =
default;
695 constexpr drop_view(V base, difference_type
count)
698 constexpr drop_view(drop_view&&)
requires movable<V> = default;
699 constexpr drop_view& operator =(drop_view&&) requires movable<V> = default;
701 constexpr drop_view(const drop_view&) requires copy_constructible<V> = default;
702 constexpr drop_view& operator =(const drop_view&) requires copyable<V> = default;
704 constexpr iterator
begin() {
705 auto it = base_.begin();
706 auto end = base_.end();
708 while (n > 0 && it !=
end) {
715 constexpr sentinel
end() {
719 constexpr iterator
begin() const
720 requires Range<const V> {
721 auto it = base_.begin();
722 auto end = base_.end();
724 while (n > 0 && it !=
end) {
731 constexpr sentinel
end() const
732 requires Range<const V> {
736 constexpr V base() const & requires copy_constructible<V> {
return base_; }
737 constexpr V base() && {
return _MSTL move(base_); }
744template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
745class drop_while_iterator {
747 using iterator_category = forward_iterator_tag;
753 constexpr drop_while_iterator() =
default;
755 constexpr drop_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred)
756 : current_(current), end_(
end), pred_(pred), started_(false) {
757 satisfy_predicate_forward();
764 constexpr pointer operator->()
const {
768 constexpr drop_while_iterator& operator++() {
773 constexpr drop_while_iterator operator++(
int) {
779 constexpr bool operator==(
const drop_while_iterator& other)
const {
780 return current_ == other.current_;
782 constexpr bool operator!=(
const drop_while_iterator& other)
const {
783 return !(*
this == other);
786 template <
typename S>
787 requires (!same_as<S, drop_while_iterator>)
788 constexpr bool operator==(
const S& s)
const {
789 return current_ == s;
791 template <
typename S>
792 requires (!same_as<S, drop_while_iterator>)
793 constexpr bool operator!=(
const S& s)
const {
794 return !(*
this == s);
797 template <
typename S>
798 friend constexpr bool operator ==(
const S& s,
const drop_while_iterator& t) {
799 return t.current_ == s;
802 template <
typename S>
803 friend constexpr bool operator !=(
const S& s,
const drop_while_iterator& t) {
804 return t.current_ != s;
808 constexpr void satisfy_predicate_forward() {
809 if (started_)
return;
811 while (current_ != end_ && (*pred_)(*current_)) {
818 const Pred* pred_ =
nullptr;
819 bool started_ =
false;
822template <View V,
typename Pred>
823class drop_while_view :
public view_base<drop_while_view<V, Pred>> {
827 using iterator = drop_while_iterator<base_iterator, base_sentinel, Pred>;
828 using sentinel = base_sentinel;
835 constexpr drop_while_view() =
default;
837 constexpr drop_while_view(V base, Pred pred)
840 constexpr iterator
begin() {
841 return iterator(base_.begin(), base_.end(), &pred_);
843 constexpr sentinel
end() {
847 constexpr iterator
begin() const
848 requires Range<const V> {
849 return iterator(base_.begin(), base_.end(), &pred_);
851 constexpr sentinel
end() const
852 requires Range<const V> {
856 constexpr V base() const & requires copy_constructible<V> {
return base_; }
857 constexpr V base() && {
return _MSTL move(base_); }
860template <
typename V,
typename Pred>
861drop_while_view(V&&, Pred) -> drop_while_view<V, Pred>;
864template <b
idirectional_iterator Iter>
909 return current_ == other.current_;
913 return !(*
this == other);
921 requires bidirectional_iterator<decltype(_MSTL declval<V>().begin())> && common_range<V>
922class reverse_view : public view_base<reverse_view<V>> {
931 constexpr reverse_view() =
default;
932 constexpr explicit reverse_view(V base) : base_(
_MSTL move(base)) {}
934 constexpr reverse_view(reverse_view&&)
requires movable<V> = default;
935 constexpr reverse_view& operator =(reverse_view&&) requires movable<V> = default;
937 constexpr reverse_view(const reverse_view&) requires copy_constructible<V> = default;
938 constexpr reverse_view& operator =(const reverse_view&) requires copyable<V> = default;
940 constexpr iterator
begin() {
941 return iterator(base_.end());
943 constexpr iterator
end() {
944 return iterator(base_.begin());
947 constexpr iterator
begin() const
948 requires Range<const V> {
949 return iterator(base_.end());
951 constexpr iterator
end() const
952 requires Range<const V> {
953 return iterator(base_.begin());
956 constexpr V base() const & requires copy_constructible<V> {
return base_; }
957 constexpr V base() && {
return _MSTL move(base_); }
961reverse_view(V&&) -> reverse_view<V>;
967 using iterator_category = forward_iterator_tag;
968 using value_type = T;
974 using pointer =
const T*;
977 constexpr iota_iterator() =
default;
978 constexpr explicit iota_iterator(T value) : value_(value) {}
980 constexpr reference
operator*()
const {
return value_; }
981 constexpr pointer operator->()
const {
return &value_; }
983 constexpr iota_iterator& operator++() {
988 constexpr iota_iterator operator++(
int) {
994 constexpr bool operator==(
const iota_iterator& other)
const {
995 return value_ == other.value_;
997 constexpr bool operator!=(
const iota_iterator& other)
const {
998 return value_ != other.value_;
1001 constexpr bool operator <(
const iota_iterator& other)
const
1002 requires totally_ordered<T> {
1003 return value_ < other.value_;
1010template <
typename T>
1011class iota_view :
public view_base<iota_view<T>> {
1013 using iterator = iota_iterator<T>;
1015 constexpr iota_view() =
default;
1016 constexpr explicit iota_view(T start) : start_(start) {}
1017 constexpr iota_view(T start, T bound) : start_(start), bound_(bound), has_bound_(true) {}
1019 constexpr iterator
begin()
const {
return iterator(start_); }
1020 constexpr iterator
end()
const {
1021 return has_bound_ ? iterator(bound_) : iterator(start_);
1027 bool has_bound_ =
false;
1030template <
typename T>
1031iota_view(T) -> iota_view<T>;
1033template <
typename T>
1034iota_view(T, T) -> iota_view<T>;
1037template <
typename T>
1038class repeat_iterator {
1040 using iterator_category = forward_iterator_tag;
1041 using value_type = T;
1043 using pointer =
const T*;
1044 using reference =
const T&;
1046 constexpr repeat_iterator() =
default;
1047 constexpr repeat_iterator(
const T* value, difference_type
count)
1048 : value_(value), count_(
count) {}
1050 constexpr reference
operator*()
const {
return *value_; }
1051 constexpr pointer operator->()
const {
return value_; }
1053 constexpr repeat_iterator& operator++() {
1054 if (count_ > 0) --count_;
1058 constexpr repeat_iterator operator++(
int) {
1064 constexpr bool operator==(
const repeat_iterator& other)
const {
1065 return count_ == other.count_;
1067 constexpr bool operator!=(
const repeat_iterator& other)
const {
1068 return count_ != other.count_;
1072 const T* value_ =
nullptr;
1073 difference_type count_ = 0;
1076template <
typename T>
1077class repeat_view :
public view_base<repeat_view<T>> {
1079 using iterator = repeat_iterator<T>;
1082 constexpr repeat_view() =
default;
1084 constexpr explicit repeat_view(T value)
1087 constexpr repeat_view(T value,
const difference_type
count)
1090 constexpr iterator
begin()
const {
1091 return has_bound_ ? iterator(&value_, count_) : iterator(&value_, -1);
1093 constexpr iterator
end()
const {
1094 return iterator(&value_, 0);
1099 difference_type count_ = 0;
1100 bool has_bound_ =
false;
1103template <
typename T>
1104repeat_view(T) -> repeat_view<T>;
1106template <
typename T,
typename N>
1107repeat_view(T, N) -> repeat_view<T>;
1110template <
typename OuterIter,
typename OuterSentinel>
1111class join_iterator {
1119 using iterator_category = forward_iterator_tag;
1125 constexpr join_iterator() =
default;
1127 constexpr join_iterator(OuterIter outer_current, OuterSentinel outer_end)
1128 : outer_current_(outer_current), outer_end_(outer_end) {
1129 if (outer_current_ != outer_end_) {
1130 inner_current_ = (*outer_current_).begin();
1131 inner_end_ = (*outer_current_).end();
1136 constexpr reference
operator*()
const {
return *inner_current_; }
1137 constexpr pointer operator->()
const {
return _MSTL addressof(*inner_current_); }
1139 constexpr join_iterator& operator++() {
1145 constexpr join_iterator operator++(
int) {
1151 constexpr bool operator==(
const join_iterator& other)
const {
1152 return outer_current_ == other.outer_current_ &&
1153 (outer_current_ == outer_end_ || inner_current_ == other.inner_current_);
1155 constexpr bool operator!=(
const join_iterator& other)
const {
1156 return !(*
this == other);
1160 constexpr void satisfy() {
1161 while (outer_current_ != outer_end_ && inner_current_ == inner_end_) {
1163 if (outer_current_ != outer_end_) {
1164 inner_current_ = (*outer_current_).begin();
1165 inner_end_ = (*outer_current_).end();
1170 OuterIter outer_current_{};
1171 OuterSentinel outer_end_{};
1172 inner_iterator inner_current_{};
1173 inner_sentinel inner_end_{};
1177 requires Range<iter_reference_t<decltype(_MSTL declval<V>().begin())>>
1178class join_view : public view_base<join_view<V>> {
1182 using iterator = join_iterator<outer_iterator, outer_sentinel>;
1184 constexpr join_view() =
default;
1185 constexpr explicit join_view(V base) : base_(
_MSTL move(base)) {}
1187 constexpr iterator
begin() {
1188 return iterator(base_.begin(), base_.end());
1190 constexpr iterator
end() {
1191 return iterator(base_.end(), base_.end());
1194 constexpr iterator
begin() const
1195 requires Range<const V> {
1196 return iterator(base_.begin(), base_.end());
1198 constexpr iterator
end() const
1199 requires Range<const V> {
1200 return iterator(base_.end(), base_.end());
1203 constexpr V base() const & requires copy_constructible<V> {
return base_; }
1204 constexpr V base() && {
return _MSTL move(base_); }
1210template <
typename V>
1211join_view(V&&) -> join_view<V>;
1214template <
size_t N,
typename BaseIter>
1215class element_iterator {
1219 using iterator_category = forward_iterator_tag;
1223 using reference = element_type;
1225 constexpr element_iterator() =
default;
1226 constexpr explicit element_iterator(BaseIter current) : current_(current) {}
1232 constexpr pointer operator->()
const {
1236 constexpr element_iterator& operator++() {
1241 constexpr element_iterator operator++(
int) {
1247 constexpr bool operator==(
const element_iterator& other)
const {
1248 return current_ == other.current_;
1250 constexpr bool operator!=(
const element_iterator& other)
const {
1251 return current_ != other.current_;
1254 template <
typename S>
1255 requires (!same_as<S, element_iterator>) && sentinel_for<S, BaseIter>
1256 constexpr bool operator==(
const S& s)
const {
1257 return current_ == s;
1259 template <
typename S>
1260 requires (!same_as<S, element_iterator>) && sentinel_for<S, BaseIter>
1261 constexpr bool operator!=(
const S& s)
const {
1262 return current_ != s;
1266 BaseIter current_{};
1269template <
size_t N, View V>
1270class element_view :
public view_base<element_view<N, V>> {
1274 using iterator = element_iterator<N, base_iterator>;
1275 using sentinel = base_sentinel;
1277 constexpr element_view() =
default;
1278 constexpr explicit element_view(V base) : base_(
_MSTL move(base)) {}
1280 constexpr iterator
begin() {
1281 return iterator(base_.begin());
1283 constexpr sentinel
end() {
1287 constexpr iterator
begin() const
1288 requires Range<const V> {
1289 return iterator(base_.begin());
1291 constexpr sentinel
end() const
1292 requires Range<const V> {
1296 constexpr V base() const & requires copy_constructible<V> {
return base_; }
1297 constexpr V base() && {
return _MSTL move(base_); }
1305 requires (!common_range<V>)
1306class common_view : public view_base<common_view<V>> {
1310 using iterator = base_iterator;
1311 using sentinel = base_iterator;
1313 constexpr common_view() =
default;
1314 constexpr explicit common_view(V base) : base_(
_MSTL move(base)) {}
1316 constexpr iterator
begin() {
1317 return base_.begin();
1320 constexpr iterator
end() {
1321 auto it = base_.begin();
1322 auto sen = base_.end();
1323 while (it != sen) ++it;
1327 constexpr iterator
begin() const
1328 requires Range<const V> {
1329 return base_.begin();
1332 constexpr iterator
end() const
1333 requires Range<const V> {
1334 auto it = base_.begin();
1335 auto sen = base_.end();
1336 while (it != sen) ++it;
1340 constexpr V base() const & requires copy_constructible<V> {
return base_; }
1341 constexpr V base() && {
return _MSTL move(base_); }
1347template <
typename V>
1348common_view(V&&) -> common_view<V>;
1351template <
typename Iter>
1352class counted_iterator {
1354 using iterator_category = forward_iterator_tag;
1360 constexpr counted_iterator() =
default;
1361 constexpr counted_iterator(Iter current, difference_type
count)
1362 : current_(current), count_(
count) {}
1364 constexpr reference
operator*()
const {
return *current_; }
1365 constexpr pointer operator->()
const {
return _MSTL addressof(*current_); }
1367 constexpr counted_iterator& operator++() {
1373 constexpr counted_iterator operator++(
int) {
1379 constexpr bool operator==(
const counted_iterator& other)
const {
1380 return count_ == other.count_;
1382 constexpr bool operator!=(
const counted_iterator& other)
const {
1383 return count_ != other.count_;
1386 constexpr Iter base()
const {
return current_; }
1387 constexpr difference_type
count()
const {
return count_; }
1391 difference_type count_ = 0;
1394template <
typename Iter>
1395class counted_view :
public view_base<counted_view<Iter>> {
1397 using iterator = counted_iterator<Iter>;
1400 constexpr counted_view() =
default;
1401 constexpr counted_view(Iter iter, difference_type
count)
1402 : iter_(iter), count_(
count) {}
1404 constexpr iterator
begin()
const {
1405 return iterator(iter_, count_);
1407 constexpr iterator
end()
const {
1408 return iterator(iter_, 0);
1413 difference_type count_ = 0;
1416template <
typename Iter,
typename N>
1417counted_view(Iter, N) -> counted_view<Iter>;
1420template <View V1, View V2>
1421class concat_view :
public view_base<concat_view<V1, V2>> {
1426 concat_view() =
default;
1433 using iterator_category = forward_iterator_tag;
1438 using pointer = void;
1439 using reference = common_reference_t<
1446 bool in_first_ =
true;
1448 iterator() =
default;
1450 iterator(iter1_t first1, iter1_t last1, iter2_t first2, iter2_t last2)
1451 : current1_(first1), end1_(last1), current2_(first2), end2_(last2) {
1452 if (current1_ == end1_) {
1458 return in_first_ ? *current1_ : *current2_;
1461 iterator& operator++() {
1464 if (current1_ == end1_) {
1473 iterator operator++(
int) {
1479 bool operator==(
const iterator& other)
const {
1480 if (in_first_ != other.in_first_)
return false;
1481 if (in_first_)
return current1_ == other.current1_;
1482 return current2_ == other.current2_;
1485 bool operator!=(
const iterator& other)
const {
1486 return !(*
this == other);
1491 return iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end());
1494 return iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end());
1496 auto begin()
const {
1497 return iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end());
1500 return iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end());
1505template <
typename Iterator>
1506class subrange_view :
public view_base<subrange_view<Iterator>> {
1511 subrange_view() =
default;
1512 subrange_view(Iterator first, Iterator last) : first_(first), last_(last) {}
1514 Iterator
begin()
const {
return first_; }
1515 Iterator
end()
const {
return last_; }
1518template <View V,
typename T>
1519class split_view :
public view_base<split_view<V, T>> {
1528 base_iterator current_;
1532 using iterator_category = forward_iterator_tag;
1533 using value_type = subrange_view<base_iterator>;
1535 using pointer = void;
1536 using reference = value_type;
1538 iterator() =
default;
1539 iterator(base_iterator cur, base_sentinel
end, T delim)
1540 : current_(cur), end_(
end), delimiter_(delim) {}
1543 base_iterator start = current_;
1544 base_iterator iter = current_;
1545 while (iter != end_ && !(*iter == delimiter_)) ++iter;
1546 return value_type{start, iter};
1549 iterator& operator++() {
1550 if (current_ == end_)
return *
this;
1551 while (current_ != end_ && !(*current_ == delimiter_)) ++current_;
1552 if (current_ != end_) ++current_;
1556 iterator operator++(
int) {
1562 bool operator==(
const iterator& other)
const {
1563 return current_ == other.current_;
1565 bool operator!=(
const iterator& other)
const {
1566 return !(*
this == other);
1570 split_view() =
default;
1572 split_view(V base, T delimiter)
1573 : base_(
_MSTL move(base)), delimiter_(delimiter) {}
1576 return iterator{base_.begin(), base_.end(), delimiter_};
1579 return iterator{base_.end(), base_.end(), delimiter_};
1585class slice_view :
public view_base<slice_view<V>> {
1593 base_iterator begin_;
1596 mutable cache_t cache_;
1597 mutable bool has_value_ =
false;
1599 void ensure_cache()
const {
1600 if (has_value_)
return;
1602 auto b = base_.begin();
1603 auto e = base_.end();
1605 for (
auto i = 0; i < offset_ && b != e; ++i, ++b);
1608 for (
auto i = 0; i < length_ && b != e; ++i, ++b);
1611 cache_ = cache_t{begin_it, end_it};
1616 slice_view() =
default;
1620 : base_(
_MSTL move(base)), offset_(offset), length_(length) {}
1622 base_iterator
begin() {
1624 return cache_.begin_;
1627 base_iterator
end() {
1632 base_iterator
begin() const
1633 requires Range<const V> {
1635 return cache_.begin_;
1638 base_iterator
end() const
1639 requires Range<const V> {
1646template <
typename Derived>
1647struct range_adaptor_closure {
1648 template <
typename OtherClosure>
1650 range_adaptor_closure<Derived> lhs,
1651 range_adaptor_closure<OtherClosure> rhs) {
1653 lhs =
static_cast<const Derived&
>(lhs),
1654 rhs =
static_cast<const OtherClosure&
>(rhs)
1666 constexpr auto operator ()(R&& range)
const {
1671MSTL_INLINE17
constexpr all_adaptor all;
1674template <
typename Pred>
1675struct filter_adaptor_closure : range_adaptor_closure<filter_adaptor_closure<Pred>> {
1678 constexpr explicit filter_adaptor_closure(Pred p) : pred(
_MSTL move(p)) {}
1681 constexpr auto operator ()(R&& range)
const {
1686struct filter_adaptor {
1687 template <
typename Pred>
1688 constexpr auto operator ()(Pred pred)
const {
1689 return filter_adaptor_closure<Pred>{
_MSTL move(pred)};
1692 template <Range R,
typename Pred>
1693 constexpr auto operator ()(R&& range, Pred pred)
const {
1698MSTL_INLINE17
constexpr filter_adaptor filter;
1701template <
typename Func>
1702struct transform_adaptor_closure : range_adaptor_closure<transform_adaptor_closure<Func>> {
1705 constexpr explicit transform_adaptor_closure(Func f) : func(
_MSTL move(f)) {}
1708 constexpr auto operator ()(R&& range)
const {
1713struct transform_adaptor {
1714 template <
typename Func>
1715 constexpr auto operator ()(Func func)
const {
1716 return transform_adaptor_closure<Func>{
_MSTL move(func)};
1719 template <Range R,
typename Func>
1720 constexpr auto operator ()(R&& range, Func func)
const {
1725MSTL_INLINE17
constexpr transform_adaptor
transform;
1728template <
typename DiffType>
1729struct take_adaptor_closure : range_adaptor_closure<take_adaptor_closure<DiffType>> {
1732 constexpr explicit take_adaptor_closure(DiffType n) :
count(n) {}
1735 constexpr auto operator ()(R&& range)
const {
1740struct take_adaptor {
1741 template <
typename N>
requires is_integral_v<N>
1742 constexpr auto operator ()(N
count)
const {
1743 return take_adaptor_closure<N>{
count};
1746 template <Range R,
typename N>
requires is_integral_v<N>
1747 constexpr auto operator ()(R&& range, N
count)
const {
1752MSTL_INLINE17
constexpr take_adaptor take;
1755template <
typename Pred>
1756struct take_while_adaptor_closure : range_adaptor_closure<take_while_adaptor_closure<Pred>> {
1759 constexpr explicit take_while_adaptor_closure(Pred p) : pred(
_MSTL move(p)) {}
1762 constexpr auto operator ()(R&& range)
const {
1767struct take_while_adaptor {
1768 template <
typename Pred>
1769 constexpr auto operator ()(Pred pred)
const {
1770 return take_while_adaptor_closure<Pred>{
_MSTL move(pred)};
1773 template <Range R,
typename Pred>
1774 constexpr auto operator ()(R&& range, Pred pred)
const {
1779MSTL_INLINE17
constexpr take_while_adaptor take_while;
1782template <
typename DiffType>
1783struct drop_adaptor_closure : range_adaptor_closure<drop_adaptor_closure<DiffType>> {
1786 constexpr explicit drop_adaptor_closure(DiffType n) :
count(n) {}
1789 constexpr auto operator ()(R&& range)
const {
1794struct drop_adaptor {
1795 template <
typename N>
requires is_integral_v<N>
1796 constexpr auto operator ()(N
count)
const {
1797 return drop_adaptor_closure<N>{
count};
1800 template <Range R,
typename N>
requires is_integral_v<N>
1801 constexpr auto operator ()(R&& range, N
count)
const {
1806MSTL_INLINE17
constexpr drop_adaptor drop;
1809template <
typename Pred>
1810struct drop_while_adaptor_closure : range_adaptor_closure<drop_while_adaptor_closure<Pred>> {
1813 constexpr explicit drop_while_adaptor_closure(Pred p) : pred(
_MSTL move(p)) {}
1816 constexpr auto operator ()(R&& range)
const {
1821struct drop_while_adaptor {
1822 template <
typename Pred>
1823 constexpr auto operator ()(Pred pred)
const {
1824 return drop_while_adaptor_closure<Pred>{
_MSTL move(pred)};
1827 template <Range R,
typename Pred>
1828 constexpr auto operator ()(R&& range, Pred pred)
const {
1833MSTL_INLINE17
constexpr drop_while_adaptor drop_while;
1836struct reverse_adaptor_closure : range_adaptor_closure<reverse_adaptor_closure> {
1838 requires bidirectional_iterator<decltype(_MSTL declval<R>().begin())>
1839 constexpr auto operator ()(R&& range)
const {
1844struct reverse_adaptor {
1845 constexpr auto operator ()()
const {
1846 return reverse_adaptor_closure{};
1850 requires bidirectional_iterator<decltype(_MSTL declval<R>().begin())>
1851 constexpr auto operator ()(R&& range)
const {
1856MSTL_INLINE17
constexpr reverse_adaptor
reverse;
1859struct iota_adaptor {
1860 template <
typename T>
1861 constexpr auto operator ()(T start)
const {
1862 return iota_view<T>{start};
1865 template <
typename T>
1866 constexpr auto operator ()(T start, T bound)
const {
1867 return iota_view<T>{start, bound};
1871MSTL_INLINE17
constexpr iota_adaptor iota;
1874struct repeat_adaptor {
1875 template <
typename T>
1876 constexpr auto operator ()(T value)
const {
1877 return repeat_view<T>{
_MSTL move(value)};
1880 template <
typename T,
typename N>
requires is_integral_v<N>
1881 constexpr auto operator ()(T value, N
count)
const {
1886MSTL_INLINE17
constexpr repeat_adaptor repeat;
1889struct join_adaptor_closure : range_adaptor_closure<join_adaptor_closure> {
1891 requires Range<iter_reference_t<decltype(_MSTL declval<R>().begin())>>
1892 constexpr auto operator ()(R&& range)
const {
1897struct join_adaptor {
1898 constexpr auto operator ()()
const {
1899 return join_adaptor_closure{};
1903 requires Range<iter_reference_t<decltype(_MSTL declval<R>().begin())>>
1904 constexpr auto operator ()(R&& range)
const {
1909MSTL_INLINE17
constexpr join_adaptor join;
1913struct elements_adaptor_closure : range_adaptor_closure<elements_adaptor_closure<N>> {
1915 constexpr auto operator ()(R&& range)
const {
1916 return element_view<N, decltype(all(_MSTL forward<R>(range)))>{
1923struct elements_adaptor {
1924 constexpr auto operator ()()
const {
1925 return elements_adaptor_closure<N>{};
1929 constexpr auto operator ()(R&& range)
const {
1930 return element_view<N, decltype(all(_MSTL forward<R>(range)))>{
1937MSTL_INLINE17
constexpr elements_adaptor<N> elements;
1939MSTL_INLINE17
constexpr auto keys = elements<0>;
1940MSTL_INLINE17
constexpr auto values = elements<1>;
1943struct common_adaptor_closure : range_adaptor_closure<common_adaptor_closure> {
1945 constexpr auto operator ()(R&& range)
const {
1946 if constexpr (common_range<R>) {
1954struct common_adaptor {
1955 constexpr auto operator ()()
const {
1956 return common_adaptor_closure{};
1960 constexpr auto operator ()(R&& range)
const {
1961 if constexpr (common_range<R>) {
1969MSTL_INLINE17
constexpr common_adaptor common;
1972struct counted_adaptor {
1973 template <
typename Iter,
typename N>
requires is_integral_v<N>
1974 constexpr auto operator ()(Iter iter, N
count)
const {
1979MSTL_INLINE17
constexpr counted_adaptor counted;
1982template <
typename V2>
1983struct concat_adaptor_closure : range_adaptor_closure<concat_adaptor_closure<V2>> {
1987 constexpr explicit concat_adaptor_closure(V2&& v2)
1990 template <
typename V>
1992 constexpr auto operator ()(V&& v)
const {
1997struct concat_adaptor {
1998 template <
typename V2>
1999 constexpr auto operator ()(V2&& v2)
const {
2003 template <
typename V1,
typename V2>
2004 constexpr auto operator ()(V1&& v1, V2&& v2)
const {
2009MSTL_INLINE17
constexpr concat_adaptor concat;
2012template <
typename T>
2013struct split_adaptor_closure : range_adaptor_closure<split_adaptor_closure<T>> {
2016 constexpr explicit split_adaptor_closure(T d) : delim_(d) {}
2019 constexpr auto operator ()(R&& range)
const {
2024struct split_adaptor {
2025 template <
typename T>
2026 constexpr auto operator ()(T delim)
const {
2027 return split_adaptor_closure<T>{delim};
2030 template <Range R,
typename T>
2031 constexpr auto operator ()(R&& range, T delim)
const {
2036MSTL_INLINE17
constexpr split_adaptor split;
2039struct slice_adaptor_closure : range_adaptor_closure<slice_adaptor_closure> {
2043 : offset_(o), length_(l) {}
2046 constexpr auto operator ()(R&& range)
const {
2051struct slice_adaptor {
2053 return slice_adaptor_closure{offset, length};
2062MSTL_INLINE17
constexpr slice_adaptor slice;
constexpr reverse_iterator()=default
默认构造函数
MSTL_NODISCARD constexpr pointer operator->() const noexcept(is_nothrow_copy_constructible< Iterator >::value &&noexcept(--(_MSTL declval< Iterator & >())) &&is_nothrow_arrow< Iterator &, pointer >::value)
成员访问运算符
iter_reference_t< Iterator > reference
引用类型
iter_difference_t< Iterator > difference_type
差值类型
constexpr reverse_iterator & operator++() noexcept(noexcept(--current))
前缀递增运算符
MSTL_NODISCARD constexpr reference operator*() const noexcept(is_nothrow_copy_assignable< Iterator >::value &&noexcept(*--(_MSTL declval< Iterator & >())))
解引用运算符
iter_pointer_t< Iterator > pointer
指针类型
constexpr reverse_iterator & operator--() noexcept(noexcept(++current))
前缀递减运算符
iter_value_t< Iterator > value_type
值类型
iter_category_t< Iterator > iterator_category
迭代器类别
typename add_pointer< T >::type add_pointer_t
add_pointer的便捷别名
MSTL_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
MSTL_ALWAYS_INLINE enable_if_t< is_void_v< T >, future_result_t< T > > get(future< T > &f)
通用future结果获取函数
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
constexpr duration< _INNER __common_rep_t< Rep1, Rep2 >, Period > operator*(const duration< Rep1, Period > &value, const Rep2 &scalar)
乘法运算符(持续时间 * 标量)
bool operator!=(const function< Res(Args...)> &f, nullptr_t null) noexcept
不等于空指针比较
bool operator==(const function< Res(Args...)> &f, nullptr_t null) noexcept
等于空指针比较
typename _INNER __invoke_result_aux< F, Args... >::type invoke_result_t
invoke_result的便捷别名
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
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
获取迭代器的差值类型
constexpr memory_order operator|(memory_order mo, memory_order_modifier mod) noexcept
内存顺序与修饰符的或操作符
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_RANGES_VIEWS__
结束ranges::view命名空间
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_END_RANGES__
结束ranges命名空间
#define MSTL_BEGIN_RANGES__
开始ranges命名空间
#define MSTL_BEGIN_RANGES_VIEWS__
开始ranges::view命名空间
MSTL_NODISCARD constexpr bool operator<=(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
小于等于比较运算符
MSTL_NODISCARD constexpr bool operator>=(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
大于等于比较运算符
MSTL_NODISCARD constexpr bool operator>(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
大于比较运算符
MSTL_NODISCARD constexpr auto operator-(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept -> decltype(lhs.base() - rhs.base())
减法运算符
MSTL_NODISCARD constexpr bool operator<(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
小于比较运算符
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
MSTL_NODISCARD constexpr bool operator==(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base()==y.base())))
相等比较运算符
MSTL_NODISCARD constexpr bool operator!=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base() !=y.base())))
不等比较运算符
constexpr void reverse(Iterator first, Iterator last)
反转范围元素顺序
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
constexpr Iterator2 transform(Iterator1 first, Iterator1 last, Iterator2 result, UnaryOperation op) noexcept(noexcept(++first) &&noexcept(++result) &&noexcept(*result=op(*first)))
对范围元素应用一元变换
typename common_type< Types... >::type common_type_t
common_type的便捷别名
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名