NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
basic_string_view.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
2#define NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
3
12
16NEFORCE_BEGIN_NAMESPACE__
17
23
25template <typename CharT, typename Traits = char_traits<CharT>>
28
29
38template <typename Traits>
39struct basic_string_view_iterator : iiterator<basic_string_view_iterator<Traits>> {
40public:
48
49private:
50 pointer data_ = nullptr;
51 size_t size_ = 0;
52 size_t idx_ = 0;
53
54public:
55 constexpr basic_string_view_iterator() noexcept = default;
56 NEFORCE_CONSTEXPR20 ~basic_string_view_iterator() = default;
57
58 constexpr basic_string_view_iterator(const basic_string_view_iterator&) noexcept = default;
59 constexpr basic_string_view_iterator& operator=(const basic_string_view_iterator&) noexcept = default;
60 constexpr basic_string_view_iterator(basic_string_view_iterator&&) noexcept = default;
61 constexpr basic_string_view_iterator& operator=(basic_string_view_iterator&&) noexcept = default;
62
69 constexpr basic_string_view_iterator(const pointer data, const size_t size, const size_t off) noexcept :
70 data_(data),
71 size_(size),
72 idx_(off) {}
73
78 NEFORCE_NODISCARD constexpr reference dereference() const noexcept {
79 NEFORCE_DEBUG_VERIFY(data_, "Attempting to dereference on a null pointer");
80 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to dereference out of boundary");
81 return data_[idx_];
82 }
83
87 constexpr void increment() noexcept {
88 NEFORCE_DEBUG_VERIFY(data_, "Attempting to increment a null pointer");
89 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to increment out of boundary");
90 ++idx_;
91 }
92
96 constexpr void decrement() noexcept {
97 NEFORCE_DEBUG_VERIFY(data_, "Attempting to decrement a null pointer");
98 NEFORCE_DEBUG_VERIFY(idx_ != 0, "Attempting to decrement out of boundary");
99 --idx_;
100 }
101
106 constexpr void advance(difference_type off) noexcept {
107 NEFORCE_DEBUG_VERIFY(data_ || off == 0, "Attempting to advance a null pointer");
108 NEFORCE_DEBUG_VERIFY((off < 0 ? idx_ >= -off : size_ - idx_ >= off), "Attempting to advance out of boundary");
109 idx_ += off;
110 }
111
117 NEFORCE_NODISCARD constexpr difference_type distance_to(const basic_string_view_iterator& other) const noexcept {
118 NEFORCE_DEBUG_VERIFY(data_ == other.data_ && size_ == other.size_,
119 "Attempting to distance to a different container");
120 return static_cast<difference_type>(idx_ - other.idx_);
121 }
122
128 NEFORCE_NODISCARD constexpr reference operator[](const difference_type n) const noexcept { return *(*this + n); }
129
135 NEFORCE_NODISCARD constexpr bool equal(const basic_string_view_iterator& rhs) const noexcept {
136 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to equal to a different container");
137 return idx_ == rhs.idx_;
138 }
139
145 NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view_iterator& rhs) const noexcept {
146 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to less than a different container");
147 return idx_ < rhs.idx_;
148 }
149
154 NEFORCE_NODISCARD constexpr pointer base() const noexcept { return data_ + idx_; }
155};
156
157
168template <typename CharT, typename Traits>
169class basic_string_view : public icommon<basic_string_view<CharT, Traits>> {
171 "char type of basic string view should be same with char traits.");
173 "basic string view only contains non-array trivial standard-layout types.");
174
175public:
176 using value_type = CharT;
177 using pointer = const CharT*;
178 using reference = const CharT&;
179 using const_pointer = const CharT*;
180 using const_reference = const CharT&;
187 using traits_type = Traits;
188
190 static constexpr auto npos = static_cast<size_type>(-1);
191
192private:
193 const_pointer data_ = "";
194 size_type size_ = 0;
195
202 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr size_type clamp_size(const size_type position,
203 const size_type size) const noexcept {
204 return _NEFORCE min(size, size_ - position);
205 }
206
207public:
208 constexpr basic_string_view() noexcept = default;
209 constexpr basic_string_view(const basic_string_view&) noexcept = default;
210 constexpr basic_string_view& operator=(const basic_string_view&) noexcept = default;
211
218 constexpr basic_string_view(const_pointer str) noexcept :
219 data_(str),
220 size_(Traits::length(str)) {}
221
229 constexpr basic_string_view(const_pointer str, const size_type n) noexcept :
230 data_(str),
231 size_(n) {}
232
241 template <typename Iterator, enable_if_t<is_same_v<iter_value_t<Iterator>, value_type>, int> = 0>
242 constexpr basic_string_view(Iterator start, Iterator finish) :
243 data_(&*start),
244 size_(_NEFORCE distance(start, finish)) {}
245
249 NEFORCE_CONSTEXPR20 ~basic_string_view() noexcept = default;
250
255 NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept { return const_iterator(data_, size_, 0); }
256
261 NEFORCE_NODISCARD constexpr const_iterator end() const noexcept { return const_iterator(data_, size_, size_); }
262
267 NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept { return begin(); }
268
273 NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept { return end(); }
274
279 NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
280
285 NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
286
291 NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
292
297 NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept { return rend(); }
298
303 NEFORCE_NODISCARD constexpr size_type size() const noexcept { return size_; }
304
309 NEFORCE_NODISCARD constexpr size_type max_size() const noexcept {
310 return (npos - sizeof(size_type) - sizeof(void*)) / sizeof(value_type) / 4;
311 }
312
317 NEFORCE_NODISCARD constexpr size_type length() const noexcept { return size_; }
318
323 NEFORCE_NODISCARD constexpr bool empty() const noexcept { return size_ == 0; }
324
331 NEFORCE_NODISCARD constexpr const_pointer data() const noexcept { return data_; }
332
337 NEFORCE_NODISCARD constexpr const_reference front() const noexcept {
338 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call front on empty string_view");
339 return data_[0];
340 }
341
346 NEFORCE_NODISCARD constexpr const_reference back() const noexcept {
347 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call back on empty string_view");
348 return data_[size_ - 1];
349 }
350
356 NEFORCE_NODISCARD constexpr const_reference operator[](const size_type n) const noexcept {
357 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
358 return data_[n];
359 }
360
366 NEFORCE_NODISCARD constexpr const_reference at(const size_type n) const {
367 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
368 return data_[n];
369 }
370
377 constexpr void remove_prefix(const size_type n) noexcept {
378 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove prefix longer than total size");
379 data_ += n;
380 size_ -= n;
381 }
382
389 constexpr void remove_suffix(const size_type n) noexcept {
390 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove suffix longer than total size");
391 size_ -= n;
392 }
393
401 constexpr size_type copy(CharT* const str, size_type count, const size_type off = 0) const {
402 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
403 count = clamp_size(off, count);
404 Traits::copy(str, data_ + off, count);
405 return count;
406 }
407
414 NEFORCE_NODISCARD constexpr basic_string_view substr(const size_type off = 0, size_type count = npos) const {
415 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
416 count = clamp_size(off, count);
417 return basic_string_view(data_ + off, count);
418 }
419
426 NEFORCE_NODISCARD constexpr basic_string_view view(const size_type off, size_type count = npos) const {
427 return substr(off, count);
428 }
429
435 NEFORCE_NODISCARD constexpr int compare(const basic_string_view view) const noexcept {
436 return (char_traits_compare<Traits>) (data_, size_, view.data_, view.size_);
437 }
438
446 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n,
447 const basic_string_view view) const {
448 return substr(off, n).compare(view);
449 }
450
460 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const basic_string_view view,
461 const size_type roff, const size_type count) const {
462 return substr(off, n).compare(view.substr(roff, count));
463 }
464
470 NEFORCE_NODISCARD constexpr int compare(const CharT* const str) const noexcept {
471 return compare(basic_string_view(str));
472 }
473
481 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str) const {
482 return substr(off, n).compare(basic_string_view(str));
483 }
484
493 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str,
494 const size_type count) const {
495 return substr(off, n).compare(basic_string_view(str, count));
496 }
497
504 NEFORCE_NODISCARD constexpr size_type find(const basic_string_view view, const size_type n = 0) const noexcept {
505 return (char_traits_find<Traits>) (data_, size_, n, view.data_, view.size_);
506 }
507
514 NEFORCE_NODISCARD constexpr size_type find(const CharT chr, const size_type n = 0) const noexcept {
515 return (char_traits_find_char<Traits>) (data_, size_, n, chr);
516 }
517
525 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off,
526 const size_type count) const noexcept {
527 return (char_traits_find<Traits>) (data_, size_, off, str, count);
528 }
529
536 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off = 0) const noexcept {
537 return (char_traits_find<Traits>) (data_, size_, off, str, Traits::length(str));
538 }
539
546 NEFORCE_NODISCARD constexpr size_type rfind(const basic_string_view view,
547 const size_type off = npos) const noexcept {
548 return (char_traits_rfind<Traits>) (data_, size_, off, view.data_, view.size_);
549 }
550
557 NEFORCE_NODISCARD constexpr size_type rfind(const CharT chr, const size_type n = npos) const noexcept {
558 return (char_traits_rfind_char<Traits>) (data_, size_, n, chr);
559 }
560
568 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off,
569 const size_type n) const noexcept {
570 return (char_traits_rfind<Traits>) (data_, size_, off, str, n);
571 }
572
579 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off = npos) const noexcept {
580 return (char_traits_rfind<Traits>) (data_, size_, off, str, Traits::length(str));
581 }
582
589 NEFORCE_NODISCARD constexpr size_type find_first_of(const basic_string_view view,
590 const size_type off = 0) const noexcept {
591 return (char_traits_find_first_of<Traits>) (data_, size_, off, view.data_, view.size_);
592 }
593
600 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT chr, const size_type off = 0) const noexcept {
601 return (char_traits_find_char<Traits>) (data_, size_, off, chr);
602 }
603
611 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str, const size_type off,
612 const size_type n) const noexcept {
613 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, n);
614 }
615
622 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str,
623 const size_type off = 0) const noexcept {
624 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, Traits::length(str));
625 }
626
633 NEFORCE_NODISCARD constexpr size_type find_last_of(const basic_string_view view,
634 const size_type off = npos) const noexcept {
635 return (char_traits_find_last_of<Traits>) (data_, size_, off, view.data_, view.size_);
636 }
637
644 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT chr, const size_type off = npos) const noexcept {
645 return (char_traits_rfind_char<Traits>) (data_, size_, off, chr);
646 }
647
655 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str, const size_type off,
656 const size_type n) const noexcept {
657 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, n);
658 }
659
666 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str,
667 const size_type off = npos) const noexcept {
668 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, Traits::length(str));
669 }
670
677 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const basic_string_view view,
678 const size_type off = 0) const noexcept {
679 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
680 }
681
688 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT chr, const size_type off = 0) const noexcept {
689 return (char_traits_find_not_char<Traits>) (data_, size_, off, chr);
690 }
691
699 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str, const size_type off,
700 const size_type n) const noexcept {
701 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, n);
702 }
703
710 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str,
711 const size_type off = 0) const noexcept {
712 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
713 }
714
721 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const basic_string_view view,
722 const size_type off = npos) const noexcept {
723 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
724 }
725
732 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT chr, const size_type off = npos) const noexcept {
733 return (char_traits_rfind_not_char<Traits>) (data_, size_, off, chr);
734 }
735
743 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str, const size_type off,
744 const size_type n) const noexcept {
745 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, n);
746 }
747
754 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str,
755 const size_type off = npos) const noexcept {
756 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
757 }
758
765 NEFORCE_CONSTEXPR20 size_type count(value_type chr, const size_type position = 0) const noexcept {
766 size_type n = 0;
767 for (size_type idx = position; idx < size_; ++idx) {
768 if (*(data() + idx) == chr) {
769 ++n;
770 }
771 }
772 return n;
773 }
774
780 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const basic_string_view view) const noexcept {
781 return view.size() <= size_ && traits_type::compare(data(), view.data(), view.size()) == 0;
782 }
783
789 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(value_type chr) const noexcept {
790 return !empty() && traits_type::eq(front(), chr);
791 }
792
798 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const_pointer str) const noexcept {
799 return this->starts_with(basic_string_view(str));
800 }
801
807 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const basic_string_view view) const noexcept {
808 const size_type view_size = view.size();
809 return view_size <= size_ && traits_type::compare(data_ + size_ - view_size, view.data(), view_size) == 0;
810 }
811
817 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(value_type chr) const noexcept {
818 return !empty() && traits_type::eq(back(), chr);
819 }
820
826 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const_pointer str) const noexcept {
827 return this->ends_with(basic_string_view(str));
828 }
829
835 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const basic_string_view view) const noexcept {
836 return this->find(view) != npos;
837 }
838
844 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(value_type chr) const noexcept {
845 return this->find(chr) != npos;
846 }
847
853 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const_pointer str) const noexcept {
854 return this->find(str) != npos;
855 }
856
861 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left() const noexcept {
862 return this->trim_left_if([](value_type ch) { return _NEFORCE is_space(ch); });
863 }
864
869 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right() const noexcept {
870 return this->trim_right_if([](value_type ch) { return _NEFORCE is_space(ch); });
871 }
872
877 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim() const noexcept {
878 return this->trim_left().trim_right();
879 }
880
887 template <typename Predicate>
888 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left_if(Predicate pred) const
889 noexcept(noexcept(pred(*cbegin()))) {
890 if (empty()) {
891 return *this;
892 }
893
894 const_iterator it = cbegin();
895 while (it != cend() && pred(*it)) {
896 ++it;
897 }
898
899 if (it != cbegin()) {
900 return basic_string_view(data_ + (it - cbegin()), size_ - (it - cbegin()));
901 }
902
903 return *this;
904 }
905
912 template <typename Predicate>
913 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right_if(Predicate pred) const
914 noexcept(noexcept(pred(*crbegin()))) {
915 if (empty()) {
916 return *this;
917 }
918
920 while (rit != crend() && pred(*rit)) {
921 ++rit;
922 }
923
924 if (rit != crbegin()) {
925 return basic_string_view(data_, size_ - (rit - crbegin()));
926 }
927
928 return *this;
929 }
930
937 template <typename Predicate>
938 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_if(Predicate pred) const
939 noexcept(noexcept(this->trim_right_if(pred)) && noexcept(this->trim_left_if(pred))) {
940 return this->trim_left_if(pred).trim_right_if(pred);
941 }
942
948 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const basic_string_view str) const noexcept {
949 return (char_traits_equal<Traits>) (data_, size_, str.data_, str.size_);
950 }
951
957 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const CharT* str) const noexcept {
958 return equal_to(basic_string_view(str));
959 }
960
965 constexpr void swap(basic_string_view& view) noexcept {
966 const basic_string_view tmp(view);
967 view = *this;
968 *this = tmp;
969 }
970
976 NEFORCE_NODISCARD constexpr bool operator==(const basic_string_view& rhs) const noexcept {
977 return this->equal_to(rhs);
978 }
979
985 NEFORCE_NODISCARD constexpr bool operator<(const basic_string_view& rhs) const noexcept {
986 return this->compare(rhs) < 0;
987 }
988
993 NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept {
994 return _NEFORCE FNV_hash_string(this->data(), this->length());
995 }
996};
997
998
999extern template class basic_string_view<char>;
1000extern template class basic_string_view<wchar_t>;
1001#ifdef NEFORCE_STANDARD_20
1002extern template class basic_string_view<char8_t>;
1003#endif
1004extern template class basic_string_view<char16_t>;
1005extern template class basic_string_view<char32_t>;
1006 // StringView
1008
1009NEFORCE_END_NAMESPACE__
1010#endif // NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
字符特征模板
字符类型分类和转换函数
基本字符串视图模板
NEFORCE_NODISCARD constexpr size_type size() const noexcept
NEFORCE_NODISCARD constexpr size_type find(const CharT chr, const size_type n=0) const noexcept
查找字符
NEFORCE_NODISCARD constexpr size_type length() const noexcept
NEFORCE_NODISCARD constexpr const_reference front() const noexcept
访问第一个字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const basic_string_view str) const noexcept
相等比较
NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个出现在C风格字符串集合中的字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(value_type chr) const noexcept
检查是否包含指定字符
NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个不在C风格字符串集合中的字符
NEFORCE_NODISCARD constexpr const_pointer data() const noexcept
获取底层数据指针
NEFORCE_NODISCARD 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
比较子串与另一个子串
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left() const noexcept
去除左侧空白字符
NEFORCE_NODISCARD constexpr int compare(const basic_string_view view) const noexcept
比较字符串视图
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right_if(Predicate pred) const noexcept(noexcept(pred(*crbegin())))
根据谓词去除右侧字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(value_type chr) const noexcept
检查是否以指定字符开头
NEFORCE_NODISCARD constexpr size_type rfind(const CharT *const str, const size_type off, const size_type n) const noexcept
从后向前查找指定长度的子串
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT chr, const size_type off=0) const noexcept
查找第一个不等于指定字符的位置
NEFORCE_NODISCARD constexpr size_type rfind(const CharT *const str, const size_type off=npos) const noexcept
从后向前查找C风格字符串
NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT chr, const size_type off=0) const noexcept
查找第一个等于指定字符的位置
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const CharT *str) const noexcept
与C风格字符串相等比较
NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个出现在C风格字符串集合中的字符
NEFORCE_NODISCARD constexpr size_type rfind(const basic_string_view view, const size_type off=npos) const noexcept
从后向前查找子串
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const basic_string_view view) const noexcept
检查是否以指定视图结尾
NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT *const str, const size_type count) const
比较子串与指定长度的字符数组
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const_pointer str) const noexcept
检查是否以C风格字符串开头
NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个不在C风格字符串集合中的字符
NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个不在指定字符集合中的字符
NEFORCE_NODISCARD constexpr basic_string_view view(const size_type off, size_type count=npos) const
获取子视图
NEFORCE_NODISCARD constexpr size_type find(const CharT *const str, const size_type off, const size_type count) const noexcept
查找指定长度的子串
NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个等于指定字符的位置
NEFORCE_NODISCARD constexpr size_type rfind(const CharT chr, const size_type n=npos) const noexcept
从后向前查找字符
NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个出现在指定字符集合中的字符
NEFORCE_CONSTEXPR20 size_type count(value_type chr, const size_type position=0) const noexcept
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const_pointer str) const noexcept
检查是否包含C风格字符串
NEFORCE_NODISCARD constexpr bool operator==(const basic_string_view &rhs) const noexcept
相等比较操作符
NEFORCE_NODISCARD constexpr size_type find_first_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个出现在字符集合中的字符
constexpr size_type copy(CharT *const str, size_type count, const size_type off=0) const
复制字符到目标缓冲区
NEFORCE_NODISCARD constexpr const_reference back() const noexcept
访问最后一个字符
NEFORCE_CONSTEXPR20 ~basic_string_view() noexcept=default
析构函数
NEFORCE_NODISCARD constexpr size_type max_size() const noexcept
获取最大可能长度
NEFORCE_NODISCARD constexpr const_reference at(const size_type n) const
带边界检查的访问
NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT *const str) const
比较子串与C风格字符串
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim() const noexcept
去除两侧空白字符
NEFORCE_NODISCARD constexpr const_iterator end() const noexcept
获取结束迭代器
NEFORCE_NODISCARD constexpr basic_string_view substr(const size_type off=0, size_type count=npos) const
获取子视图
constexpr basic_string_view(const_pointer str, const size_type n) noexcept
从字符数组构造(指定长度)
NEFORCE_NODISCARD constexpr size_type find_first_not_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个不在字符集合中的字符
NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个不等于指定字符的位置
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const basic_string_view view) const noexcept
检查是否以指定视图开头
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_if(Predicate pred) const noexcept(noexcept(this->trim_right_if(pred)) &&noexcept(this->trim_left_if(pred)))
根据谓词去除两侧字符
NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个出现在指定字符集合中的字符
NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept
获取常量起始迭代器
constexpr void remove_suffix(const size_type n) noexcept
移除后缀
NEFORCE_NODISCARD constexpr size_type find(const CharT *const str, const size_type off=0) const noexcept
查找C风格字符串
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const basic_string_view view) const noexcept
检查是否包含指定视图
NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept
获取反向起始迭代器
NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
constexpr basic_string_view(Iterator start, Iterator finish)
从迭代器范围构造
NEFORCE_NODISCARD constexpr bool empty() const noexcept
检查是否为空
NEFORCE_NODISCARD constexpr size_type find_last_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个出现在字符集合中的字符
NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept
计算哈希值
NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD constexpr const_reference operator[](const size_type n) const noexcept
下标访问操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const_pointer str) const noexcept
检查是否以C风格字符串结尾
NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept
获取反向结束迭代器
NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const basic_string_view view) const
比较子串与字符串视图
NEFORCE_NODISCARD constexpr size_type find(const basic_string_view view, const size_type n=0) const noexcept
查找子串
NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(value_type chr) const noexcept
检查是否以指定字符结尾
NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个不在指定字符集合中的字符
constexpr void remove_prefix(const size_type n) noexcept
移除前缀
NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept
获取常量结束迭代器
constexpr void swap(basic_string_view &view) noexcept
交换两个字符串视图
NEFORCE_NODISCARD constexpr bool operator<(const basic_string_view &rhs) const noexcept
小于比较操作符
NEFORCE_NODISCARD constexpr size_type find_last_not_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个不在字符集合中的字符
NEFORCE_NODISCARD constexpr int compare(const CharT *const str) const noexcept
比较与C风格字符串
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left_if(Predicate pred) const noexcept(noexcept(pred(*cbegin())))
根据谓词去除左侧字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right() const noexcept
去除右侧空白字符
NEFORCE_INLINE17 constexpr bool is_standard_layout_v
is_standard_layout的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_array_v
is_array的便捷变量模板
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_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_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_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 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 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 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(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 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_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 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
比较两个字符序列是否相等
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_space(const CharT c) noexcept
检查字符是否为空白字符
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
NEFORCE_CONSTEXPR14 size_t FNV_hash_string(const CharT *str, const size_t len) noexcept
字符串类型的FNV哈希
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
NEFORCE_INLINE17 constexpr bool is_trivial_v
is_trivial的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
迭代器接口
constexpr void decrement() noexcept
递减操作
NEFORCE_NODISCARD constexpr bool equal(const basic_string_view_iterator &rhs) const noexcept
相等比较
constexpr void increment() noexcept
递增操作
typename container_type::difference_type difference_type
差值类型
constexpr void advance(difference_type off) noexcept
前进操作
NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view_iterator &rhs) const noexcept
小于比较
typename container_type::const_pointer pointer
指针类型
typename container_type::value_type value_type
值类型
basic_string_view< typename Traits::char_type, Traits > container_type
容器类型
contiguous_iterator_tag iterator_category
迭代器类别
typename container_type::const_reference reference
引用类型
NEFORCE_NODISCARD constexpr pointer base() const noexcept
获取底层指针
typename container_type::size_type size_type
大小类型
NEFORCE_NODISCARD constexpr difference_type distance_to(const basic_string_view_iterator &other) const noexcept
计算距离操作
NEFORCE_NODISCARD constexpr reference dereference() const noexcept
解引用操作
NEFORCE_NODISCARD constexpr reference operator[](const difference_type n) const noexcept
下标访问操作符
连续迭代器标签
通用接口,同时具备可比较和可哈希功能
迭代器接口模板