NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
basic_string_view.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
2#define NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
3
12
17NEFORCE_BEGIN_NAMESPACE__
18
24
26template <typename CharT, typename Traits = char_traits<CharT>>
27class basic_string_view;
29
30
39template <typename Traits>
40struct basic_string_view_iterator : iiterator<basic_string_view_iterator<Traits>> {
41public:
49
50private:
51 pointer data_ = nullptr;
52 size_t size_ = 0;
53 size_t idx_ = 0;
54
55public:
56 constexpr basic_string_view_iterator() noexcept = default;
57 NEFORCE_CONSTEXPR20 ~basic_string_view_iterator() = default;
58
59 constexpr basic_string_view_iterator(const basic_string_view_iterator&) noexcept = default;
60 constexpr basic_string_view_iterator& operator=(const basic_string_view_iterator&) noexcept = default;
61 constexpr basic_string_view_iterator(basic_string_view_iterator&&) noexcept = default;
62 constexpr basic_string_view_iterator& operator=(basic_string_view_iterator&&) noexcept = default;
63
70 constexpr basic_string_view_iterator(const pointer data, const size_t size, const size_t off) noexcept :
71 data_(data),
72 size_(size),
73 idx_(off) {}
74
79 NEFORCE_NODISCARD constexpr reference dereference() const noexcept {
80 NEFORCE_DEBUG_VERIFY(data_, "Attempting to dereference on a null pointer");
81 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to dereference out of boundary");
82 return data_[idx_];
83 }
84
88 constexpr void increment() noexcept {
89 NEFORCE_DEBUG_VERIFY(data_, "Attempting to increment a null pointer");
90 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to increment out of boundary");
91 ++idx_;
92 }
93
97 constexpr void decrement() noexcept {
98 NEFORCE_DEBUG_VERIFY(data_, "Attempting to decrement a null pointer");
99 NEFORCE_DEBUG_VERIFY(idx_ != 0, "Attempting to decrement out of boundary");
100 --idx_;
101 }
102
107 constexpr void advance(difference_type off) noexcept {
108 NEFORCE_DEBUG_VERIFY(data_ || off == 0, "Attempting to advance a null pointer");
109 NEFORCE_DEBUG_VERIFY((off < 0 ? idx_ >= -off : size_ - idx_ >= off), "Attempting to advance out of boundary");
110 idx_ += off;
111 }
112
118 NEFORCE_NODISCARD constexpr difference_type distance_to(const basic_string_view_iterator& other) const noexcept {
119 NEFORCE_DEBUG_VERIFY(data_ == other.data_ && size_ == other.size_,
120 "Attempting to distance to a different container");
121 return static_cast<difference_type>(idx_ - other.idx_);
122 }
123
129 NEFORCE_NODISCARD constexpr reference operator[](const difference_type n) const noexcept { return *(*this + n); }
130
136 NEFORCE_NODISCARD constexpr bool equal_to(const basic_string_view_iterator& rhs) const noexcept {
137 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to equal to a different container");
138 return idx_ == rhs.idx_;
139 }
140
146 NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view_iterator& rhs) const noexcept {
147 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to less than a different container");
148 return idx_ < rhs.idx_;
149 }
150
155 NEFORCE_NODISCARD constexpr pointer base() const noexcept { return data_ + idx_; }
156};
157
158
169template <typename CharT, typename Traits>
170class basic_string_view : public icommon<basic_string_view<CharT, Traits>> {
172 "char type of basic string view should be same with char traits.");
174 "basic string view only contains non-array trivial standard-layout types.");
175
176public:
177 using value_type = CharT;
178 using pointer = const CharT*;
179 using reference = const CharT&;
180 using const_pointer = const CharT*;
181 using const_reference = const CharT&;
188 using traits_type = Traits;
189
191 static constexpr auto npos = static_cast<size_type>(-1);
192
193private:
194 const_pointer data_ = nullptr;
195 size_type size_ = 0;
196
203 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr size_type clamp_size(const size_type position,
204 const size_type size) const noexcept {
205 return _NEFORCE min(size, size_ - position);
206 }
207
208public:
209 constexpr basic_string_view() noexcept = default;
210 constexpr basic_string_view(const basic_string_view&) noexcept = default;
211 constexpr basic_string_view& operator=(const basic_string_view&) noexcept = default;
212
221 constexpr basic_string_view(const_pointer str) noexcept :
222 data_(str),
223 size_(Traits::length(str)) {}
224
232 constexpr basic_string_view(const_pointer str, const size_type n) noexcept :
233 data_(str),
234 size_(n) {}
235
244 template <typename Iterator, enable_if_t<is_same_v<iter_value_t<Iterator>, value_type>, int> = 0>
245 constexpr basic_string_view(Iterator start, Iterator finish) :
246 data_(&*start),
247 size_(_NEFORCE distance(start, finish)) {}
248
252 NEFORCE_CONSTEXPR20 ~basic_string_view() noexcept = default;
253
258 NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept { return const_iterator(data_, size_, 0); }
259
264 NEFORCE_NODISCARD constexpr const_iterator end() const noexcept { return const_iterator(data_, size_, size_); }
265
270 NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept { return begin(); }
271
276 NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept { return end(); }
277
282 NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
283
288 NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
289
294 NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
295
300 NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept { return rend(); }
301
306 NEFORCE_NODISCARD constexpr size_type size() const noexcept { return size_; }
307
312 NEFORCE_NODISCARD constexpr size_type max_size() const noexcept {
313 return (npos - sizeof(size_type) - sizeof(void*)) / sizeof(value_type) / 4;
314 }
315
320 NEFORCE_NODISCARD constexpr size_type length() const noexcept { return size_; }
321
326 NEFORCE_NODISCARD constexpr bool empty() const noexcept { return size_ == 0; }
327
335 NEFORCE_NODISCARD constexpr const_pointer data() const noexcept { return data_; }
336
341 NEFORCE_NODISCARD constexpr const_reference front() const noexcept {
342 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call front on empty string_view");
343 return data_[0];
344 }
345
350 NEFORCE_NODISCARD constexpr const_reference back() const noexcept {
351 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call back on empty string_view");
352 return data_[size_ - 1];
353 }
354
360 NEFORCE_NODISCARD constexpr const_reference operator[](const size_type n) const noexcept {
361 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
362 return data_[n];
363 }
364
370 NEFORCE_NODISCARD constexpr const_reference at(const size_type n) const {
371 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
372 return data_[n];
373 }
374
381 constexpr void remove_prefix(const size_type n) noexcept {
382 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove prefix longer than total size");
383 data_ += n;
384 size_ -= n;
385 }
386
393 constexpr void remove_suffix(const size_type n) noexcept {
394 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove suffix longer than total size");
395 size_ -= n;
396 }
397
405 constexpr size_type copy(CharT* const str, size_type count, const size_type off = 0) const {
406 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
407 count = clamp_size(off, count);
408 Traits::copy(str, data_ + off, count);
409 return count;
410 }
411
418 NEFORCE_NODISCARD constexpr basic_string_view substr(const size_type off = 0, const size_type count = npos) const {
419 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
420 const size_type clamp = clamp_size(off, count);
421 return basic_string_view(data_ + off, clamp);
422 }
423
429 NEFORCE_NODISCARD constexpr basic_string_view head(const size_type count = npos) const { return substr(0, count); }
430
436 NEFORCE_NODISCARD constexpr basic_string_view tail(const size_type off = 0) const { return substr(off); }
437
444 NEFORCE_NODISCARD constexpr basic_string_view view(const size_type off, const size_type count = npos) const {
445 return substr(off, count);
446 }
447
453 NEFORCE_NODISCARD constexpr int compare(const basic_string_view view) const noexcept {
454 return (char_traits_compare<Traits>) (data_, size_, view.data_, view.size_);
455 }
456
464 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n,
465 const basic_string_view view) const {
466 return substr(off, n).compare(view);
467 }
468
478 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const basic_string_view view,
479 const size_type roff, const size_type count) const {
480 return substr(off, n).compare(view.substr(roff, count));
481 }
482
488 NEFORCE_NODISCARD constexpr int compare(const CharT* const str) const noexcept {
489 return compare(basic_string_view(str));
490 }
491
499 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str) const {
500 return substr(off, n).compare(basic_string_view(str));
501 }
502
511 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str,
512 const size_type count) const {
513 return substr(off, n).compare(basic_string_view(str, count));
514 }
515
521 NEFORCE_NODISCARD constexpr int compare_ignore_case(const basic_string_view view) const noexcept {
522 const size_type min_len = _NEFORCE min(size_, view.size_);
523 for (size_type i = 0; i < min_len; ++i) {
524 const auto lc = _NEFORCE to_lowercase(data_[i]);
525 const auto rc = _NEFORCE to_lowercase(view.data_[i]);
526 if (lc != rc) {
527 return (lc < rc) ? -1 : 1;
528 }
529 }
530 if (size_ < view.size_) {
531 return -1;
532 }
533 if (size_ > view.size_) {
534 return 1;
535 }
536 return 0;
537 }
538
544 NEFORCE_NODISCARD constexpr int compare_ignore_case(const_pointer str) const noexcept {
545 return this->compare_ignore_case(basic_string_view(str));
546 }
547
554 NEFORCE_NODISCARD constexpr size_type find(const basic_string_view view, const size_type n = 0) const noexcept {
555 return (char_traits_find<Traits>) (data_, size_, n, view.data_, view.size_);
556 }
557
564 NEFORCE_NODISCARD constexpr size_type find(const CharT chr, const size_type n = 0) const noexcept {
565 return (char_traits_find_char<Traits>) (data_, size_, n, chr);
566 }
567
575 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off,
576 const size_type count) const noexcept {
577 return (char_traits_find<Traits>) (data_, size_, off, str, count);
578 }
579
586 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off = 0) const noexcept {
587 return (char_traits_find<Traits>) (data_, size_, off, str, Traits::length(str));
588 }
589
596 NEFORCE_NODISCARD constexpr size_type rfind(const basic_string_view view,
597 const size_type off = npos) const noexcept {
598 return (char_traits_rfind<Traits>) (data_, size_, off, view.data_, view.size_);
599 }
600
607 NEFORCE_NODISCARD constexpr size_type rfind(const CharT chr, const size_type n = npos) const noexcept {
608 return (char_traits_rfind_char<Traits>) (data_, size_, n, chr);
609 }
610
618 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off,
619 const size_type n) const noexcept {
620 return (char_traits_rfind<Traits>) (data_, size_, off, str, n);
621 }
622
629 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off = npos) const noexcept {
630 return (char_traits_rfind<Traits>) (data_, size_, off, str, Traits::length(str));
631 }
632
639 NEFORCE_NODISCARD constexpr size_type find_first_of(const basic_string_view view,
640 const size_type off = 0) const noexcept {
641 return (char_traits_find_first_of<Traits>) (data_, size_, off, view.data_, view.size_);
642 }
643
650 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT chr, const size_type off = 0) const noexcept {
651 return (char_traits_find_char<Traits>) (data_, size_, off, chr);
652 }
653
661 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str, const size_type off,
662 const size_type n) const noexcept {
663 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, n);
664 }
665
672 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str,
673 const size_type off = 0) const noexcept {
674 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, Traits::length(str));
675 }
676
683 NEFORCE_NODISCARD constexpr size_type find_last_of(const basic_string_view view,
684 const size_type off = npos) const noexcept {
685 return (char_traits_find_last_of<Traits>) (data_, size_, off, view.data_, view.size_);
686 }
687
694 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT chr, const size_type off = npos) const noexcept {
695 return (char_traits_rfind_char<Traits>) (data_, size_, off, chr);
696 }
697
705 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str, const size_type off,
706 const size_type n) const noexcept {
707 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, n);
708 }
709
716 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str,
717 const size_type off = npos) const noexcept {
718 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, Traits::length(str));
719 }
720
727 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const basic_string_view view,
728 const size_type off = 0) const noexcept {
729 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
730 }
731
738 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT chr, const size_type off = 0) const noexcept {
739 return (char_traits_find_not_char<Traits>) (data_, size_, off, chr);
740 }
741
749 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str, const size_type off,
750 const size_type n) const noexcept {
751 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, n);
752 }
753
760 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str,
761 const size_type off = 0) const noexcept {
762 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
763 }
764
771 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const basic_string_view view,
772 const size_type off = npos) const noexcept {
773 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
774 }
775
782 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT chr, const size_type off = npos) const noexcept {
783 return (char_traits_rfind_not_char<Traits>) (data_, size_, off, chr);
784 }
785
793 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str, const size_type off,
794 const size_type n) const noexcept {
795 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, n);
796 }
797
804 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str,
805 const size_type off = npos) const noexcept {
806 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
807 }
808
816 NEFORCE_NODISCARD constexpr size_type find_first_of(const charset& cs, const size_type off = 0) const noexcept {
817 return (char_traits_find_first_of<Traits>) (data_, size_, off, cs);
818 }
819
827 NEFORCE_NODISCARD constexpr size_type find_last_of(const charset& cs, const size_type off = npos) const noexcept {
828 return (char_traits_find_last_of<Traits>) (data_, size_, off, cs);
829 }
830
838 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const charset& cs, const size_type off = 0) const noexcept {
839 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, cs);
840 }
841
849 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const charset& cs,
850 const size_type off = npos) const noexcept {
851 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, cs);
852 }
853
860 NEFORCE_NODISCARD constexpr size_type count(value_type chr, const size_type position = 0) const noexcept {
861 size_type n = 0;
862 for (size_type idx = position; idx < size_; ++idx) {
863 if (*(data() + idx) == chr) {
864 ++n;
865 }
866 }
867 return n;
868 }
869
875 NEFORCE_NODISCARD constexpr bool starts_with(const basic_string_view view) const noexcept {
876 return view.size() <= size_ && traits_type::compare(data(), view.data(), view.size()) == 0;
877 }
878
884 NEFORCE_NODISCARD constexpr bool starts_with(value_type chr) const noexcept {
885 return !empty() && traits_type::eq(front(), chr);
886 }
887
893 NEFORCE_NODISCARD constexpr bool starts_with(const_pointer str) const noexcept {
894 return this->starts_with(basic_string_view(str));
895 }
896
902 NEFORCE_NODISCARD constexpr bool ends_with(const basic_string_view view) const noexcept {
903 const size_type view_size = view.size();
904 return view_size <= size_ && traits_type::compare(data_ + size_ - view_size, view.data(), view_size) == 0;
905 }
906
912 NEFORCE_NODISCARD constexpr bool ends_with(value_type chr) const noexcept {
913 return !empty() && traits_type::eq(back(), chr);
914 }
915
921 NEFORCE_NODISCARD constexpr bool ends_with(const_pointer str) const noexcept {
922 return this->ends_with(basic_string_view(str));
923 }
924
930 NEFORCE_NODISCARD constexpr bool contains(const basic_string_view view) const noexcept {
931 return this->find(view) != npos;
932 }
933
939 NEFORCE_NODISCARD constexpr bool contains(value_type chr) const noexcept { return this->find(chr) != npos; }
940
946 NEFORCE_NODISCARD constexpr bool contains(const_pointer str) const noexcept { return this->find(str) != npos; }
947
952 NEFORCE_NODISCARD constexpr basic_string_view trim_left() const noexcept {
953 return this->trim_left_if(charset::ascii_space());
954 }
955
960 NEFORCE_NODISCARD constexpr basic_string_view trim_right() const noexcept {
961 return this->trim_right_if(charset::ascii_space());
962 }
963
968 NEFORCE_NODISCARD constexpr basic_string_view trim() const noexcept { return this->trim_left().trim_right(); }
969
976 template <typename Predicate>
977 NEFORCE_NODISCARD constexpr basic_string_view trim_left_if(Predicate pred) const
978 noexcept(noexcept(pred(*cbegin()))) {
979 if (empty()) {
980 return *this;
981 }
982
983 const_iterator it = cbegin();
984 while (it != cend() && pred(*it)) {
985 ++it;
986 }
987
988 if (it != cbegin()) {
989 return basic_string_view(data_ + (it - cbegin()), size_ - (it - cbegin()));
990 }
991
992 return *this;
993 }
994
1001 template <typename Predicate>
1002 NEFORCE_NODISCARD constexpr basic_string_view trim_right_if(Predicate pred) const
1003 noexcept(noexcept(pred(*crbegin()))) {
1004 if (empty()) {
1005 return *this;
1006 }
1007
1009 while (rit != crend() && pred(*rit)) {
1010 ++rit;
1011 }
1012
1013 if (rit != crbegin()) {
1014 return basic_string_view(data_, size_ - (rit - crbegin()));
1015 }
1016
1017 return *this;
1018 }
1019
1025 NEFORCE_NODISCARD constexpr basic_string_view trim_left_if(const charset& cs) const noexcept {
1026 if (empty()) {
1027 return *this;
1028 }
1029
1030 const_iterator it = cbegin();
1031 while (it != cend() && cs.contains(*it)) {
1032 ++it;
1033 }
1034
1035 if (it != cbegin()) {
1036 return basic_string_view(data_ + (it - cbegin()), size_ - (it - cbegin()));
1037 }
1038
1039 return *this;
1040 }
1041
1047 NEFORCE_NODISCARD constexpr basic_string_view trim_right_if(const charset& cs) const noexcept {
1048 if (empty()) {
1049 return *this;
1050 }
1051
1053 while (rit != crend() && cs.contains(*rit)) {
1054 ++rit;
1055 }
1056
1057 if (rit != crbegin()) {
1058 return basic_string_view(data_, size_ - (rit - crbegin()));
1059 }
1060
1061 return *this;
1062 }
1063
1069 NEFORCE_NODISCARD constexpr basic_string_view trim_if(const charset& cs) const noexcept {
1070 return this->trim_left_if(cs).trim_right_if(cs);
1071 }
1072
1079 template <typename Predicate>
1080 NEFORCE_NODISCARD constexpr basic_string_view trim_if(Predicate pred) const
1081 noexcept(noexcept(this->trim_right_if(pred)) && noexcept(this->trim_left_if(pred))) {
1082 return this->trim_left_if(pred).trim_right_if(pred);
1083 }
1084
1090 NEFORCE_NODISCARD constexpr bool equal_to(const basic_string_view str) const noexcept {
1091 return (char_traits_equal<Traits>) (data_, size_, str.data_, str.size_);
1092 }
1093
1099 NEFORCE_NODISCARD constexpr bool equal_to(const CharT* str) const noexcept {
1100 return equal_to(basic_string_view(str));
1101 }
1102
1107 constexpr void swap(basic_string_view& view) noexcept {
1108 const basic_string_view tmp(view);
1109 view = *this;
1110 *this = tmp;
1111 }
1112
1118 NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view& rhs) const noexcept {
1119 return this->compare(rhs) < 0;
1120 }
1121
1126 NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept {
1127 const size_t byte_len = length() * sizeof(CharT);
1128#ifdef NEFORCE_ARCH_BITS_64
1129 return static_cast<size_t>(_NEFORCE XXH64(data(), byte_len));
1130#else
1131 return static_cast<size_t>(_NEFORCE XXH32(data(), byte_len));
1132#endif
1133 }
1134};
1135
1136#ifndef NEFORCE_STANDARD_17
1137template <typename CharT, typename Traits>
1138constexpr size_t basic_string_view<CharT, Traits>::npos;
1139#endif
1140
1141#ifndef NEFORCE_COMPILER_CLANG_CL
1142extern template class basic_string_view<char>;
1143extern template class basic_string_view<wchar_t>;
1144# ifdef NEFORCE_STANDARD_20
1145extern template class basic_string_view<char8_t>;
1146# endif
1147extern template class basic_string_view<char16_t>;
1148extern template class basic_string_view<char32_t>;
1149#endif
1150 // StringView
1152
1153NEFORCE_END_NAMESPACE__
1154#endif // NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
字符特征模板
字符类型分类和转换函数
字符集工具类
基本字符串视图模板
constexpr size_type find_first_not_of(const charset &cs, const size_type off=0) const noexcept
查找第一个不在 charset 中的字符
constexpr bool ends_with(value_type chr) const noexcept
检查是否以指定字符结尾
constexpr basic_string_view tail(const size_type off=0) const
获取尾部子串
constexpr const_reference at(const size_type n) const
带边界检查的访问
constexpr size_type find_last_not_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个不在字符集合中的字符
constexpr basic_string_view trim_right_if(const charset &cs) const noexcept
根据 charset 去除右侧字符
constexpr const_iterator cend() const noexcept
获取常量结束迭代器
constexpr size_type find_first_not_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个不在C风格字符串集合中的字符
constexpr const_reference operator[](const size_type n) const noexcept
下标访问操作符
constexpr bool starts_with(const_pointer str) const noexcept
检查是否以C风格字符串开头
constexpr bool ends_with(const basic_string_view view) const noexcept
检查是否以指定视图结尾
constexpr int compare(const basic_string_view view) const noexcept
比较字符串视图
constexpr const_iterator cbegin() const noexcept
获取常量起始迭代器
constexpr size_t to_hash() const noexcept
计算哈希值
constexpr basic_string_view trim_left() const noexcept
去除左侧空白字符
constexpr int compare(const size_type off, const size_type n, const CharT *const str, const size_type count) const
比较子串与指定长度的字符数组
constexpr basic_string_view trim_right() const noexcept
去除右侧空白字符
constexpr bool starts_with(value_type chr) const noexcept
检查是否以指定字符开头
constexpr int compare(const CharT *const str) const noexcept
比较与C风格字符串
constexpr basic_string_view(Iterator start, Iterator finish)
从迭代器范围构造
constexpr size_type count(value_type chr, const size_type position=0) const noexcept
constexpr bool equal_to(const CharT *str) const noexcept
与C风格字符串相等比较
constexpr const_reverse_iterator rend() const noexcept
获取反向结束迭代器
constexpr ~basic_string_view() noexcept=default
析构函数
constexpr const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
constexpr bool starts_with(const basic_string_view view) const noexcept
检查是否以指定视图开头
constexpr size_type find_first_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个出现在指定字符集合中的字符
constexpr basic_string_view trim_left_if(const charset &cs) const noexcept
根据 charset 去除左侧字符
constexpr size_type rfind(const basic_string_view view, const size_type off=npos) const noexcept
从后向前查找子串
constexpr size_type find_first_of(const charset &cs, const size_type off=0) const noexcept
查找第一个出现在 charset 中的字符
constexpr bool less_than(const basic_string_view &rhs) const noexcept
小于比较操作符
constexpr bool contains(const basic_string_view view) const noexcept
检查是否包含指定视图
constexpr int compare(const size_type off, const size_type n, const CharT *const str) const
比较子串与C风格字符串
constexpr size_type find(const basic_string_view view, const size_type n=0) const noexcept
查找子串
constexpr size_type find_last_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个不在指定字符集合中的字符
constexpr const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
constexpr size_type find(const CharT chr, const size_type n=0) const noexcept
查找字符
constexpr bool ends_with(const_pointer str) const noexcept
检查是否以C风格字符串结尾
constexpr size_type rfind(const CharT *const str, const size_type off=npos) const noexcept
从后向前查找C风格字符串
constexpr size_type find_first_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个出现在C风格字符串集合中的字符
constexpr const_reference back() const noexcept
访问最后一个字符
constexpr bool empty() const noexcept
检查是否为空
constexpr size_type max_size() const noexcept
获取最大可能长度
constexpr basic_string_view trim() const noexcept
去除两侧空白字符
constexpr size_type find(const CharT *const str, const size_type off, const size_type count) const noexcept
查找指定长度的子串
constexpr basic_string_view trim_if(const charset &cs) const noexcept
根据 charset 去除两侧字符
constexpr bool contains(value_type chr) const noexcept
检查是否包含指定字符
constexpr size_type find_first_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个不在指定字符集合中的字符
constexpr size_type find_last_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个出现在字符集合中的字符
constexpr int compare(const size_type off, const size_type n, const basic_string_view view, const size_type roff, const size_type count) const
比较子串与另一个子串
constexpr size_type copy(CharT *const str, size_type count, const size_type off=0) const
复制字符到目标缓冲区
constexpr int compare_ignore_case(const basic_string_view view) const noexcept
忽略大小写三路比较
constexpr bool equal_to(const basic_string_view str) const noexcept
相等比较
constexpr size_type find_last_not_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个不等于指定字符的位置
constexpr int compare(const size_type off, const size_type n, const basic_string_view view) const
比较子串与字符串视图
constexpr size_type rfind(const CharT *const str, const size_type off, const size_type n) const noexcept
从后向前查找指定长度的子串
constexpr basic_string_view trim_right_if(Predicate pred) const noexcept(noexcept(pred(*crbegin())))
constexpr void remove_suffix(const size_type n) noexcept
移除后缀
constexpr basic_string_view head(const size_type count=npos) const
获取头部子串
constexpr const_reverse_iterator rbegin() const noexcept
获取反向起始迭代器
constexpr basic_string_view(const_pointer str, const size_type n) noexcept
从字符数组构造(指定长度)
constexpr size_type find(const CharT *const str, const size_type off=0) const noexcept
查找C风格字符串
constexpr basic_string_view substr(const size_type off=0, const size_type count=npos) const
获取子视图
constexpr size_type find_first_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个出现在字符集合中的字符
constexpr size_type find_last_not_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个不在C风格字符串集合中的字符
constexpr size_type find_last_not_of(const charset &cs, const size_type off=npos) const noexcept
查找最后一个不在 charset 中的字符
constexpr const_iterator end() const noexcept
获取结束迭代器
constexpr void remove_prefix(const size_type n) noexcept
移除前缀
constexpr size_type find_first_not_of(const CharT chr, const size_type off=0) const noexcept
查找第一个不等于指定字符的位置
constexpr const_pointer data() const noexcept
获取底层数据指针
constexpr basic_string_view trim_if(Predicate pred) const noexcept(noexcept(this->trim_right_if(pred)) &&noexcept(this->trim_left_if(pred)))
根据谓词去除两侧字符
constexpr size_type find_first_not_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个不在字符集合中的字符
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
constexpr size_type find_first_of(const CharT chr, const size_type off=0) const noexcept
查找第一个等于指定字符的位置
constexpr const_reference front() const noexcept
访问第一个字符
constexpr size_type find_last_of(const charset &cs, const size_type off=npos) const noexcept
查找最后一个出现在 charset 中的字符
constexpr bool contains(const_pointer str) const noexcept
检查是否包含C风格字符串
constexpr size_type find_last_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个等于指定字符的位置
constexpr size_type find_last_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个出现在指定字符集合中的字符
constexpr size_type find_last_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个出现在C风格字符串集合中的字符
constexpr size_type rfind(const CharT chr, const size_type n=npos) const noexcept
从后向前查找字符
constexpr basic_string_view trim_left_if(Predicate pred) const noexcept(noexcept(pred(*cbegin())))
constexpr int compare_ignore_case(const_pointer str) const noexcept
忽略大小写与C风格字符串三路比较
constexpr void swap(basic_string_view &view) noexcept
交换两个字符串视图
static constexpr charset ascii_space() noexcept
ASCII 空白字符集
constexpr bool is_standard_layout_v
is_standard_layout的便捷变量模板
constexpr bool is_array_v
is_array的便捷变量模板
constexpr CharT to_lowercase(const CharT c) noexcept
将字符转换为小写
constexpr size_t char_traits_rfind(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
从后向前查找子序列
constexpr size_t char_traits_find_not_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
查找第一个不等于指定字符的位置
constexpr int char_traits_compare(const char_traits_ptr_t< Traits > lhs, const size_t lh_size, const char_traits_ptr_t< Traits > rhs, const size_t rh_size) noexcept
比较两个字符序列(三路比较)
constexpr size_t char_traits_find_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
在字符序列中查找单个字符
constexpr size_t char_traits_find_first_not_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找第一个不在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_find(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
在字符序列中查找子序列
constexpr size_t char_traits_find_last_not_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找最后一个不在给定集合中的字符(char_traits特化版本)
constexpr bool char_traits_equal(const char_traits_ptr_t< Traits > lhs, const size_t lh_size, const char_traits_ptr_t< Traits > rhs, const size_t rh_size) noexcept
比较两个字符序列是否相等
constexpr size_t char_traits_find_first_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找第一个出现在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_find_last_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找最后一个出现在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_rfind_not_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
查找最后一个不等于指定字符的位置
constexpr size_t char_traits_rfind_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
从后向前查找单个字符
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
constexpr T clamp(const T &value, const T &lower, const T &upper, Compare comp) noexcept(noexcept(comp(value, lower)))
将值限制在指定范围内
constexpr uint32_t XXH32(const void *input, size_t len, uint32_t seed=0) noexcept
XXH32 哈希算法
constexpr uint64_t XXH64(const void *input, size_t len, uint64_t seed=0) noexcept
XXH64 哈希算法
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
constexpr bool is_trivial_v
is_trivial的便捷变量模板
constexpr bool is_same_v
is_same的便捷变量模板
迭代器接口
constexpr void increment() noexcept
递增操作
constexpr void advance(difference_type off) noexcept
前进操作
basic_string_view< typename Traits::char_type, Traits > container_type
容器类型
constexpr bool equal_to(const basic_string_view_iterator &rhs) const noexcept
相等比较
typename container_type::const_reference reference
引用类型
typename container_type::size_type size_type
大小类型
constexpr difference_type distance_to(const basic_string_view_iterator &other) const noexcept
计算距离操作
constexpr bool less_than(const basic_string_view_iterator &rhs) const noexcept
小于比较
typename container_type::value_type value_type
值类型
typename container_type::const_pointer pointer
指针类型
typename container_type::difference_type difference_type
差值类型
constexpr reference operator[](const difference_type n) const noexcept
下标访问操作符
constexpr void decrement() noexcept
递减操作
contiguous_iterator_tag iterator_category
迭代器类别
constexpr reference dereference() const noexcept
解引用操作
constexpr pointer base() const noexcept
获取底层指针
通用接口,同时具备可比较和可哈希功能
迭代器接口模板