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