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