1#ifndef NEFORCE_CORE_ITERATOR_RANGES_HPP__
2#define NEFORCE_CORE_ITERATOR_RANGES_HPP__
4NEFORCE_BEGIN_NAMESPACE__
5#ifdef NEFORCE_STANDARD_20
10concept Range =
requires(R& r) {
23template <Range R,
typename Adaptor>
24constexpr auto operator|(R&& range, Adaptor&& adaptor) {
30 requires(!View<remove_cvref_t<R>>)
31class ref_view : public
view_base<ref_view<R>> {
35 constexpr explicit ref_view(R& range) noexcept :
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(); }
43 constexpr R& base()
const {
return *ptr_; }
51class owning_view :
public view_base<owning_view<R>> {
56 owning_view() =
default;
59 obj_(_NEFORCE
move(range)) {}
61 owning_view(owning_view&&) =
delete;
62 owning_view& operator=(owning_view&&) =
delete;
64 owning_view(
const owning_view&) =
delete;
65 owning_view& operator=(
const owning_view&) =
delete;
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(); }
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_); }
79struct all_view_factory {
81 requires View<remove_cvref_t<V>>
82 constexpr auto operator()(V&& v)
const noexcept {
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};
93 requires Range<R> && (!View<remove_cvref_t<R>>)
95 return owning_view<remove_cvref_t<R>>{_NEFORCE
move(r)};
99NEFORCE_INLINE17
constexpr all_view_factory all{};
102template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
103class filter_iterator {
107 bidirectional_iterator_tag, forward_iterator_tag>;
115 BaseIter base_begin_{};
118 const Pred* pred_ =
nullptr;
120 constexpr void satisfy_predicate_forward() {
121 while (current_ != end_ && !(*pred_)(*current_)) {
126 constexpr void satisfy_predicate_backward() {
127 while (current_ != base_begin_) {
128 if ((*pred_)(*current_)) {
136 constexpr filter_iterator() =
default;
138 constexpr filter_iterator(BaseIter base_begin, BaseIter current, Sentinel
end,
const Pred* pred) :
139 base_begin_(base_begin),
143 satisfy_predicate_forward();
146 constexpr reference operator*()
const {
return *current_; }
147 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
149 constexpr filter_iterator& operator++() {
151 satisfy_predicate_forward();
155 constexpr filter_iterator operator++(
int) {
161 constexpr filter_iterator& operator--()
162 requires bidirectional_iterator<BaseIter>
166 }
while (current_ != base_begin_ && !(*pred_)(*current_));
170 constexpr filter_iterator operator--(
int)
171 requires bidirectional_iterator<BaseIter>
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); }
181 template <
typename S>
182 requires(!same_as<S, filter_iterator>)
183 constexpr bool operator==(
const S& s)
const {
184 return current_ == s;
187 template <
typename S>
188 requires(!same_as<S, filter_iterator>)
189 constexpr bool operator!=(
const S& s)
const {
190 return current_ != s;
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; }
196 constexpr bool operator<(
const filter_iterator& other)
const
197 requires totally_ordered<BaseIter>
199 return current_ < other.current_;
201 constexpr bool operator>(
const filter_iterator& other)
const
202 requires totally_ordered<BaseIter>
204 return current_ > other.current_;
206 constexpr bool operator<=(
const filter_iterator& other)
const
207 requires totally_ordered<BaseIter>
209 return current_ <= other.current_;
211 constexpr bool operator>=(
const filter_iterator& other)
const
212 requires totally_ordered<BaseIter>
214 return current_ >= other.current_;
217 constexpr bool operator<(Sentinel s)
const
218 requires totally_ordered_with<BaseIter, Sentinel>
222 constexpr bool operator>(Sentinel s)
const
223 requires totally_ordered_with<BaseIter, Sentinel>
227 constexpr bool operator<=(Sentinel s)
const
228 requires totally_ordered_with<BaseIter, Sentinel>
230 return current_ <= s;
232 constexpr bool operator>=(Sentinel s)
const
233 requires totally_ordered_with<BaseIter, Sentinel>
235 return current_ >= s;
238 friend constexpr bool operator<(Sentinel s,
const filter_iterator& it)
239 requires totally_ordered_with<BaseIter, Sentinel>
241 return s < it.current_;
243 friend constexpr bool operator>(Sentinel s,
const filter_iterator& it)
244 requires totally_ordered_with<BaseIter, Sentinel>
246 return s > it.current_;
248 friend constexpr bool operator<=(Sentinel s,
const filter_iterator& it)
249 requires totally_ordered_with<BaseIter, Sentinel>
251 return s <= it.current_;
253 friend constexpr bool operator>=(Sentinel s,
const filter_iterator& it)
254 requires totally_ordered_with<BaseIter, Sentinel>
256 return s >= it.current_;
259 constexpr difference_type operator-(
const filter_iterator& other)
const noexcept
260 requires sized_sentinel_for<BaseIter, BaseIter>
262 return static_cast<difference_type
>(current_ - other.current_);
265 constexpr BaseIter base()
const {
return current_; }
269template <View V,
typename Pred>
270class filter_view :
public view_base<filter_view<V, Pred>> {
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;
286 constexpr filter_view() =
default;
288 constexpr filter_view(
const filter_view& other)
289 requires copy_constructible<V> && copy_constructible<Pred>
292 pred_(other.pred_) {}
294 constexpr filter_view& operator=(
const filter_view& other)
295 requires copyable<V> && copyable<Pred>
305 constexpr filter_view(filter_view&&) =
default;
311 base_ = _NEFORCE
move(other.base_);
312 pred_ = _NEFORCE
move(other.pred_);
316 constexpr filter_view(V base, Pred pred) :
317 base_(_NEFORCE
move(base)),
318 pred_(_NEFORCE
move(pred)) {}
320 constexpr iterator
begin() {
return iterator(base_.begin(), base_.begin(), base_.end(), &pred_); }
321 constexpr sentinel
end() {
return base_.end(); }
323 constexpr const_iterator
begin() const
324 requires Range<const V>
326 return const_iterator(base_.begin(), base_.begin(), base_.end(), &pred_);
328 constexpr const_sentinel
end() const
329 requires Range<const V>
334 constexpr iterator
end()
335 requires common_range<V>
337 return iterator(base_.begin(), base_.end(), base_.end(), &pred_);
339 constexpr const_iterator
end() const
340 requires common_range<const V>
342 return const_iterator(base_.begin(), base_.end(), base_.end(), &pred_);
345 constexpr V base() const&
346 requires copy_constructible<V>
350 constexpr V base() && {
return _NEFORCE
move(base_); }
354template <input_iterator BaseIter,
typename Func>
355class transform_iterator {
357 using iterator_category = forward_iterator_tag;
362 using pointer = void;
364 constexpr transform_iterator() =
default;
366 constexpr transform_iterator(BaseIter current,
const Func* func) :
370 constexpr reference operator*()
const {
return (*func_)(*current_); }
372 constexpr transform_iterator& operator++() {
377 constexpr transform_iterator operator++(
int) {
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); }
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;
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);
397 template <
typename Sentinel>
398 friend constexpr bool operator==(
const Sentinel& s,
const transform_iterator& it) {
399 return s == it.current_;
401 template <
typename Sentinel>
402 friend constexpr bool operator!=(
const Sentinel& s,
const transform_iterator& it) {
403 return !(s == it.current_);
408 const Func* func_ =
nullptr;
412template <View V,
typename Func>
413class transform_view :
public view_base<transform_view<V, Func>> {
417 using iterator = transform_iterator<base_iterator, Func>;
418 using const_iterator = transform_iterator<const_base_iterator, Func>;
427 constexpr transform_view() =
default;
429 constexpr transform_view(V base, Func func) :
430 base_(_NEFORCE
move(base)),
431 func_(_NEFORCE
move(func)) {}
433 constexpr transform_view(transform_view&&)
434 requires movable<V> && movable<Func>
437 constexpr transform_view& operator=(transform_view&& other) noexcept
438 requires movable<V> && movable<Func>
440 base_ = _NEFORCE
move(other.base_);
441 func_ = _NEFORCE
move(other.func_);
445 constexpr transform_view(
const transform_view& other)
446 requires copy_constructible<V> && copy_constructible<Func>
449 func_(other.func_) {}
451 constexpr transform_view& operator=(
const transform_view& other)
452 requires copyable<V> && copyable<Func>
462 constexpr iterator
begin() {
return iterator(base_.begin(), &func_); }
464 constexpr sentinel
end() {
return base_.end(); }
466 constexpr const_iterator
begin() const
467 requires Range<const V>
469 return const_iterator(base_.begin(), &func_);
472 constexpr const_sentinel
end() const
473 requires Range<const V>
478 constexpr V base() const&
479 requires copy_constructible<V>
483 constexpr V base() && {
return _NEFORCE
move(base_); }
487template <input_iterator BaseIter>
490 using iterator_category = forward_iterator_tag;
496 constexpr take_iterator() =
default;
498 constexpr take_iterator(BaseIter current, difference_type
count) :
502 constexpr reference operator*()
const {
return *current_; }
504 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
506 constexpr take_iterator& operator++() {
512 constexpr take_iterator operator++(
int) {
518 constexpr bool operator==(
const take_iterator& other)
const {
519 return current_ == other.current_ || count_ == other.count_;
522 constexpr bool operator!=(
const take_iterator& other)
const {
return !(*
this == other); }
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;
530 template <
typename S>
531 requires(!same_as<S, take_iterator>)
532 constexpr bool operator!=(
const S& s)
const {
533 return !(*
this == s);
538 difference_type count_ = 0;
543class take_view :
public view_base<take_view<V>> {
546 using iterator = take_iterator<base_iterator>;
548 using const_iterator = take_iterator<const_base_iterator>;
553 difference_type count_ = 0;
556 constexpr take_view() =
default;
558 constexpr take_view(V base, difference_type
count) :
559 base_(_NEFORCE
move(base)),
562 constexpr take_view(take_view&&)
565 constexpr take_view& operator=(take_view&&)
569 constexpr take_view(const take_view&)
570 requires copy_constructible<V>
572 constexpr take_view& operator=(const take_view&)
576 constexpr iterator begin() {
return iterator(base_.begin(), count_); }
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);
584 constexpr const_iterator
begin() const
585 requires Range<const V>
587 return const_iterator(base_.begin(), count_);
590 constexpr const_iterator
end() const
591 requires Range<const V>
593 auto it = base_.begin();
594 _NEFORCE
advance(it, _NEFORCE
min(count_, _NEFORCE
distance(base_.begin(), base_.end())));
595 return const_iterator(it, 0);
598 constexpr V base() const&
599 requires copy_constructible<V>
603 constexpr V base() && {
return _NEFORCE
move(base_); }
610template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
611class take_while_iterator {
613 using iterator_category = forward_iterator_tag;
619 constexpr take_while_iterator() =
default;
621 constexpr take_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred) :
625 done_(current ==
end || !(*pred)(*current)) {}
627 constexpr reference operator*()
const {
return *current_; }
629 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
631 constexpr take_while_iterator& operator++() {
633 if (current_ == end_ || !(*pred_)(*current_)) {
639 constexpr take_while_iterator operator++(
int) {
645 constexpr bool operator==(
const take_while_iterator& other)
const {
646 return current_ == other.current_ && done_ == other.done_;
648 constexpr bool operator!=(
const take_while_iterator& other)
const {
return !(*
this == other); }
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;
655 template <
typename S>
656 requires(!same_as<S, take_while_iterator>)
657 constexpr bool operator!=(
const S& s)
const {
658 return !(*
this == s);
661 template <
typename S>
662 friend constexpr bool operator==(
const S& s,
const take_while_iterator& t) {
663 return t.done_ || t.current_ == s;
666 template <
typename S>
667 friend constexpr bool operator!=(
const S& s,
const take_while_iterator& t) {
674 const Pred* pred_ =
nullptr;
678template <View V,
typename Pred>
679class take_while_view :
public view_base<take_while_view<V, Pred>> {
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;
695 constexpr take_while_view() =
default;
697 constexpr take_while_view(V base, Pred pred) :
698 base_(_NEFORCE
move(base)),
699 pred_(_NEFORCE
move(pred)) {}
701 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end(), &pred_); }
702 constexpr sentinel
end() {
return base_.end(); }
704 constexpr const_iterator
begin() const
705 requires Range<const V>
707 return const_iterator(base_.begin(), base_.end(), &pred_);
709 constexpr const_sentinel
end() const
710 requires Range<const V>
715 constexpr V base() const&
716 requires copy_constructible<V>
720 constexpr V base() && {
return _NEFORCE
move(base_); }
723template <
typename V,
typename Pred>
724take_while_view(V&&, Pred) -> take_while_view<V, Pred>;
728class drop_view :
public view_base<drop_view<V>> {
738 difference_type count_ = 0;
741 constexpr drop_view() =
default;
743 constexpr drop_view(V base, difference_type
count) :
744 base_(_NEFORCE
move(base)),
747 constexpr drop_view(drop_view&&)
750 constexpr drop_view& operator=(drop_view&&)
754 constexpr drop_view(const drop_view&)
755 requires copy_constructible<V>
757 constexpr drop_view& operator=(const drop_view&)
761 constexpr iterator begin() {
762 auto it = base_.begin();
763 auto end = base_.end();
765 while (n > 0 && it != end) {
772 constexpr sentinel
end() {
return base_.end(); }
774 constexpr const_iterator
begin() const
775 requires Range<const V>
777 auto it = base_.begin();
778 auto end = base_.end();
780 while (n > 0 && it != end) {
787 constexpr const_sentinel
end() const
788 requires Range<const V>
793 constexpr V base() const&
794 requires copy_constructible<V>
798 constexpr V base() && {
return _NEFORCE
move(base_); }
805template <input_iterator BaseIter, sentinel_for<BaseIter> Sentinel,
typename Pred>
806class drop_while_iterator {
808 using iterator_category = forward_iterator_tag;
814 constexpr drop_while_iterator() =
default;
816 constexpr drop_while_iterator(BaseIter current, Sentinel
end,
const Pred* pred) :
821 satisfy_predicate_forward();
824 constexpr reference operator*()
const {
return *current_; }
826 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
828 constexpr drop_while_iterator& operator++() {
833 constexpr drop_while_iterator operator++(
int) {
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); }
842 template <
typename S>
843 requires(!same_as<S, drop_while_iterator>)
844 constexpr bool operator==(
const S& s)
const {
845 return current_ == s;
847 template <
typename S>
848 requires(!same_as<S, drop_while_iterator>)
849 constexpr bool operator!=(
const S& s)
const {
850 return !(*
this == s);
853 template <
typename S>
854 friend constexpr bool operator==(
const S& s,
const drop_while_iterator& t) {
855 return t.current_ == s;
858 template <
typename S>
859 friend constexpr bool operator!=(
const S& s,
const drop_while_iterator& t) {
860 return t.current_ != s;
864 constexpr void satisfy_predicate_forward() {
869 while (current_ != end_ && (*pred_)(*current_)) {
876 const Pred* pred_ =
nullptr;
877 bool started_ =
false;
880template <View V,
typename Pred>
881class drop_while_view :
public view_base<drop_while_view<V, Pred>> {
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;
897 constexpr drop_while_view() =
default;
899 constexpr drop_while_view(V base, Pred pred) :
900 base_(_NEFORCE
move(base)),
901 pred_(_NEFORCE
move(pred)) {}
903 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end(), &pred_); }
904 constexpr sentinel
end() {
return base_.end(); }
906 constexpr const_iterator
begin() const
907 requires Range<const V>
909 return const_iterator(base_.begin(), base_.end(), &pred_);
911 constexpr const_sentinel
end() const
912 requires Range<const V>
917 constexpr V base() const&
918 requires copy_constructible<V>
922 constexpr V base() && {
return _NEFORCE
move(base_); }
925template <
typename V,
typename Pred>
926drop_while_view(V&&, Pred) -> drop_while_view<V, Pred>;
929template <b
idirectional_iterator Iter>
930class reverse_iterator {
974 constexpr bool operator==(
const reverse_iterator& other)
const {
return current_ == other.current_; }
976 constexpr bool operator!=(
const reverse_iterator& other)
const {
return !(*
this == other); }
984class reverse_view : public
view_base<reverse_view<V>> {
995 constexpr reverse_view() =
default;
996 constexpr explicit reverse_view(V base) :
997 base_(_NEFORCE
move(base)) {}
999 constexpr reverse_view(reverse_view&&)
1002 constexpr reverse_view& operator=(reverse_view&&)
1006 constexpr reverse_view(const reverse_view&)
1009 constexpr reverse_view& operator=(const reverse_view&)
1013 constexpr iterator
begin() {
return iterator(base_.end()); }
1014 constexpr iterator
end() {
return iterator(base_.begin()); }
1017 requires Range<const V>
1022 requires Range<const V>
1027 constexpr V base() const&
1032 constexpr V base() && {
return _NEFORCE
move(base_); }
1035template <
typename V>
1036reverse_view(V&&) -> reverse_view<V>;
1039template <
typename T>
1040class iota_iterator {
1042 using iterator_category = forward_iterator_tag;
1043 using value_type = T;
1045 using pointer =
const T*;
1046 using reference = T;
1048 constexpr iota_iterator() =
default;
1049 constexpr explicit iota_iterator(T value) :
1052 constexpr reference operator*()
const {
return value_; }
1053 constexpr pointer operator->()
const {
return &value_; }
1055 constexpr iota_iterator& operator++() {
1060 constexpr iota_iterator operator++(
int) {
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_; }
1069 constexpr bool operator<(
const iota_iterator& other)
const
1070 requires totally_ordered<T>
1072 return value_ < other.value_;
1079template <
typename T>
1080class iota_view :
public view_base<iota_view<T>> {
1082 using iterator = iota_iterator<T>;
1084 constexpr iota_view() =
default;
1085 constexpr explicit iota_view(T start) :
1087 constexpr iota_view(T start, T bound) :
1092 constexpr iterator
begin()
const {
return iterator(start_); }
1093 constexpr iterator
end()
const {
return has_bound_ ? iterator(bound_) : iterator(start_); }
1098 bool has_bound_ =
false;
1101template <
typename T>
1102iota_view(T) -> iota_view<T>;
1104template <
typename T>
1105iota_view(T, T) -> iota_view<T>;
1108template <
typename T>
1109class repeat_iterator {
1111 using iterator_category = forward_iterator_tag;
1112 using value_type = T;
1114 using pointer =
const T*;
1115 using reference =
const T&;
1117 constexpr repeat_iterator() =
default;
1118 constexpr repeat_iterator(
const T* value, difference_type
count) :
1122 constexpr reference operator*()
const {
return *value_; }
1123 constexpr pointer operator->()
const {
return value_; }
1125 constexpr repeat_iterator& operator++() {
1132 constexpr repeat_iterator operator++(
int) {
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_; }
1142 const T* value_ =
nullptr;
1143 difference_type count_ = 0;
1146template <
typename T>
1147class repeat_view :
public view_base<repeat_view<T>> {
1149 using iterator = repeat_iterator<T>;
1152 constexpr repeat_view() =
default;
1154 constexpr explicit repeat_view(T value) :
1155 value_(_NEFORCE
move(value)) {}
1157 constexpr repeat_view(T value,
const difference_type
count) :
1158 value_(_NEFORCE
move(value)),
1162 constexpr iterator
begin()
const {
return has_bound_ ? iterator(&value_, count_) : iterator(&value_, -1); }
1163 constexpr iterator
end()
const {
return iterator(&value_, 0); }
1167 difference_type count_ = 0;
1168 bool has_bound_ =
false;
1171template <
typename T>
1172repeat_view(T) -> repeat_view<T>;
1174template <
typename T,
typename N>
1175repeat_view(T, N) -> repeat_view<T>;
1178template <
typename OuterIter,
typename OuterSentinel>
1179class join_iterator {
1187 using iterator_category = forward_iterator_tag;
1193 constexpr join_iterator() =
default;
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();
1205 constexpr reference operator*()
const {
return *inner_current_; }
1206 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*inner_current_); }
1208 constexpr join_iterator& operator++() {
1214 constexpr join_iterator operator++(
int) {
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_);
1224 constexpr bool operator!=(
const join_iterator& other)
const {
return !(*
this == other); }
1227 constexpr void satisfy() {
1228 while (outer_current_ != outer_end_ && inner_current_ == inner_end_) {
1230 if (outer_current_ != outer_end_) {
1231 inner_current_ = (*outer_current_).begin();
1232 inner_end_ = (*outer_current_).end();
1237 OuterIter outer_current_{};
1238 OuterSentinel outer_end_{};
1239 inner_iterator inner_current_{};
1240 inner_sentinel inner_end_{};
1244 requires Range<iter_reference_t<decltype(_NEFORCE declval<V>().begin())>>
1245class join_view : public
view_base<join_view<V>> {
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>;
1251 constexpr join_view() =
default;
1252 constexpr explicit join_view(V base) :
1253 base_(_NEFORCE
move(base)) {}
1255 constexpr iterator
begin() {
return iterator(base_.begin(), base_.end()); }
1256 constexpr iterator
end() {
return iterator(base_.end(), base_.end()); }
1258 constexpr iterator
begin() const
1259 requires Range<const V>
1261 return iterator(base_.begin(), base_.end());
1263 constexpr iterator
end() const
1264 requires Range<const V>
1266 return iterator(base_.end(), base_.end());
1269 constexpr V base() const&
1274 constexpr V base() && {
return _NEFORCE
move(base_); }
1280template <
typename V>
1281join_view(V&&) -> join_view<V>;
1284template <
size_t N,
typename BaseIter>
1285class element_iterator {
1289 using iterator_category = forward_iterator_tag;
1293 using reference = element_type;
1295 constexpr element_iterator() =
default;
1296 constexpr explicit element_iterator(BaseIter current) :
1297 current_(current) {}
1299 constexpr reference operator*()
const {
return _NEFORCE
get<N>(*current_); }
1301 constexpr pointer operator->()
const {
return _NEFORCE
addressof(_NEFORCE
get<N>(*current_)); }
1303 constexpr element_iterator& operator++() {
1308 constexpr element_iterator operator++(
int) {
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_; }
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;
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;
1329 BaseIter current_{};
1332template <
size_t N, View V>
1333class element_view :
public view_base<element_view<N, V>> {
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;
1340 constexpr element_view() =
default;
1341 constexpr explicit element_view(V base) :
1342 base_(_NEFORCE
move(base)) {}
1344 constexpr iterator
begin() {
return iterator(base_.begin()); }
1345 constexpr sentinel
end() {
return base_.end(); }
1347 constexpr iterator
begin() const
1348 requires Range<const V>
1350 return iterator(base_.begin());
1352 constexpr sentinel
end() const
1353 requires Range<const V>
1358 constexpr V base() const&
1359 requires copy_constructible<V>
1363 constexpr V base() && {
return _NEFORCE
move(base_); }
1371 requires(!common_range<V>)
1372class common_view : public
view_base<common_view<V>> {
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;
1379 constexpr common_view() =
default;
1380 constexpr explicit common_view(V base) :
1381 base_(_NEFORCE
move(base)) {}
1383 constexpr iterator
begin() {
return base_.begin(); }
1385 constexpr iterator
end() {
1386 auto it = base_.begin();
1387 auto sen = base_.end();
1394 constexpr iterator
begin() const
1395 requires Range<const V>
1397 return base_.begin();
1400 constexpr iterator
end() const
1401 requires Range<const V>
1403 auto it = base_.begin();
1404 auto sen = base_.end();
1411 constexpr V base() const&
1416 constexpr V base() && {
return _NEFORCE
move(base_); }
1422template <
typename V>
1423common_view(V&&) -> common_view<V>;
1426template <
typename Iter>
1427class counted_iterator {
1429 using iterator_category = forward_iterator_tag;
1435 constexpr counted_iterator() =
default;
1436 constexpr counted_iterator(Iter current, difference_type count) :
1440 constexpr reference operator*()
const {
return *current_; }
1441 constexpr pointer operator->()
const {
return _NEFORCE
addressof(*current_); }
1443 constexpr counted_iterator& operator++() {
1449 constexpr counted_iterator operator++(
int) {
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_; }
1458 constexpr Iter base()
const {
return current_; }
1459 constexpr difference_type count()
const {
return count_; }
1463 difference_type count_ = 0;
1466template <
typename Iter>
1467class counted_view :
public view_base<counted_view<Iter>> {
1469 using iterator = counted_iterator<Iter>;
1472 constexpr counted_view() =
default;
1473 constexpr counted_view(Iter iter, difference_type
count) :
1477 constexpr iterator
begin()
const {
return iterator(iter_, count_); }
1478 constexpr iterator
end()
const {
return iterator(iter_, 0); }
1482 difference_type count_ = 0;
1485template <
typename Iter,
typename N>
1486counted_view(Iter, N) -> counted_view<Iter>;
1489template <
bool IsConst, View V1, View V2>
1490struct concat_iterator {
1498 using iterator_category = forward_iterator_tag;
1501 using pointer = void;
1504 iterator1 current1_;
1506 iterator2 current2_;
1508 bool in_first_ =
true;
1510 concat_iterator() =
default;
1512 concat_iterator(iterator1 first1, iterator1 last1, iterator2 first2, iterator2 last2) :
1517 if (current1_ == end1_) {
1522 reference operator*()
const {
return in_first_ ? *current1_ : *current2_; }
1524 concat_iterator& operator++() {
1527 if (current1_ == end1_) {
1536 concat_iterator operator++(
int) {
1542 bool operator==(
const concat_iterator& other)
const {
1543 if (in_first_ != other.in_first_) {
1547 return current1_ == other.current1_;
1549 return current2_ == other.current2_;
1552 bool operator!=(
const concat_iterator& other)
const {
return !(*
this == other); }
1555template <View V1, View V2>
1556class concat_view :
public view_base<concat_view<V1, V2>> {
1560 using iterator = concat_iterator<false, V1, V2>;
1561 using const_iterator = concat_iterator<true, V1, V2>;
1564 concat_view() =
default;
1565 concat_view(V1 v1, V2 v2) :
1566 v1_(_NEFORCE
move(v1)),
1567 v2_(_NEFORCE
move(v2)) {}
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()); }
1576template <
typename Iterator>
1577class subrange_view :
public view_base<subrange_view<Iterator>> {
1582 subrange_view() =
default;
1583 subrange_view(Iterator first, Iterator last) :
1587 Iterator
begin()
const {
return first_; }
1588 Iterator
end()
const {
return last_; }
1592template <
bool IsConst, View V,
typename T>
1593struct split_iterator {
1607 using iterator_category = forward_iterator_tag;
1608 using value_type = subrange_view<iterator>;
1610 using pointer = void;
1611 using reference = value_type;
1613 split_iterator() =
default;
1614 split_iterator(iterator cur, sentinel
end, T delim) :
1617 delimiter_(delim) {}
1619 value_type operator*()
const {
1620 iterator start = current_;
1621 iterator iter = current_;
1622 while (iter != end_ && !(*iter == delimiter_)) {
1625 return value_type{start, iter};
1628 split_iterator& operator++() {
1629 if (current_ == end_) {
1632 while (current_ != end_ && !(*current_ == delimiter_)) {
1635 if (current_ != end_) {
1641 split_iterator operator++(
int) {
1647 bool operator==(
const split_iterator& other)
const {
return current_ == other.current_; }
1648 bool operator!=(
const split_iterator& other)
const {
return !(*
this == other); }
1651template <View V,
typename T>
1652class split_view :
public view_base<split_view<V, T>> {
1657 using iterator = split_iterator<false, V, T>;
1658 using const_iterator = split_iterator<true, V, T>;
1660 split_view() =
default;
1662 split_view(V base, T delimiter) :
1663 base_(_NEFORCE
move(base)),
1664 delimiter_(delimiter) {}
1666 iterator
begin() {
return iterator{base_.begin(), base_.end(), delimiter_}; }
1667 iterator
end() {
return iterator{base_.end(), base_.end(), delimiter_}; }
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_}; }
1675class slice_view :
public view_base<slice_view<V>> {
1682 difference_type offset_;
1683 difference_type length_;
1689 mutable cache_t cache_;
1690 mutable bool has_value_ =
false;
1692 void ensure_cache()
const {
1700 for (
auto i = 0; i < offset_ && b != e; ++i, ++b)
1704 for (
auto i = 0; i < length_ && b != e; ++i, ++b)
1708 cache_ = cache_t{begin_it, end_it};
1713 slice_view() =
default;
1716 base_(_NEFORCE
move(base)),
1722 return cache_.begin_;
1730 iterator
begin() const
1731 requires Range<const V>
1734 return cache_.begin_;
1737 iterator
end() const
1738 requires Range<const V>
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) {
1757NEFORCE_BEGIN_RANGES_VIEWS__
1761 constexpr auto operator()(R&& range)
const {
1766NEFORCE_INLINE17
constexpr all_adaptor all;
1769template <
typename Pred>
1770struct filter_adaptor_closure : range_adaptor_closure<filter_adaptor_closure<Pred>> {
1773 constexpr explicit filter_adaptor_closure(Pred p) :
1774 pred(_NEFORCE
move(p)) {}
1777 constexpr auto operator()(R&& range)
const {
1778 return filter_view{all(_NEFORCE
forward<R>(range)), pred};
1782struct filter_adaptor {
1783 template <
typename Pred>
1784 constexpr auto operator()(Pred pred)
const {
1785 return filter_adaptor_closure<Pred>{_NEFORCE
move(pred)};
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)};
1794NEFORCE_INLINE17
constexpr filter_adaptor filter;
1797template <
typename Func>
1798struct transform_adaptor_closure : range_adaptor_closure<transform_adaptor_closure<Func>> {
1801 constexpr explicit transform_adaptor_closure(Func f) :
1802 func(_NEFORCE
move(f)) {}
1805 constexpr auto operator()(R&& range)
const {
1806 return transform_view{all(_NEFORCE
forward<R>(range)), func};
1810struct transform_adaptor {
1811 template <
typename Func>
1812 constexpr auto operator()(Func func)
const {
1813 return transform_adaptor_closure<Func>{_NEFORCE
move(func)};
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)};
1822NEFORCE_INLINE17
constexpr transform_adaptor transform;
1825template <
typename DiffType>
1826struct take_adaptor_closure : range_adaptor_closure<take_adaptor_closure<DiffType>> {
1829 constexpr explicit take_adaptor_closure(DiffType n) :
1833 constexpr auto operator()(R&& range)
const {
1834 return take_view{all(_NEFORCE
forward<R>(range)), count};
1838struct take_adaptor {
1839 template <
typename N>
1841 constexpr auto operator()(N
count)
const {
1842 return take_adaptor_closure<N>{
count};
1845 template <Range R,
typename N>
1847 constexpr auto operator()(R&& range, N
count)
const {
1852NEFORCE_INLINE17
constexpr take_adaptor take;
1855template <
typename Pred>
1856struct take_while_adaptor_closure : range_adaptor_closure<take_while_adaptor_closure<Pred>> {
1859 constexpr explicit take_while_adaptor_closure(Pred p) :
1860 pred(_NEFORCE
move(p)) {}
1863 constexpr auto operator()(R&& range)
const {
1864 return take_while_view{all(_NEFORCE
forward<R>(range)), pred};
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)};
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)};
1880NEFORCE_INLINE17
constexpr take_while_adaptor take_while;
1883template <
typename DiffType>
1884struct drop_adaptor_closure : range_adaptor_closure<drop_adaptor_closure<DiffType>> {
1887 constexpr explicit drop_adaptor_closure(DiffType n) :
1891 constexpr auto operator()(R&& range)
const {
1892 return drop_view{all(_NEFORCE
forward<R>(range)), count};
1896struct drop_adaptor {
1897 template <
typename N>
1899 constexpr auto operator()(N
count)
const {
1900 return drop_adaptor_closure<N>{
count};
1903 template <Range R,
typename N>
1905 constexpr auto operator()(R&& range, N
count)
const {
1910NEFORCE_INLINE17
constexpr drop_adaptor drop;
1913template <
typename Pred>
1914struct drop_while_adaptor_closure : range_adaptor_closure<drop_while_adaptor_closure<Pred>> {
1917 constexpr explicit drop_while_adaptor_closure(Pred p) :
1918 pred(_NEFORCE
move(p)) {}
1921 constexpr auto operator()(R&& range)
const {
1922 return drop_while_view{all(_NEFORCE
forward<R>(range)), pred};
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)};
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)};
1938NEFORCE_INLINE17
constexpr drop_while_adaptor drop_while;
1941struct reverse_adaptor_closure : range_adaptor_closure<reverse_adaptor_closure> {
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))};
1949struct reverse_adaptor {
1950 constexpr auto operator()()
const {
return reverse_adaptor_closure{}; }
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))};
1959NEFORCE_INLINE17
constexpr reverse_adaptor reverse;
1962struct iota_adaptor {
1963 template <
typename T>
1964 constexpr auto operator()(T start)
const {
1965 return iota_view<T>{start};
1968 template <
typename T>
1969 constexpr auto operator()(T start, T bound)
const {
1970 return iota_view<T>{start, bound};
1974NEFORCE_INLINE17
constexpr iota_adaptor iota;
1977struct repeat_adaptor {
1978 template <
typename T>
1979 constexpr auto operator()(T value)
const {
1980 return repeat_view<T>{_NEFORCE
move(value)};
1983 template <
typename T,
typename N>
1985 constexpr auto operator()(T value, N
count)
const {
1990NEFORCE_INLINE17
constexpr repeat_adaptor repeat;
1993struct join_adaptor_closure : range_adaptor_closure<join_adaptor_closure> {
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))};
2001struct join_adaptor {
2002 constexpr auto operator()()
const {
return join_adaptor_closure{}; }
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))};
2011NEFORCE_INLINE17
constexpr join_adaptor join;
2015struct elements_adaptor_closure : range_adaptor_closure<elements_adaptor_closure<N>> {
2017 constexpr auto operator()(R&& range)
const {
2018 return element_view<N, decltype(all(_NEFORCE forward<R>(range)))>{all(_NEFORCE
forward<R>(range))};
2023struct elements_adaptor {
2024 constexpr auto operator()()
const {
return elements_adaptor_closure<N>{}; }
2027 constexpr auto operator()(R&& range)
const {
2028 return element_view<N, decltype(all(_NEFORCE forward<R>(range)))>{all(_NEFORCE
forward<R>(range))};
2033NEFORCE_INLINE17
constexpr elements_adaptor<N> elements;
2035NEFORCE_INLINE17
constexpr auto keys = elements<0>;
2036NEFORCE_INLINE17
constexpr auto values = elements<1>;
2039struct common_adaptor_closure : range_adaptor_closure<common_adaptor_closure> {
2041 constexpr auto operator()(R&& range)
const {
2042 if constexpr (common_range<R>) {
2045 return common_view{all(_NEFORCE
forward<R>(range))};
2050struct common_adaptor {
2051 constexpr auto operator()()
const {
return common_adaptor_closure{}; }
2054 constexpr auto operator()(R&& range)
const {
2055 if constexpr (common_range<R>) {
2058 return common_view{all(_NEFORCE
forward<R>(range))};
2063NEFORCE_INLINE17
constexpr common_adaptor common;
2066struct counted_adaptor {
2067 template <
typename Iter,
typename N>
2069 constexpr auto operator()(Iter iter, N
count)
const {
2074NEFORCE_INLINE17
constexpr counted_adaptor counted;
2077template <
typename V2>
2078struct concat_adaptor_closure : range_adaptor_closure<concat_adaptor_closure<V2>> {
2079 using view_type =
decltype(all(_NEFORCE
declval<V2>()));
2082 constexpr explicit concat_adaptor_closure(V2&& v2) :
2083 view_(all(_NEFORCE
forward<V2>(v2))) {}
2085 template <
typename V>
2087 constexpr auto operator()(V&& v)
const {
2088 return concat_view{all(_NEFORCE
forward<V>(v)), view_};
2092struct concat_adaptor {
2093 template <
typename V2>
2094 constexpr auto operator()(V2&& v2)
const {
2095 return concat_adaptor_closure<V2>{_NEFORCE
forward<V2>(v2)};
2098 template <
typename V1,
typename V2>
2099 constexpr auto operator()(V1&& v1, V2&& v2)
const {
2104NEFORCE_INLINE17
constexpr concat_adaptor concat;
2107template <
typename T>
2108struct split_adaptor_closure : range_adaptor_closure<split_adaptor_closure<T>> {
2111 constexpr explicit split_adaptor_closure(T d) :
2115 constexpr auto operator()(R&& range)
const {
2116 return split_view{all(_NEFORCE
forward<R>(range)), delim_};
2120struct split_adaptor {
2121 template <
typename T>
2122 constexpr auto operator()(T delim)
const {
2123 return split_adaptor_closure<T>{delim};
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};
2132NEFORCE_INLINE17
constexpr split_adaptor split;
2135struct slice_adaptor_closure : range_adaptor_closure<slice_adaptor_closure> {
2143 constexpr auto operator()(R&& range)
const {
2144 return slice_view{all(_NEFORCE
forward<R>(range)), offset_, length_};
2148struct slice_adaptor {
2150 return slice_adaptor_closure{offset, length};
2155 return slice_view{all(_NEFORCE
forward<R>(range)), offset, length};
2159NEFORCE_INLINE17
constexpr slice_adaptor slice;
2161NEFORCE_END_RANGES_VIEWS__
2165NEFORCE_END_NAMESPACE__
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)
统计范围内等于指定值的元素数量
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
获取迭代器的差值类型
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迭代器