1#ifndef _STRING_ 2#define _STRING_ 3 4// For size_t 5#include <string.h> 6 7typedef unsigned __INT16_TYPE__ char16; 8typedef unsigned __INT32_TYPE__ char32; 9 10namespace std { 11template <typename T> 12class allocator {}; 13 14template <typename T> 15class char_traits {}; 16 17template <typename C, typename T = char_traits<C>> 18struct basic_string_view; 19 20template <typename C, typename T = char_traits<C>, typename A = allocator<C>> 21struct basic_string { 22 typedef size_t size_type; 23 typedef basic_string<C, T, A> _Type; 24 basic_string(); 25 basic_string(const C *p, const A &a = A()); 26 basic_string(const C *p, size_type count); 27 basic_string(const C *b, const C *e); 28 29 ~basic_string(); 30 31 const C *c_str() const; 32 const C *data() const; 33 34 bool empty() const; 35 size_type size() const; 36 size_type length() const; 37 38 _Type& append(const C *s); 39 _Type& append(const C *s, size_type n); 40 _Type& assign(const C *s); 41 _Type& assign(const C *s, size_type n); 42 43 int compare(const _Type&) const; 44 int compare(const C* s) const; 45 int compare(size_type pos, size_type len, const _Type&) const; 46 int compare(size_type pos, size_type len, const C* s) const; 47 template<class StringViewLike> 48 int compare(size_type pos1, size_type count1, const StringViewLike& t) const; 49 50 size_type find(const _Type& str, size_type pos = 0) const; 51 size_type find(const C* s, size_type pos = 0) const; 52 size_type find(const C* s, size_type pos, size_type n) const; 53 54 size_type rfind(const _Type& str, size_type pos = npos) const; 55 size_type rfind(const C* s, size_type pos, size_type count) const; 56 size_type rfind(const C* s, size_type pos = npos) const; 57 size_type rfind(C ch, size_type pos = npos) const; 58 59 _Type& insert(size_type pos, const _Type& str); 60 _Type& insert(size_type pos, const C* s); 61 _Type& insert(size_type pos, const C* s, size_type n); 62 63 _Type substr(size_type pos = 0, size_type count = npos) const; 64 65 constexpr bool starts_with(std::basic_string_view<C, T> sv) const noexcept; 66 constexpr bool starts_with(C ch) const noexcept; 67 constexpr bool starts_with(const C* s) const; 68 69 constexpr bool ends_with(std::basic_string_view<C, T> sv) const noexcept; 70 constexpr bool ends_with(C ch) const noexcept; 71 constexpr bool ends_with(const C* s) const; 72 73 _Type& operator[](size_type); 74 const _Type& operator[](size_type) const; 75 76 _Type& operator+=(const _Type& str); 77 _Type& operator+=(const C* s); 78 _Type& operator=(const _Type& str); 79 _Type& operator=(const C* s); 80 81 static constexpr size_t npos = -1; 82}; 83 84typedef basic_string<char> string; 85typedef basic_string<wchar_t> wstring; 86typedef basic_string<char16> u16string; 87typedef basic_string<char32> u32string; 88 89template <typename C, typename T> 90struct basic_string_view { 91 typedef size_t size_type; 92 typedef basic_string_view<C, T> _Type; 93 94 const C *str; 95 constexpr basic_string_view(const C* s) : str(s) {} 96 97 const C *data() const; 98 99 bool empty() const; 100 size_type size() const; 101 size_type length() const; 102 103 size_type find(_Type v, size_type pos = 0) const; 104 size_type find(C ch, size_type pos = 0) const; 105 size_type find(const C* s, size_type pos, size_type count) const; 106 size_type find(const C* s, size_type pos = 0) const; 107 108 size_type rfind(_Type v, size_type pos = npos) const; 109 size_type rfind(C ch, size_type pos = npos) const; 110 size_type rfind(const C* s, size_type pos, size_type count) const; 111 size_type rfind(const C* s, size_type pos = npos) const; 112 113 constexpr bool starts_with(basic_string_view sv) const noexcept; 114 constexpr bool starts_with(C ch) const noexcept; 115 constexpr bool starts_with(const C* s) const; 116 117 constexpr bool ends_with(basic_string_view sv) const noexcept; 118 constexpr bool ends_with(C ch) const noexcept; 119 constexpr bool ends_with(const C* s) const; 120 121 constexpr int compare(basic_string_view sv) const noexcept; 122 123 static constexpr size_t npos = -1; 124}; 125 126typedef basic_string_view<char> string_view; 127typedef basic_string_view<wchar_t> wstring_view; 128typedef basic_string_view<char16> u16string_view; 129typedef basic_string_view<char32> u32string_view; 130 131std::string operator+(const std::string&, const std::string&); 132std::string operator+(const std::string&, const char*); 133std::string operator+(const char*, const std::string&); 134 135bool operator==(const std::string&, const std::string&); 136bool operator==(const std::string&, const char*); 137bool operator==(const char*, const std::string&); 138 139bool operator==(const std::wstring&, const std::wstring&); 140bool operator==(const std::wstring&, const wchar_t*); 141bool operator==(const wchar_t*, const std::wstring&); 142 143bool operator==(const std::string_view&, const std::string_view&); 144bool operator==(const std::string_view&, const char*); 145bool operator==(const char*, const std::string_view&); 146 147#if __cplusplus < 202002L 148bool operator!=(const std::string&, const std::string&); 149bool operator!=(const std::string&, const char*); 150bool operator!=(const char*, const std::string&); 151 152bool operator!=(const std::string_view&, const std::string_view&); 153bool operator!=(const std::string_view&, const char*); 154bool operator!=(const char*, const std::string_view&); 155#endif 156 157size_t strlen(const char* str); 158} 159 160#endif // _STRING_ 161