MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
string.hpp
1#ifndef MSTL_CORE_STRING_STRING_HPP__
2#define MSTL_CORE_STRING_STRING_HPP__
3#include "basic_string.hpp"
5
6using string = basic_string<char>;
7using bstring = basic_string<byte_t>;
8using wstring = basic_string<wchar_t>;
9#ifdef MSTL_STANDARD_20__
10using u8string = basic_string<char8_t>;
11#endif
12using u16string = basic_string<char16_t>;
13using u32string = basic_string<char32_t>;
14
15
17MSTL_NODISCARD MSTL_CONSTEXPR20 string operator ""_s(const char* str, size_t len) noexcept {
18 return {str, len};
19}
20MSTL_NODISCARD MSTL_CONSTEXPR20 wstring operator ""_s(const wchar_t* str, size_t len) noexcept {
21 return {str, len};
22}
23#ifdef MSTL_STANDARD_20__
24MSTL_NODISCARD MSTL_CONSTEXPR20 u8string operator ""_s(const char8_t* str, size_t len) noexcept {
25 return {str, len};
26}
27#endif // MSTL_STANDARD_20__
28MSTL_NODISCARD MSTL_CONSTEXPR20 u16string operator ""_s(const char16_t* str, size_t len) noexcept {
29 return {str, len};
30}
31MSTL_NODISCARD MSTL_CONSTEXPR20 u32string operator ""_s(const char32_t* str, size_t len) noexcept {
32 return {str, len};
33}
35
36
37MSTL_CONSTEXPR20 string escape(const string_view str) {
38 string result;
39 result.reserve(str.length() + str.length() / 4);
40
41 for (const char c : str) {
42 switch (c) {
43 case '\"': {
44 result += "\\\"";
45 break;
46 }
47 case '\'': {
48 result += "\\\'";
49 break;
50 }
51 case '\\': {
52 result += "\\\\";
53 break;
54 }
55 case '\b': {
56 result += "\\b";
57 break;
58 }
59 case '\f': {
60 result += "\\f";
61 break;
62 }
63 case '\n': {
64 result += "\\n";
65 break;
66 }
67 case '\r': {
68 result += "\\r";
69 break;
70 }
71 case '\t': {
72 result += "\\t";
73 break;
74 }
75 case '\v': {
76 result += "\\v";
77 break;
78 }
79 default: {
80 if (static_cast<byte_t>(c) < 0x20) {
81 result += "\\u";
82 constexpr char hex[] = "0123456789abcdef";
83 result += "00";
84 result += hex[(c >> 4) & 0x0F];
85 result += hex[c & 0x0F];
86 } else {
87 result += c;
88 }
89 break;
90 }
91 }
92 }
93 return result;
94}
95
96MSTL_CONSTEXPR20 string escape(const string& str) {
97 return escape(str.view());
98}
99
100MSTL_CONSTEXPR20 string escape(const char* str) {
101 return escape(string_view{str});
102}
103
104
105template <typename CharT>
106MSTL_CONSTEXPR20 bool getline(const basic_string_view<CharT> data, size_t& pos,
107 basic_string<CharT>& str, CharT delim = static_cast<CharT>('\n')) {
108 str.clear();
109 bool has_read = false;
110 while (pos < data.size()) {
111 has_read = true;
112 const CharT c = data[pos++];
113 if (c == delim) break;
114 str.push_back(c);
115 }
116 return has_read;
117}
118
119template <typename CharT>
120MSTL_CONSTEXPR20 bool getline(const basic_string<CharT> data, size_t& pos,
121 basic_string<CharT>& str, CharT delim = static_cast<CharT>('\n')) {
122 str.clear();
123 bool has_read = false;
124 while (pos < data.size()) {
125 has_read = true;
126 const CharT c = data[pos++];
127 if (c == delim) break;
128 str.push_back(c);
129 }
130 return has_read;
131}
132
133template <typename CharT, typename Pred>
134MSTL_CONSTEXPR20 bool getline(const basic_string_view<CharT> data, size_t& pos,
135 basic_string<CharT>& str, Pred split = [](const CharT c) {
136 return c == static_cast<CharT>('\n');
137 }) {
138 str.clear();
139 bool has_read = false;
140 while (pos < data.size()) {
141 has_read = true;
142 const CharT c = data[pos++];
143 if (split(c)) break;
144 str.push_back(c);
145 }
146 return has_read;
147}
148
149template <typename CharT, typename Pred>
150MSTL_CONSTEXPR20 bool getline(const basic_string<CharT> data, size_t& pos,
151 basic_string<CharT>& str, Pred split = [](const CharT c) {
152 return c == static_cast<CharT>('\n');
153 }) {
154 str.clear();
155 bool has_read = false;
156 while (pos < data.size()) {
157 has_read = true;
158 const CharT c = data[pos++];
159 if (split(c)) break;
160 str.push_back(c);
161 }
162 return has_read;
163}
164
165
167#ifdef MSTL_DATA_BUS_WIDTH_64__
168MSTL_INLINE17 constexpr uintptr_t ADDRESS_MASK = 0xF000000000000000ULL;
169MSTL_INLINE17 constexpr int ADDRESS_SHIFT = 60;
170#else
171MSTL_INLINE17 constexpr uintptr_t ADDRESS_MASK = 0xF0000000UL;
172MSTL_INLINE17 constexpr int ADDRESS_SHIFT = 28;
173#endif
175
176MSTL_NODISCARD MSTL_CONSTEXPR20 string address_string(const void* p) {
177 if (p == nullptr) return {"nullptr"};
178
179 const uintptr_t addr_val = reinterpret_cast<uintptr_t>(p);
180 constexpr size_t hex_digit_count = sizeof(void*) * 2;
181 constexpr char hex_digits[] = "0123456789abcdef";
182 uintptr_t mask = _INNER ADDRESS_MASK;
183 int shift = _INNER ADDRESS_SHIFT;
184
185 string result{"0x"};
186 result.reserve(2 + hex_digit_count);
187
188 for (size_t i = 0; i < hex_digit_count; ++i) {
189 const byte_t digit = static_cast<byte_t>((addr_val & mask) >> shift);
190 result += hex_digits[digit];
191 mask >>= 4;
192 shift -= 4;
193 }
194 return result;
195}
196
198#endif // MSTL_STRING_HPP__
unsigned char byte_t
字节类型,定义为无符号字符
#define MSTL_END_LITERALS__
结束literals命名空间
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
#define MSTL_BEGIN_LITERALS__
开始literals命名空间(内联)
uint64_t uintptr_t
可容纳指针的无符号整数类型
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针