MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ranges.hpp
1#ifndef MSTL_CORE_ITERATOR_RANGES_HPP__
2#define MSTL_CORE_ITERATOR_RANGES_HPP__
5#ifdef MSTL_STANDARD_20__
6
8
9template <typename R>
10concept Range = requires(R& r) {
11 { r.begin() } -> input_iterator;
12 { r.end() } -> sentinel_for<decltype(r.begin())>;
13};
14
15template <typename R>
16concept common_range = Range<R> && same_as<
17 decltype(_MSTL declval<R>().begin()),
18 decltype(_MSTL declval<R>().end())
19>;
20
21template <typename V>
22concept View = Range<V> && move_constructible<V>;
23
24
25template <Range R, typename Adaptor>
26constexpr auto operator |(R&& range, Adaptor&& adaptor) {
27 return _MSTL forward<Adaptor>(adaptor)(_MSTL forward<R>(range));
28}
29
30
31template <Range R> requires(!View<remove_cvref_t<R>>)
32class ref_view : public view_base<ref_view<R>> {
33public:
34 ref_view() = default;
35
36 constexpr explicit ref_view(R& range) noexcept
37 : ptr_(_MSTL addressof(range)) {}
38
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(); }
43
44 constexpr R& base() const { return *ptr_; }
45
46private:
47 R* ptr_ = nullptr;
48};
49
50
51template <Range R>
52class owning_view : public view_base<owning_view<R>> {
53private:
54 R obj_;
55
56public:
57 owning_view() = default;
58
59 constexpr explicit owning_view(R&& range)
60 noexcept(is_nothrow_move_constructible_v<R>)
61 : obj_(_MSTL move(range)) {}
62
63 owning_view(owning_view&&) = delete;
64 owning_view& operator =(owning_view&&) = delete;
65
66 owning_view(const owning_view&) = delete;
67 owning_view& operator = (const owning_view&) = delete;
68
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(); }
73
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_); }
78};
79
80
81struct all_view_factory {
82 template <typename V> requires View<remove_cvref_t<V>>
83 constexpr auto operator ()(V&& v) const noexcept {
84 return _MSTL forward<V>(v);
85 }
86
87 template <typename R>
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};
91 }
92
93 template <typename R>
94 requires Range<R> && (!View<remove_cvref_t<R>>)
95 constexpr auto operator ()(R&& r) const
96 noexcept(is_nothrow_move_constructible_v<remove_cvref_t<R>>) {
97 return owning_view<remove_cvref_t<R>>{_MSTL move(r)};
98 }
99};
100
101MSTL_INLINE17 constexpr all_view_factory all{};
102
103
104template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel, typename Pred>
105class filter_iterator {
106public:
107 using base_category = iter_category_t<BaseIter>;
108 using iterator_category = conditional_t<
109 is_base_of_v<bidirectional_iterator_tag, base_category>,
110 bidirectional_iterator_tag,
111 forward_iterator_tag
112 >;
113
114 using value_type = iter_value_t<BaseIter>;
115 using difference_type = iter_difference_t<BaseIter>;
117 using reference = iter_reference_t<BaseIter>;
118
119private:
120 BaseIter base_begin_{};
121 BaseIter current_{};
122 Sentinel end_{};
123 const Pred* pred_ = nullptr;
124
125 constexpr void satisfy_predicate_forward() {
126 while (current_ != end_ && !(*pred_)(*current_)) {
127 ++current_;
128 }
129 }
130
131 constexpr void satisfy_predicate_backward() {
132 while (current_ != base_begin_) {
133 if ((*pred_)(*current_)) {
134 break;
135 }
136 --current_;
137 }
138 }
139
140public:
141 constexpr filter_iterator() = default;
142
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();
146 }
147
148 constexpr reference operator*() const { return *current_; }
149 constexpr pointer operator->() const { return _MSTL addressof(*current_); }
150
151 constexpr filter_iterator& operator++() {
152 ++current_;
153 satisfy_predicate_forward();
154 return *this;
155 }
156
157 constexpr filter_iterator operator++(int) {
158 auto tmp = *this;
159 ++(*this);
160 return tmp;
161 }
162
163 constexpr filter_iterator& operator--()
164 requires bidirectional_iterator<BaseIter> {
165 do {
166 --current_;
167 } while (current_ != base_begin_ && !(*pred_)(*current_));
168 return *this;
169 }
170
171 constexpr filter_iterator operator--(int)
172 requires bidirectional_iterator<BaseIter> {
173 auto tmp = *this;
174 --(*this);
175 return tmp;
176 }
177
178 constexpr bool operator==(const filter_iterator& other) const {
179 return current_ == other.current_;
180 }
181 constexpr bool operator!=(const filter_iterator& other) const {
182 return !(*this == other);
183 }
184
185 template <typename S>
186 requires (!same_as<S, filter_iterator>)
187 constexpr bool operator ==(const S& s) const {
188 return current_ == s;
189 }
190
191 template <typename S>
192 requires (!same_as<S, filter_iterator>)
193 constexpr bool operator !=(const S& s) const {
194 return current_ != s;
195 }
196
197 friend constexpr bool operator==(Sentinel s, const filter_iterator& it) {
198 return it.current_ == s;
199 }
200 friend constexpr bool operator!=(Sentinel s, const filter_iterator& it) {
201 return it.current_ != s;
202 }
203
204 constexpr bool operator <(const filter_iterator& other) const
205 requires totally_ordered<BaseIter> {
206 return current_ < other.current_;
207 }
208 constexpr bool operator >(const filter_iterator& other) const
209 requires totally_ordered<BaseIter> {
210 return current_ > other.current_;
211 }
212 constexpr bool operator <=(const filter_iterator& other) const
213 requires totally_ordered<BaseIter> {
214 return current_ <= other.current_;
215 }
216 constexpr bool operator >=(const filter_iterator& other) const
217 requires totally_ordered<BaseIter> {
218 return current_ >= other.current_;
219 }
220
221 constexpr bool operator <(Sentinel s) const
222 requires totally_ordered_with<BaseIter, Sentinel> {
223 return current_ < s;
224 }
225 constexpr bool operator >(Sentinel s) const
226 requires totally_ordered_with<BaseIter, Sentinel> {
227 return current_ > s;
228 }
229 constexpr bool operator <=(Sentinel s) const
230 requires totally_ordered_with<BaseIter, Sentinel> {
231 return current_ <= s;
232 }
233 constexpr bool operator >=(Sentinel s) const
234 requires totally_ordered_with<BaseIter, Sentinel> {
235 return current_ >= s;
236 }
237
238 friend constexpr bool operator <(Sentinel s, const filter_iterator& it)
239 requires totally_ordered_with<BaseIter, Sentinel> {
240 return s < it.current_;
241 }
242 friend constexpr bool operator >(Sentinel s, const filter_iterator& it)
243 requires totally_ordered_with<BaseIter, Sentinel> {
244 return s > it.current_;
245 }
246 friend constexpr bool operator <=(Sentinel s, const filter_iterator& it)
247 requires totally_ordered_with<BaseIter, Sentinel> {
248 return s <= it.current_;
249 }
250 friend constexpr bool operator >=(Sentinel s, const filter_iterator& it)
251 requires totally_ordered_with<BaseIter, Sentinel> {
252 return s >= it.current_;
253 }
254
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_);
258 }
259
260 constexpr BaseIter base() const { return current_; }
261};
262
263
264template <View V, typename Pred>
265class filter_view : public view_base<filter_view<V, Pred>> {
266public:
267 using base_iterator = decltype(_MSTL declval<V>().begin());
268 using base_sentinel = decltype(_MSTL declval<V>().end());
269 using iterator = filter_iterator<base_iterator, base_sentinel, Pred>;
270 using sentinel = base_sentinel;
271
272private:
273 V base_;
274 Pred pred_;
275
276public:
277 constexpr filter_view() = default;
278
279 constexpr filter_view(const filter_view& other)
280 requires copy_constructible<V> && copy_constructible<Pred>
281 : base_(other.base_), pred_(other.pred_) {}
282
283 constexpr filter_view& operator =(const filter_view& other)
284 requires copyable<V> && copyable<Pred> {
285 if (this != &other) {
286 base_ = other.base_;
287 pred_ = other.pred_;
288 }
289 return *this;
290 }
291
292 constexpr filter_view(filter_view&&) = default;
293
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> {
297 base_ = _MSTL move(other.base_);
298 pred_ = _MSTL move(other.pred_);
299 return *this;
300 }
301
302 constexpr filter_view(V base, Pred pred)
303 : base_(_MSTL move(base)), pred_(_MSTL move(pred)) {}
304
305 constexpr iterator begin() {
306 return iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
307 }
308 constexpr sentinel end() {
309 return base_.end();
310 }
311
312 constexpr iterator begin() const
313 requires Range<const V> {
314 return iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
315 }
316 constexpr sentinel end() const
317 requires Range<const V> {
318 return base_.end();
319 }
320
321 constexpr iterator end() requires common_range<V> {
322 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
323 }
324 constexpr iterator end() const requires common_range<const V> {
325 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
326 }
327
328 constexpr V base() const & requires copy_constructible<V> { return base_; }
329 constexpr V base() && { return _MSTL move(base_); }
330};
331
332
333template <input_iterator BaseIter, typename Func>
334class transform_iterator {
335public:
336 using iterator_category = forward_iterator_tag;
337 using base_reference = iter_reference_t<BaseIter>;
339 using difference_type = iter_difference_t<BaseIter>;
341 using pointer = void;
342
343 constexpr transform_iterator() = default;
344
345 constexpr transform_iterator(BaseIter current, const Func* func)
346 : current_(current), func_(func) {}
347
348 constexpr reference operator *() const { return (*func_)(*current_); }
349
350 constexpr transform_iterator& operator++() {
351 ++current_;
352 return *this;
353 }
354
355 constexpr transform_iterator operator++(int) {
356 auto tmp = *this;
357 ++current_;
358 return tmp;
359 }
360
361 constexpr bool operator==(const transform_iterator& other) const {
362 return current_ == other.current_;
363 }
364 constexpr bool operator!=(const transform_iterator& other) const {
365 return !(*this == other);
366 }
367
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;
372 }
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);
377 }
378
379 template <typename Sentinel>
380 friend constexpr bool operator==(const Sentinel& s, const transform_iterator& it) {
381 return s == it.current_;
382 }
383 template <typename Sentinel>
384 friend constexpr bool operator!=(const Sentinel& s, const transform_iterator& it) {
385 return !(s == it.current_);
386 }
387
388private:
389 BaseIter current_{};
390 const Func* func_ = nullptr;
391};
392
393
394template <View V, typename Func>
395class transform_view : public view_base<transform_view<V, Func>> {
396public:
397 using base_iterator = decltype(_MSTL declval<V>().begin());
398 using iterator = transform_iterator<base_iterator, Func>;
399 using sentinel = decltype(_MSTL declval<V>().end());
400
401private:
402 V base_;
403 Func func_;
404
405public:
406 constexpr transform_view() = default;
407
408 constexpr transform_view(V base, Func func)
409 : base_(_MSTL move(base)), func_(_MSTL move(func)) {}
410
411 constexpr transform_view(transform_view&&)
412 requires movable<V> && movable<Func> = default;
413
414 constexpr transform_view& operator =(transform_view&& other) noexcept
415 requires movable<V> && movable<Func> {
416 base_ = _MSTL move(other.base_);
417 func_ = _MSTL move(other.func_);
418 return *this;
419 }
420
421 constexpr transform_view(const transform_view& other)
422 requires copy_constructible<V> && copy_constructible<Func>
423 : base_(other.base_), func_(other.func_) {}
424
425 constexpr transform_view& operator =(const transform_view& other)
426 requires copyable<V> && copyable<Func> {
427 if (this != &other) {
428 base_ = other.base_;
429 func_ = other.func_;
430 }
431 return *this;
432 }
433
434 constexpr iterator begin() {
435 return iterator(base_.begin(), &func_);
436 }
437
438 constexpr sentinel end() {
439 return base_.end();
440 }
441
442 constexpr iterator begin() const
443 requires Range<const V> {
444 return iterator(base_.begin(), &func_);
445 }
446
447 constexpr sentinel end() const
448 requires Range<const V> {
449 return base_.end();
450 }
451
452 constexpr V base() const & requires copy_constructible<V> { return base_; }
453 constexpr V base() && { return _MSTL move(base_); }
454};
455
456
457template <input_iterator BaseIter>
458class take_iterator {
459public:
460 using iterator_category = forward_iterator_tag;
461 using value_type = iter_value_t<BaseIter>;
462 using difference_type = iter_difference_t<BaseIter>;
464 using reference = iter_reference_t<BaseIter>;
465
466 constexpr take_iterator() = default;
467
468 constexpr take_iterator(BaseIter current, difference_type count)
469 : current_(current), count_(count) {}
470
471 constexpr reference operator*() const {
472 return *current_;
473 }
474
475 constexpr pointer operator->() const {
476 return _MSTL addressof(*current_);
477 }
478
479 constexpr take_iterator& operator++() {
480 ++current_;
481 --count_;
482 return *this;
483 }
484
485 constexpr take_iterator operator++(int) {
486 auto tmp = *this;
487 ++(*this);
488 return tmp;
489 }
490
491 constexpr bool operator==(const take_iterator& other) const {
492 return current_ == other.current_ || count_ == other.count_;
493 }
494
495 constexpr bool operator!=(const take_iterator& other) const {
496 return !(*this == other);
497 }
498
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;
503 }
504
505 template <typename S>
506 requires (!same_as<S, take_iterator>)
507 constexpr bool operator!=(const S& s) const {
508 return !(*this == s);
509 }
510
511private:
512 BaseIter current_{};
513 difference_type count_ = 0;
514};
515
516
517template <View V>
518class take_view : public view_base<take_view<V>> {
519public:
520 using base_iterator = decltype(_MSTL declval<V>().begin());
521 using iterator = take_iterator<base_iterator>;
522 using difference_type = iter_difference_t<base_iterator>;
523
524private:
525 V base_;
526 difference_type count_ = 0;
527
528public:
529 constexpr take_view() = default;
530
531 constexpr take_view(V base, difference_type count)
532 : base_(_MSTL move(base)), count_(count) {}
533
534 constexpr take_view(take_view&&) requires movable<V> = default;
535 constexpr take_view& operator =(take_view&&) requires movable<V> = default;
536
537 constexpr take_view(const take_view&) requires copy_constructible<V> = default;
538 constexpr take_view& operator =(const take_view&) requires copyable<V> = default;
539
540 constexpr iterator begin() {
541 return iterator(base_.begin(), count_);
542 }
543
544 constexpr iterator end() {
545 auto it = base_.begin();
546 _MSTL advance(it, _MSTL min(count_, _MSTL distance(base_.begin(), base_.end())));
547 return iterator(it, 0);
548 }
549
550 constexpr iterator begin() const
551 requires Range<const V> {
552 return iterator(base_.begin(), count_);
553 }
554
555 constexpr iterator end() const
556 requires Range<const V> {
557 auto it = base_.begin();
558 _MSTL advance(it, _MSTL min(count_, _MSTL distance(base_.begin(), base_.end())));
559 return iterator(it, 0);
560 }
561
562 constexpr V base() const & requires copy_constructible<V> { return base_; }
563 constexpr V base() && { return _MSTL move(base_); }
564};
565
566template <typename V>
567take_view(V&&, iter_difference_t<decltype(_MSTL declval<V>().begin())>) -> take_view<V>;
568
569
570template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel, typename Pred>
571class take_while_iterator {
572public:
573 using iterator_category = forward_iterator_tag;
574 using value_type = iter_value_t<BaseIter>;
575 using difference_type = iter_difference_t<BaseIter>;
577 using reference = iter_reference_t<BaseIter>;
578
579 constexpr take_while_iterator() = default;
580
581 constexpr take_while_iterator(BaseIter current, Sentinel end, const Pred* pred)
582 : current_(current), end_(end), pred_(pred), done_(current == end || !(*pred)(*current)) {}
583
584 constexpr reference operator*() const {
585 return *current_;
586 }
587
588 constexpr pointer operator->() const {
589 return _MSTL addressof(*current_);
590 }
591
592 constexpr take_while_iterator& operator++() {
593 ++current_;
594 if (current_ == end_ || !(*pred_)(*current_)) done_ = true;
595 return *this;
596 }
597
598 constexpr take_while_iterator operator++(int) {
599 auto tmp = *this;
600 ++(*this);
601 return tmp;
602 }
603
604 constexpr bool operator==(const take_while_iterator& other) const {
605 return current_ == other.current_ && done_ == other.done_;
606 }
607 constexpr bool operator!=(const take_while_iterator& other) const {
608 return !(*this == other);
609 }
610
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;
615 }
616 template <typename S>
617 requires (!same_as<S, take_while_iterator>)
618 constexpr bool operator!=(const S& s) const {
619 return !(*this == s);
620 }
621
622 template <typename S>
623 friend constexpr bool operator ==(const S& s, const take_while_iterator& t) {
624 return t.done_ || t.current_ == s;
625 }
626
627 template <typename S>
628 friend constexpr bool operator !=(const S& s, const take_while_iterator& t) {
629 return !(s == t);
630 }
631
632private:
633 BaseIter current_{};
634 Sentinel end_{};
635 const Pred* pred_ = nullptr;
636 bool done_ = false;
637};
638
639template <View V, typename Pred>
640class take_while_view : public view_base<take_while_view<V, Pred>> {
641public:
642 using base_iterator = decltype(_MSTL declval<V>().begin());
643 using base_sentinel = decltype(_MSTL declval<V>().end());
644 using iterator = take_while_iterator<base_iterator, base_sentinel, Pred>;
645 using sentinel = base_sentinel;
646
647private:
648 V base_;
649 Pred pred_;
650
651public:
652 constexpr take_while_view() = default;
653
654 constexpr take_while_view(V base, Pred pred)
655 : base_(_MSTL move(base)), pred_(_MSTL move(pred)) {}
656
657 constexpr iterator begin() {
658 return iterator(base_.begin(), base_.end(), &pred_);
659 }
660 constexpr sentinel end() {
661 return base_.end();
662 }
663
664 constexpr iterator begin() const
665 requires Range<const V> {
666 return iterator(base_.begin(), base_.end(), &pred_);
667 }
668 constexpr sentinel end() const
669 requires Range<const V> {
670 return base_.end();
671 }
672
673 constexpr V base() const & requires copy_constructible<V> { return base_; }
674 constexpr V base() && { return _MSTL move(base_); }
675};
676
677template <typename V, typename Pred>
678take_while_view(V&&, Pred) -> take_while_view<V, Pred>;
679
680
681template <View V>
682class drop_view : public view_base<drop_view<V>> {
683public:
684 using iterator = decltype(_MSTL declval<V>().begin());
685 using sentinel = decltype(_MSTL declval<V>().end());
686 using difference_type = iter_difference_t<iterator>;
687
688private:
689 V base_;
690 difference_type count_ = 0;
691
692public:
693 constexpr drop_view() = default;
694
695 constexpr drop_view(V base, difference_type count)
696 : base_(_MSTL move(base)), count_(count) {}
697
698 constexpr drop_view(drop_view&&) requires movable<V> = default;
699 constexpr drop_view& operator =(drop_view&&) requires movable<V> = default;
700
701 constexpr drop_view(const drop_view&) requires copy_constructible<V> = default;
702 constexpr drop_view& operator =(const drop_view&) requires copyable<V> = default;
703
704 constexpr iterator begin() {
705 auto it = base_.begin();
706 auto end = base_.end();
707 auto n = count_;
708 while (n > 0 && it != end) {
709 ++it;
710 --n;
711 }
712 return it;
713 }
714
715 constexpr sentinel end() {
716 return base_.end();
717 }
718
719 constexpr iterator begin() const
720 requires Range<const V> {
721 auto it = base_.begin();
722 auto end = base_.end();
723 auto n = count_;
724 while (n > 0 && it != end) {
725 ++it;
726 --n;
727 }
728 return it;
729 }
730
731 constexpr sentinel end() const
732 requires Range<const V> {
733 return base_.end();
734 }
735
736 constexpr V base() const & requires copy_constructible<V> { return base_; }
737 constexpr V base() && { return _MSTL move(base_); }
738};
739
740template <typename V>
741drop_view(V&&, iter_difference_t<decltype(_MSTL declval<V>().begin())>) -> drop_view<V>;
742
743
744template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel, typename Pred>
745class drop_while_iterator {
746public:
747 using iterator_category = forward_iterator_tag;
748 using value_type = iter_value_t<BaseIter>;
749 using difference_type = iter_difference_t<BaseIter>;
751 using reference = iter_reference_t<BaseIter>;
752
753 constexpr drop_while_iterator() = default;
754
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();
758 }
759
760 constexpr reference operator*() const {
761 return *current_;
762 }
763
764 constexpr pointer operator->() const {
765 return _MSTL addressof(*current_);
766 }
767
768 constexpr drop_while_iterator& operator++() {
769 ++current_;
770 return *this;
771 }
772
773 constexpr drop_while_iterator operator++(int) {
774 auto tmp = *this;
775 ++(*this);
776 return tmp;
777 }
778
779 constexpr bool operator==(const drop_while_iterator& other) const {
780 return current_ == other.current_;
781 }
782 constexpr bool operator!=(const drop_while_iterator& other) const {
783 return !(*this == other);
784 }
785
786 template <typename S>
787 requires (!same_as<S, drop_while_iterator>)
788 constexpr bool operator==(const S& s) const {
789 return current_ == s;
790 }
791 template <typename S>
792 requires (!same_as<S, drop_while_iterator>)
793 constexpr bool operator!=(const S& s) const {
794 return !(*this == s);
795 }
796
797 template <typename S>
798 friend constexpr bool operator ==(const S& s, const drop_while_iterator& t) {
799 return t.current_ == s;
800 }
801
802 template <typename S>
803 friend constexpr bool operator !=(const S& s, const drop_while_iterator& t) {
804 return t.current_ != s;
805 }
806
807private:
808 constexpr void satisfy_predicate_forward() {
809 if (started_) return;
810 started_ = true;
811 while (current_ != end_ && (*pred_)(*current_)) {
812 ++current_;
813 }
814 }
815
816 BaseIter current_{};
817 Sentinel end_{};
818 const Pred* pred_ = nullptr;
819 bool started_ = false;
820};
821
822template <View V, typename Pred>
823class drop_while_view : public view_base<drop_while_view<V, Pred>> {
824public:
825 using base_iterator = decltype(_MSTL declval<V>().begin());
826 using base_sentinel = decltype(_MSTL declval<V>().end());
827 using iterator = drop_while_iterator<base_iterator, base_sentinel, Pred>;
828 using sentinel = base_sentinel;
829
830private:
831 V base_;
832 Pred pred_;
833
834public:
835 constexpr drop_while_view() = default;
836
837 constexpr drop_while_view(V base, Pred pred)
838 : base_(_MSTL move(base)), pred_(_MSTL move(pred)) {}
839
840 constexpr iterator begin() {
841 return iterator(base_.begin(), base_.end(), &pred_);
842 }
843 constexpr sentinel end() {
844 return base_.end();
845 }
846
847 constexpr iterator begin() const
848 requires Range<const V> {
849 return iterator(base_.begin(), base_.end(), &pred_);
850 }
851 constexpr sentinel end() const
852 requires Range<const V> {
853 return base_.end();
854 }
855
856 constexpr V base() const & requires copy_constructible<V> { return base_; }
857 constexpr V base() && { return _MSTL move(base_); }
858};
859
860template <typename V, typename Pred>
861drop_while_view(V&&, Pred) -> drop_while_view<V, Pred>;
862
863
864template <bidirectional_iterator Iter>
865class reverse_iterator {
866public:
867 using iterator_category = bidirectional_iterator_tag;
872
873 constexpr reverse_iterator() = default;
874 constexpr explicit reverse_iterator(Iter current) : current_(current) {}
875
876 constexpr reference operator*() const {
877 auto tmp = current_;
878 return *--tmp;
879 }
880
881 constexpr pointer operator->() const {
882 auto tmp = current_;
883 return _MSTL addressof(*--tmp);
884 }
885
886 constexpr reverse_iterator& operator++() {
887 --current_;
888 return *this;
889 }
890
891 constexpr reverse_iterator operator++(int) {
892 auto tmp = *this;
893 --current_;
894 return tmp;
895 }
896
897 constexpr reverse_iterator& operator--() {
898 ++current_;
899 return *this;
900 }
901
902 constexpr reverse_iterator operator--(int) {
903 auto tmp = *this;
904 ++current_;
905 return tmp;
906 }
907
908 constexpr bool operator==(const reverse_iterator& other) const {
909 return current_ == other.current_;
910 }
911
912 constexpr bool operator!=(const reverse_iterator& other) const {
913 return !(*this == other);
914 }
915
916private:
917 Iter current_{};
918};
919
920template <View V>
921 requires bidirectional_iterator<decltype(_MSTL declval<V>().begin())> && common_range<V>
922class reverse_view : public view_base<reverse_view<V>> {
923public:
924 using base_iterator = decltype(_MSTL declval<V>().begin());
925 using iterator = reverse_iterator<base_iterator>;
926
927private:
928 V base_;
929
930public:
931 constexpr reverse_view() = default;
932 constexpr explicit reverse_view(V base) : base_(_MSTL move(base)) {}
933
934 constexpr reverse_view(reverse_view&&) requires movable<V> = default;
935 constexpr reverse_view& operator =(reverse_view&&) requires movable<V> = default;
936
937 constexpr reverse_view(const reverse_view&) requires copy_constructible<V> = default;
938 constexpr reverse_view& operator =(const reverse_view&) requires copyable<V> = default;
939
940 constexpr iterator begin() {
941 return iterator(base_.end());
942 }
943 constexpr iterator end() {
944 return iterator(base_.begin());
945 }
946
947 constexpr iterator begin() const
948 requires Range<const V> {
949 return iterator(base_.end());
950 }
951 constexpr iterator end() const
952 requires Range<const V> {
953 return iterator(base_.begin());
954 }
955
956 constexpr V base() const & requires copy_constructible<V> { return base_; }
957 constexpr V base() && { return _MSTL move(base_); }
958};
959
960template <typename V>
961reverse_view(V&&) -> reverse_view<V>;
962
963
964template <typename T>
965class iota_iterator {
966public:
967 using iterator_category = forward_iterator_tag;
968 using value_type = T;
969 using difference_type = conditional_t<
970 is_integral_v<T>,
971 conditional_t<sizeof(T) < sizeof(int), int, T>,
973 >;
974 using pointer = const T*;
975 using reference = T;
976
977 constexpr iota_iterator() = default;
978 constexpr explicit iota_iterator(T value) : value_(value) {}
979
980 constexpr reference operator*() const { return value_; }
981 constexpr pointer operator->() const { return &value_; }
982
983 constexpr iota_iterator& operator++() {
984 ++value_;
985 return *this;
986 }
987
988 constexpr iota_iterator operator++(int) {
989 auto tmp = *this;
990 ++value_;
991 return tmp;
992 }
993
994 constexpr bool operator==(const iota_iterator& other) const {
995 return value_ == other.value_;
996 }
997 constexpr bool operator!=(const iota_iterator& other) const {
998 return value_ != other.value_;
999 }
1000
1001 constexpr bool operator <(const iota_iterator& other) const
1002 requires totally_ordered<T> {
1003 return value_ < other.value_;
1004 }
1005
1006private:
1007 T value_{};
1008};
1009
1010template <typename T>
1011class iota_view : public view_base<iota_view<T>> {
1012public:
1013 using iterator = iota_iterator<T>;
1014
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) {}
1018
1019 constexpr iterator begin() const { return iterator(start_); }
1020 constexpr iterator end() const {
1021 return has_bound_ ? iterator(bound_) : iterator(start_);
1022 }
1023
1024private:
1025 T start_{};
1026 T bound_{};
1027 bool has_bound_ = false;
1028};
1029
1030template <typename T>
1031iota_view(T) -> iota_view<T>;
1032
1033template <typename T>
1034iota_view(T, T) -> iota_view<T>;
1035
1036
1037template <typename T>
1038class repeat_iterator {
1039public:
1040 using iterator_category = forward_iterator_tag;
1041 using value_type = T;
1042 using difference_type = ptrdiff_t;
1043 using pointer = const T*;
1044 using reference = const T&;
1045
1046 constexpr repeat_iterator() = default;
1047 constexpr repeat_iterator(const T* value, difference_type count)
1048 : value_(value), count_(count) {}
1049
1050 constexpr reference operator*() const { return *value_; }
1051 constexpr pointer operator->() const { return value_; }
1052
1053 constexpr repeat_iterator& operator++() {
1054 if (count_ > 0) --count_;
1055 return *this;
1056 }
1057
1058 constexpr repeat_iterator operator++(int) {
1059 auto tmp = *this;
1060 ++(*this);
1061 return tmp;
1062 }
1063
1064 constexpr bool operator==(const repeat_iterator& other) const {
1065 return count_ == other.count_;
1066 }
1067 constexpr bool operator!=(const repeat_iterator& other) const {
1068 return count_ != other.count_;
1069 }
1070
1071private:
1072 const T* value_ = nullptr;
1073 difference_type count_ = 0;
1074};
1075
1076template <typename T>
1077class repeat_view : public view_base<repeat_view<T>> {
1078public:
1079 using iterator = repeat_iterator<T>;
1080 using difference_type = ptrdiff_t;
1081
1082 constexpr repeat_view() = default;
1083
1084 constexpr explicit repeat_view(T value)
1085 : value_(_MSTL move(value)) {}
1086
1087 constexpr repeat_view(T value, const difference_type count)
1088 : value_(_MSTL move(value)), count_(count), has_bound_(true) {}
1089
1090 constexpr iterator begin() const {
1091 return has_bound_ ? iterator(&value_, count_) : iterator(&value_, -1);
1092 }
1093 constexpr iterator end() const {
1094 return iterator(&value_, 0);
1095 }
1096
1097private:
1098 T value_{};
1099 difference_type count_ = 0;
1100 bool has_bound_ = false;
1101};
1102
1103template <typename T>
1104repeat_view(T) -> repeat_view<T>;
1105
1106template <typename T, typename N>
1107repeat_view(T, N) -> repeat_view<T>;
1108
1109
1110template <typename OuterIter, typename OuterSentinel>
1111class join_iterator {
1112private:
1113 using outer_reference = iter_reference_t<OuterIter>;
1114 using inner_range = remove_cvref_t<outer_reference>;
1115 using inner_iterator = decltype(_MSTL declval<inner_range>().begin());
1116 using inner_sentinel = decltype(_MSTL declval<inner_range>().end());
1117
1118public:
1119 using iterator_category = forward_iterator_tag;
1120 using value_type = iter_value_t<inner_iterator>;
1121 using difference_type = iter_difference_t<inner_iterator>;
1123 using reference = iter_reference_t<inner_iterator>;
1124
1125 constexpr join_iterator() = default;
1126
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();
1132 satisfy();
1133 }
1134 }
1135
1136 constexpr reference operator*() const { return *inner_current_; }
1137 constexpr pointer operator->() const { return _MSTL addressof(*inner_current_); }
1138
1139 constexpr join_iterator& operator++() {
1140 ++inner_current_;
1141 satisfy();
1142 return *this;
1143 }
1144
1145 constexpr join_iterator operator++(int) {
1146 auto tmp = *this;
1147 ++(*this);
1148 return tmp;
1149 }
1150
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_);
1154 }
1155 constexpr bool operator!=(const join_iterator& other) const {
1156 return !(*this == other);
1157 }
1158
1159private:
1160 constexpr void satisfy() {
1161 while (outer_current_ != outer_end_ && inner_current_ == inner_end_) {
1162 ++outer_current_;
1163 if (outer_current_ != outer_end_) {
1164 inner_current_ = (*outer_current_).begin();
1165 inner_end_ = (*outer_current_).end();
1166 }
1167 }
1168 }
1169
1170 OuterIter outer_current_{};
1171 OuterSentinel outer_end_{};
1172 inner_iterator inner_current_{};
1173 inner_sentinel inner_end_{};
1174};
1175
1176template <View V>
1177 requires Range<iter_reference_t<decltype(_MSTL declval<V>().begin())>>
1178class join_view : public view_base<join_view<V>> {
1179public:
1180 using outer_iterator = decltype(_MSTL declval<V>().begin());
1181 using outer_sentinel = decltype(_MSTL declval<V>().end());
1182 using iterator = join_iterator<outer_iterator, outer_sentinel>;
1183
1184 constexpr join_view() = default;
1185 constexpr explicit join_view(V base) : base_(_MSTL move(base)) {}
1186
1187 constexpr iterator begin() {
1188 return iterator(base_.begin(), base_.end());
1189 }
1190 constexpr iterator end() {
1191 return iterator(base_.end(), base_.end());
1192 }
1193
1194 constexpr iterator begin() const
1195 requires Range<const V> {
1196 return iterator(base_.begin(), base_.end());
1197 }
1198 constexpr iterator end() const
1199 requires Range<const V> {
1200 return iterator(base_.end(), base_.end());
1201 }
1202
1203 constexpr V base() const & requires copy_constructible<V> { return base_; }
1204 constexpr V base() && { return _MSTL move(base_); }
1205
1206private:
1207 V base_;
1208};
1209
1210template <typename V>
1211join_view(V&&) -> join_view<V>;
1212
1213
1214template <size_t N, typename BaseIter>
1215class element_iterator {
1216public:
1217 using base_reference = iter_reference_t<BaseIter>;
1218 using element_type = decltype(_MSTL get<N>(_MSTL declval<base_reference>()));
1219 using iterator_category = forward_iterator_tag;
1220 using value_type = remove_cvref_t<element_type>;
1221 using difference_type = iter_difference_t<BaseIter>;
1222 using pointer = add_pointer_t<element_type>;
1223 using reference = element_type;
1224
1225 constexpr element_iterator() = default;
1226 constexpr explicit element_iterator(BaseIter current) : current_(current) {}
1227
1228 constexpr reference operator*() const {
1229 return _MSTL get<N>(*current_);
1230 }
1231
1232 constexpr pointer operator->() const {
1233 return _MSTL addressof(_MSTL get<N>(*current_));
1234 }
1235
1236 constexpr element_iterator& operator++() {
1237 ++current_;
1238 return *this;
1239 }
1240
1241 constexpr element_iterator operator++(int) {
1242 auto tmp = *this;
1243 ++current_;
1244 return tmp;
1245 }
1246
1247 constexpr bool operator==(const element_iterator& other) const {
1248 return current_ == other.current_;
1249 }
1250 constexpr bool operator!=(const element_iterator& other) const {
1251 return current_ != other.current_;
1252 }
1253
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;
1258 }
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;
1263 }
1264
1265private:
1266 BaseIter current_{};
1267};
1268
1269template <size_t N, View V>
1270class element_view : public view_base<element_view<N, V>> {
1271public:
1272 using base_iterator = decltype(_MSTL declval<V>().begin());
1273 using base_sentinel = decltype(_MSTL declval<V>().end());
1274 using iterator = element_iterator<N, base_iterator>;
1275 using sentinel = base_sentinel;
1276
1277 constexpr element_view() = default;
1278 constexpr explicit element_view(V base) : base_(_MSTL move(base)) {}
1279
1280 constexpr iterator begin() {
1281 return iterator(base_.begin());
1282 }
1283 constexpr sentinel end() {
1284 return base_.end();
1285 }
1286
1287 constexpr iterator begin() const
1288 requires Range<const V> {
1289 return iterator(base_.begin());
1290 }
1291 constexpr sentinel end() const
1292 requires Range<const V> {
1293 return base_.end();
1294 }
1295
1296 constexpr V base() const & requires copy_constructible<V> { return base_; }
1297 constexpr V base() && { return _MSTL move(base_); }
1298
1299private:
1300 V base_;
1301};
1302
1303
1304template <View V>
1305 requires (!common_range<V>)
1306class common_view : public view_base<common_view<V>> {
1307public:
1308 using base_iterator = decltype(_MSTL declval<V>().begin());
1309 using base_sentinel = decltype(_MSTL declval<V>().end());
1310 using iterator = base_iterator;
1311 using sentinel = base_iterator;
1312
1313 constexpr common_view() = default;
1314 constexpr explicit common_view(V base) : base_(_MSTL move(base)) {}
1315
1316 constexpr iterator begin() {
1317 return base_.begin();
1318 }
1319
1320 constexpr iterator end() {
1321 auto it = base_.begin();
1322 auto sen = base_.end();
1323 while (it != sen) ++it;
1324 return it;
1325 }
1326
1327 constexpr iterator begin() const
1328 requires Range<const V> {
1329 return base_.begin();
1330 }
1331
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;
1337 return it;
1338 }
1339
1340 constexpr V base() const & requires copy_constructible<V> { return base_; }
1341 constexpr V base() && { return _MSTL move(base_); }
1342
1343private:
1344 V base_;
1345};
1346
1347template <typename V>
1348common_view(V&&) -> common_view<V>;
1349
1350
1351template <typename Iter>
1352class counted_iterator {
1353public:
1354 using iterator_category = forward_iterator_tag;
1355 using value_type = iter_value_t<Iter>;
1356 using difference_type = iter_difference_t<Iter>;
1357 using pointer = add_pointer_t<iter_reference_t<Iter>>;
1358 using reference = iter_reference_t<Iter>;
1359
1360 constexpr counted_iterator() = default;
1361 constexpr counted_iterator(Iter current, difference_type count)
1362 : current_(current), count_(count) {}
1363
1364 constexpr reference operator*() const { return *current_; }
1365 constexpr pointer operator->() const { return _MSTL addressof(*current_); }
1366
1367 constexpr counted_iterator& operator++() {
1368 ++current_;
1369 --count_;
1370 return *this;
1371 }
1372
1373 constexpr counted_iterator operator++(int) {
1374 auto tmp = *this;
1375 ++(*this);
1376 return tmp;
1377 }
1378
1379 constexpr bool operator==(const counted_iterator& other) const {
1380 return count_ == other.count_;
1381 }
1382 constexpr bool operator!=(const counted_iterator& other) const {
1383 return count_ != other.count_;
1384 }
1385
1386 constexpr Iter base() const { return current_; }
1387 constexpr difference_type count() const { return count_; }
1388
1389private:
1390 Iter current_{};
1391 difference_type count_ = 0;
1392};
1393
1394template <typename Iter>
1395class counted_view : public view_base<counted_view<Iter>> {
1396public:
1397 using iterator = counted_iterator<Iter>;
1398 using difference_type = iter_difference_t<Iter>;
1399
1400 constexpr counted_view() = default;
1401 constexpr counted_view(Iter iter, difference_type count)
1402 : iter_(iter), count_(count) {}
1403
1404 constexpr iterator begin() const {
1405 return iterator(iter_, count_);
1406 }
1407 constexpr iterator end() const {
1408 return iterator(iter_, 0);
1409 }
1410
1411private:
1412 Iter iter_;
1413 difference_type count_ = 0;
1414};
1415
1416template <typename Iter, typename N>
1417counted_view(Iter, N) -> counted_view<Iter>;
1418
1419
1420template <View V1, View V2>
1421class concat_view : public view_base<concat_view<V1, V2>> {
1422 V1 v1_;
1423 V2 v2_;
1424
1425public:
1426 concat_view() = default;
1427 concat_view(V1 v1, V2 v2) : v1_(_MSTL move(v1)), v2_(_MSTL move(v2)) {}
1428
1429 struct iterator {
1430 using iter1_t = decltype(_MSTL declval<V1>().begin());
1431 using iter2_t = decltype(_MSTL declval<V2>().begin());
1432
1433 using iterator_category = forward_iterator_tag;
1434 using value_type = common_type_t<
1436 using difference_type = common_type_t<
1438 using pointer = void;
1439 using reference = common_reference_t<
1441
1442 iter1_t current1_;
1443 iter1_t end1_;
1444 iter2_t current2_;
1445 iter2_t end2_;
1446 bool in_first_ = true;
1447
1448 iterator() = default;
1449
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_) {
1453 in_first_ = false;
1454 }
1455 }
1456
1457 reference operator*() const {
1458 return in_first_ ? *current1_ : *current2_;
1459 }
1460
1461 iterator& operator++() {
1462 if (in_first_) {
1463 ++current1_;
1464 if (current1_ == end1_) {
1465 in_first_ = false;
1466 }
1467 } else {
1468 ++current2_;
1469 }
1470 return *this;
1471 }
1472
1473 iterator operator++(int) {
1474 auto tmp = *this;
1475 ++*this;
1476 return tmp;
1477 }
1478
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_;
1483 }
1484
1485 bool operator!=(const iterator& other) const {
1486 return !(*this == other);
1487 }
1488 };
1489
1490 auto begin() {
1491 return iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end());
1492 }
1493 auto end() {
1494 return iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end());
1495 }
1496 auto begin() const {
1497 return iterator(v1_.begin(), v1_.end(), v2_.begin(), v2_.end());
1498 }
1499 auto end() const {
1500 return iterator(v1_.end(), v1_.end(), v2_.end(), v2_.end());
1501 }
1502};
1503
1504
1505template <typename Iterator>
1506class subrange_view : public view_base<subrange_view<Iterator>> {
1507 Iterator first_;
1508 Iterator last_;
1509
1510public:
1511 subrange_view() = default;
1512 subrange_view(Iterator first, Iterator last) : first_(first), last_(last) {}
1513
1514 Iterator begin() const { return first_; }
1515 Iterator end() const { return last_; }
1516};
1517
1518template <View V, typename T>
1519class split_view : public view_base<split_view<V, T>> {
1520 V base_;
1521 T delimiter_;
1522
1523 using base_iterator = decltype(_MSTL declval<V>().begin());
1524 using base_sentinel = decltype(_MSTL declval<V>().end());
1525
1526public:
1527 struct iterator {
1528 base_iterator current_;
1529 base_sentinel end_;
1530 T delimiter_;
1531
1532 using iterator_category = forward_iterator_tag;
1533 using value_type = subrange_view<base_iterator>;
1534 using difference_type = iter_difference_t<base_iterator>;
1535 using pointer = void;
1536 using reference = value_type;
1537
1538 iterator() = default;
1539 iterator(base_iterator cur, base_sentinel end, T delim)
1540 : current_(cur), end_(end), delimiter_(delim) {}
1541
1542 value_type operator*() const {
1543 base_iterator start = current_;
1544 base_iterator iter = current_;
1545 while (iter != end_ && !(*iter == delimiter_)) ++iter;
1546 return value_type{start, iter};
1547 }
1548
1549 iterator& operator++() {
1550 if (current_ == end_) return *this;
1551 while (current_ != end_ && !(*current_ == delimiter_)) ++current_;
1552 if (current_ != end_) ++current_;
1553 return *this;
1554 }
1555
1556 iterator operator++(int) {
1557 auto tmp = *this;
1558 ++(*this);
1559 return tmp;
1560 }
1561
1562 bool operator==(const iterator& other) const {
1563 return current_ == other.current_;
1564 }
1565 bool operator!=(const iterator& other) const {
1566 return !(*this == other);
1567 }
1568 };
1569
1570 split_view() = default;
1571
1572 split_view(V base, T delimiter)
1573 : base_(_MSTL move(base)), delimiter_(delimiter) {}
1574
1575 iterator begin() {
1576 return iterator{base_.begin(), base_.end(), delimiter_};
1577 }
1578 iterator end() {
1579 return iterator{base_.end(), base_.end(), delimiter_};
1580 }
1581};
1582
1583
1584template <View V>
1585class slice_view : public view_base<slice_view<V>> {
1586 V base_;
1589
1590 using base_iterator = decltype(_MSTL declval<V>().begin());
1591
1592 struct cache_t {
1593 base_iterator begin_;
1594 base_iterator end_;
1595 };
1596 mutable cache_t cache_;
1597 mutable bool has_value_ = false;
1598
1599 void ensure_cache() const {
1600 if (has_value_) return;
1601
1602 auto b = base_.begin();
1603 auto e = base_.end();
1604
1605 for (auto i = 0; i < offset_ && b != e; ++i, ++b);
1606 auto begin_it = b;
1607
1608 for (auto i = 0; i < length_ && b != e; ++i, ++b);
1609 auto end_it = b;
1610
1611 cache_ = cache_t{begin_it, end_it};
1612 has_value_ = true;
1613 }
1614
1615public:
1616 slice_view() = default;
1617
1618 slice_view(V base, iter_difference_t<base_iterator> offset,
1620 : base_(_MSTL move(base)), offset_(offset), length_(length) {}
1621
1622 base_iterator begin() {
1623 ensure_cache();
1624 return cache_.begin_;
1625 }
1626
1627 base_iterator end() {
1628 ensure_cache();
1629 return cache_.end_;
1630 }
1631
1632 base_iterator begin() const
1633 requires Range<const V> {
1634 ensure_cache();
1635 return cache_.begin_;
1636 }
1637
1638 base_iterator end() const
1639 requires Range<const V> {
1640 ensure_cache();
1641 return cache_.end_;
1642 }
1643};
1644
1645
1646template <typename Derived>
1647struct range_adaptor_closure {
1648 template <typename OtherClosure>
1649 friend constexpr auto operator |(
1650 range_adaptor_closure<Derived> lhs,
1651 range_adaptor_closure<OtherClosure> rhs) {
1652 return [
1653 lhs = static_cast<const Derived&>(lhs),
1654 rhs = static_cast<const OtherClosure&>(rhs)
1655 ](auto&& range) {
1656 return _MSTL forward<decltype(range)>(range) | lhs | rhs;
1657 };
1658 }
1659};
1660
1661
1663
1664struct all_adaptor {
1665 template <Range R>
1666 constexpr auto operator ()(R&& range) const {
1667 return all(_MSTL forward<R>(range));
1668 }
1669};
1670
1671MSTL_INLINE17 constexpr all_adaptor all;
1672
1673
1674template <typename Pred>
1675struct filter_adaptor_closure : range_adaptor_closure<filter_adaptor_closure<Pred>> {
1676 Pred pred;
1677
1678 constexpr explicit filter_adaptor_closure(Pred p) : pred(_MSTL move(p)) {}
1679
1680 template <Range R>
1681 constexpr auto operator ()(R&& range) const {
1682 return filter_view{all(_MSTL forward<R>(range)), pred};
1683 }
1684};
1685
1686struct filter_adaptor {
1687 template <typename Pred>
1688 constexpr auto operator ()(Pred pred) const {
1689 return filter_adaptor_closure<Pred>{_MSTL move(pred)};
1690 }
1691
1692 template <Range R, typename Pred>
1693 constexpr auto operator ()(R&& range, Pred pred) const {
1694 return filter_view{all(_MSTL forward<R>(range)), _MSTL move(pred)};
1695 }
1696};
1697
1698MSTL_INLINE17 constexpr filter_adaptor filter;
1699
1700
1701template <typename Func>
1702struct transform_adaptor_closure : range_adaptor_closure<transform_adaptor_closure<Func>> {
1703 Func func;
1704
1705 constexpr explicit transform_adaptor_closure(Func f) : func(_MSTL move(f)) {}
1706
1707 template <Range R>
1708 constexpr auto operator ()(R&& range) const {
1709 return transform_view{all(_MSTL forward<R>(range)), func};
1710 }
1711};
1712
1713struct transform_adaptor {
1714 template <typename Func>
1715 constexpr auto operator ()(Func func) const {
1716 return transform_adaptor_closure<Func>{_MSTL move(func)};
1717 }
1718
1719 template <Range R, typename Func>
1720 constexpr auto operator ()(R&& range, Func func) const {
1721 return transform_view{all(_MSTL forward<R>(range)), _MSTL move(func)};
1722 }
1723};
1724
1725MSTL_INLINE17 constexpr transform_adaptor transform;
1726
1727
1728template <typename DiffType>
1729struct take_adaptor_closure : range_adaptor_closure<take_adaptor_closure<DiffType>> {
1730 DiffType count;
1731
1732 constexpr explicit take_adaptor_closure(DiffType n) : count(n) {}
1733
1734 template <Range R>
1735 constexpr auto operator ()(R&& range) const {
1736 return take_view{all(_MSTL forward<R>(range)), count};
1737 }
1738};
1739
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};
1744 }
1745
1746 template <Range R, typename N> requires is_integral_v<N>
1747 constexpr auto operator ()(R&& range, N count) const {
1748 return take_view{all(_MSTL forward<R>(range)), count};
1749 }
1750};
1751
1752MSTL_INLINE17 constexpr take_adaptor take;
1753
1754
1755template <typename Pred>
1756struct take_while_adaptor_closure : range_adaptor_closure<take_while_adaptor_closure<Pred>> {
1757 Pred pred;
1758
1759 constexpr explicit take_while_adaptor_closure(Pred p) : pred(_MSTL move(p)) {}
1760
1761 template <Range R>
1762 constexpr auto operator ()(R&& range) const {
1763 return take_while_view{all(_MSTL forward<R>(range)), pred};
1764 }
1765};
1766
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)};
1771 }
1772
1773 template <Range R, typename Pred>
1774 constexpr auto operator ()(R&& range, Pred pred) const {
1775 return take_while_view{all(_MSTL forward<R>(range)), _MSTL move(pred)};
1776 }
1777};
1778
1779MSTL_INLINE17 constexpr take_while_adaptor take_while;
1780
1781
1782template <typename DiffType>
1783struct drop_adaptor_closure : range_adaptor_closure<drop_adaptor_closure<DiffType>> {
1784 DiffType count;
1785
1786 constexpr explicit drop_adaptor_closure(DiffType n) : count(n) {}
1787
1788 template <Range R>
1789 constexpr auto operator ()(R&& range) const {
1790 return drop_view{all(_MSTL forward<R>(range)), count};
1791 }
1792};
1793
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};
1798 }
1799
1800 template <Range R, typename N> requires is_integral_v<N>
1801 constexpr auto operator ()(R&& range, N count) const {
1802 return drop_view{all(_MSTL forward<R>(range)), count};
1803 }
1804};
1805
1806MSTL_INLINE17 constexpr drop_adaptor drop;
1807
1808
1809template <typename Pred>
1810struct drop_while_adaptor_closure : range_adaptor_closure<drop_while_adaptor_closure<Pred>> {
1811 Pred pred;
1812
1813 constexpr explicit drop_while_adaptor_closure(Pred p) : pred(_MSTL move(p)) {}
1814
1815 template <Range R>
1816 constexpr auto operator ()(R&& range) const {
1817 return drop_while_view{all(_MSTL forward<R>(range)), pred};
1818 }
1819};
1820
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)};
1825 }
1826
1827 template <Range R, typename Pred>
1828 constexpr auto operator ()(R&& range, Pred pred) const {
1829 return drop_while_view{all(_MSTL forward<R>(range)), _MSTL move(pred)};
1830 }
1831};
1832
1833MSTL_INLINE17 constexpr drop_while_adaptor drop_while;
1834
1835
1836struct reverse_adaptor_closure : range_adaptor_closure<reverse_adaptor_closure> {
1837 template <Range R>
1838 requires bidirectional_iterator<decltype(_MSTL declval<R>().begin())>
1839 constexpr auto operator ()(R&& range) const {
1840 return reverse_view{all(_MSTL forward<R>(range))};
1841 }
1842};
1843
1844struct reverse_adaptor {
1845 constexpr auto operator ()() const {
1846 return reverse_adaptor_closure{};
1847 }
1848
1849 template <Range R>
1850 requires bidirectional_iterator<decltype(_MSTL declval<R>().begin())>
1851 constexpr auto operator ()(R&& range) const {
1852 return reverse_view{all(_MSTL forward<R>(range))};
1853 }
1854};
1855
1856MSTL_INLINE17 constexpr reverse_adaptor reverse;
1857
1858
1859struct iota_adaptor {
1860 template <typename T>
1861 constexpr auto operator ()(T start) const {
1862 return iota_view<T>{start};
1863 }
1864
1865 template <typename T>
1866 constexpr auto operator ()(T start, T bound) const {
1867 return iota_view<T>{start, bound};
1868 }
1869};
1870
1871MSTL_INLINE17 constexpr iota_adaptor iota;
1872
1873
1874struct repeat_adaptor {
1875 template <typename T>
1876 constexpr auto operator ()(T value) const {
1877 return repeat_view<T>{_MSTL move(value)};
1878 }
1879
1880 template <typename T, typename N> requires is_integral_v<N>
1881 constexpr auto operator ()(T value, N count) const {
1882 return repeat_view<T>{_MSTL move(value), static_cast<ptrdiff_t>(count)};
1883 }
1884};
1885
1886MSTL_INLINE17 constexpr repeat_adaptor repeat;
1887
1888
1889struct join_adaptor_closure : range_adaptor_closure<join_adaptor_closure> {
1890 template <Range R>
1891 requires Range<iter_reference_t<decltype(_MSTL declval<R>().begin())>>
1892 constexpr auto operator ()(R&& range) const {
1893 return join_view{all(_MSTL forward<R>(range))};
1894 }
1895};
1896
1897struct join_adaptor {
1898 constexpr auto operator ()() const {
1899 return join_adaptor_closure{};
1900 }
1901
1902 template <Range R>
1903 requires Range<iter_reference_t<decltype(_MSTL declval<R>().begin())>>
1904 constexpr auto operator ()(R&& range) const {
1905 return join_view{all(_MSTL forward<R>(range))};
1906 }
1907};
1908
1909MSTL_INLINE17 constexpr join_adaptor join;
1910
1911
1912template <size_t N>
1913struct elements_adaptor_closure : range_adaptor_closure<elements_adaptor_closure<N>> {
1914 template <Range R>
1915 constexpr auto operator ()(R&& range) const {
1916 return element_view<N, decltype(all(_MSTL forward<R>(range)))>{
1917 all(_MSTL forward<R>(range))
1918 };
1919 }
1920};
1921
1922template <size_t N>
1923struct elements_adaptor {
1924 constexpr auto operator ()() const {
1925 return elements_adaptor_closure<N>{};
1926 }
1927
1928 template <Range R>
1929 constexpr auto operator ()(R&& range) const {
1930 return element_view<N, decltype(all(_MSTL forward<R>(range)))>{
1931 all(_MSTL forward<R>(range))
1932 };
1933 }
1934};
1935
1936template <size_t N>
1937MSTL_INLINE17 constexpr elements_adaptor<N> elements;
1938
1939MSTL_INLINE17 constexpr auto keys = elements<0>;
1940MSTL_INLINE17 constexpr auto values = elements<1>;
1941
1942
1943struct common_adaptor_closure : range_adaptor_closure<common_adaptor_closure> {
1944 template <Range R>
1945 constexpr auto operator ()(R&& range) const {
1946 if constexpr (common_range<R>) {
1947 return all(_MSTL forward<R>(range));
1948 } else {
1949 return common_view{all(_MSTL forward<R>(range))};
1950 }
1951 }
1952};
1953
1954struct common_adaptor {
1955 constexpr auto operator ()() const {
1956 return common_adaptor_closure{};
1957 }
1958
1959 template <Range R>
1960 constexpr auto operator ()(R&& range) const {
1961 if constexpr (common_range<R>) {
1962 return all(_MSTL forward<R>(range));
1963 } else {
1964 return common_view{all(_MSTL forward<R>(range))};
1965 }
1966 }
1967};
1968
1969MSTL_INLINE17 constexpr common_adaptor common;
1970
1971
1972struct counted_adaptor {
1973 template <typename Iter, typename N> requires is_integral_v<N>
1974 constexpr auto operator ()(Iter iter, N count) const {
1975 return counted_view{iter, static_cast<iter_difference_t<Iter>>(count)};
1976 }
1977};
1978
1979MSTL_INLINE17 constexpr counted_adaptor counted;
1980
1981
1982template <typename V2>
1983struct concat_adaptor_closure : range_adaptor_closure<concat_adaptor_closure<V2>> {
1984 using view_type = decltype(all(_MSTL declval<V2>()));
1985 view_type view_;
1986
1987 constexpr explicit concat_adaptor_closure(V2&& v2)
1988 : view_(all(_MSTL forward<V2>(v2))) {}
1989
1990 template <typename V>
1991 requires Range<V>
1992 constexpr auto operator ()(V&& v) const {
1993 return concat_view{ all(_MSTL forward<V>(v)), view_ };
1994 }
1995};
1996
1997struct concat_adaptor {
1998 template <typename V2>
1999 constexpr auto operator ()(V2&& v2) const {
2000 return concat_adaptor_closure<V2>{_MSTL forward<V2>(v2)};
2001 }
2002
2003 template <typename V1, typename V2>
2004 constexpr auto operator ()(V1&& v1, V2&& v2) const {
2005 return concat_view{ all(_MSTL forward<V1>(v1)), all(_MSTL forward<V2>(v2)) };
2006 }
2007};
2008
2009MSTL_INLINE17 constexpr concat_adaptor concat;
2010
2011
2012template <typename T>
2013struct split_adaptor_closure : range_adaptor_closure<split_adaptor_closure<T>> {
2014 T delim_;
2015
2016 constexpr explicit split_adaptor_closure(T d) : delim_(d) {}
2017
2018 template <Range R>
2019 constexpr auto operator ()(R&& range) const {
2020 return split_view{all(_MSTL forward<R>(range)), delim_};
2021 }
2022};
2023
2024struct split_adaptor {
2025 template <typename T>
2026 constexpr auto operator ()(T delim) const {
2027 return split_adaptor_closure<T>{delim};
2028 }
2029
2030 template <Range R, typename T>
2031 constexpr auto operator ()(R&& range, T delim) const {
2032 return split_view{all(_MSTL forward<R>(range)), delim};
2033 }
2034};
2035
2036MSTL_INLINE17 constexpr split_adaptor split;
2037
2038
2039struct slice_adaptor_closure : range_adaptor_closure<slice_adaptor_closure> {
2040 ptrdiff_t offset_, length_;
2041
2042 constexpr explicit slice_adaptor_closure(ptrdiff_t o, ptrdiff_t l)
2043 : offset_(o), length_(l) {}
2044
2045 template <Range R>
2046 constexpr auto operator ()(R&& range) const {
2047 return slice_view{all(_MSTL forward<R>(range)), offset_, length_};
2048 }
2049};
2050
2051struct slice_adaptor {
2052 constexpr auto operator ()(ptrdiff_t offset, ptrdiff_t length) const {
2053 return slice_adaptor_closure{offset, length};
2054 }
2055
2056 template <Range R>
2057 constexpr auto operator ()(R&& range, ptrdiff_t offset, ptrdiff_t length) const {
2058 return slice_view{all(_MSTL forward<R>(range)), offset, length};
2059 }
2060};
2061
2062MSTL_INLINE17 constexpr slice_adaptor slice;
2063
2065
2067#endif // MSTL_STANDARD_20__
2069#endif // MSTL_CORE_ITERATOR_RANGES_HPP__
反向迭代器模板类
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
迭代器类别
MSTL概念和类型约束
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)
统计范围内等于指定值的元素数量
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
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
小于比较运算符
int64_t ptrdiff_t
指针差类型
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的便捷别名