NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
string.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_STRING_HPP__
2#define NEFORCE_CORE_STRING_STRING_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
23
26
27#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
30#endif
31
34
37 // String
39
40NEFORCE_BEGIN_LITERALS__
41
47
54NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string operator""_s(const char* str, size_t len) noexcept { return {str, len}; }
55
62NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 wstring operator""_s(const wchar_t* str, size_t len) noexcept {
63 return {str, len};
64}
65
66#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
73NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u8string operator""_s(const char8_t* str, size_t len) noexcept {
74 return {str, len};
75}
76#endif // NEFORCE_STANDARD_20
77
84NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u16string operator""_s(const char16_t* str, size_t len) noexcept {
85 return {str, len};
86}
87
94NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u32string operator""_s(const char32_t* str, size_t len) noexcept {
95 return {str, len};
96}
97 // UserLiterals
99
100NEFORCE_END_LITERALS__
101
107
116NEFORCE_CONSTEXPR20 string escape(const string_view str) {
117 string result;
118 result.reserve(str.length() + str.length() / 4);
119
120 for (const char c: str) {
121 switch (c) {
122 case '\"': {
123 result += "\\\"";
124 break;
125 }
126 case '\'': {
127 result += "\\\'";
128 break;
129 }
130 case '\\': {
131 result += "\\\\";
132 break;
133 }
134 case '\b': {
135 result += "\\b";
136 break;
137 }
138 case '\f': {
139 result += "\\f";
140 break;
141 }
142 case '\n': {
143 result += "\\n";
144 break;
145 }
146 case '\r': {
147 result += "\\r";
148 break;
149 }
150 case '\t': {
151 result += "\\t";
152 break;
153 }
154 case '\v': {
155 result += "\\v";
156 break;
157 }
158 default: {
159 if (static_cast<byte_t>(c) < 0x20) {
160 result += "\\u";
161 constexpr char hex[] = "0123456789abcdef";
162 result += "00";
163 result += hex[(c >> 4) & 0x0F];
164 result += hex[c & 0x0F];
165 } else {
166 result += c;
167 }
168 break;
169 }
170 }
171 }
172 return result;
173}
174
180NEFORCE_CONSTEXPR20 string escape(const string& str) { return escape(str.view()); }
181
187NEFORCE_CONSTEXPR20 string escape(const char* str) { return escape(string_view{str}); }
188
202template <typename CharT>
203NEFORCE_CONSTEXPR20 bool getline(const basic_string_view<CharT> data, size_t& pos, basic_string<CharT>& str,
204 CharT delim = static_cast<CharT>('\n')) {
205 str.clear();
206 bool has_read = false;
207 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
208 while (pos < data.size()) {
209 has_read = true;
210 const CharT c = data[pos++];
211 if (c == delim) {
212 break;
213 }
214 str.push_back(c);
215 }
216 return has_read;
217}
218
228template <typename CharT>
229NEFORCE_CONSTEXPR20 bool getline(const basic_string<CharT>& data, size_t& pos, basic_string<CharT>& str,
230 CharT delim = static_cast<CharT>('\n')) {
231 str.clear();
232 bool has_read = false;
233 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
234 while (pos < data.size()) {
235 has_read = true;
236 const CharT c = data[pos++];
237 if (c == delim) {
238 break;
239 }
240 str.push_back(c);
241 }
242 return has_read;
243}
244
257template <typename CharT, typename Pred>
258NEFORCE_CONSTEXPR20 bool getline(
259 const basic_string_view<CharT> data, size_t& pos, basic_string<CharT>& str,
260 Pred split = [](const CharT c) { return c == static_cast<CharT>('\n'); }) {
261 str.clear();
262 bool has_read = false;
263 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
264 while (pos < data.size()) {
265 has_read = true;
266 const CharT c = data[pos++];
267 if (split(c)) {
268 break;
269 }
270 str.push_back(c);
271 }
272 return has_read;
273}
274
285template <typename CharT, typename Pred>
286NEFORCE_CONSTEXPR20 bool getline(
287 const basic_string<CharT>& data, size_t& pos, basic_string<CharT>& str,
288 Pred split = [](const CharT c) { return c == static_cast<CharT>('\n'); }) {
289 str.clear();
290 bool has_read = false;
291 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
292 while (pos < data.size()) {
293 has_read = true;
294 const CharT c = data[pos++];
295 if (split(c)) {
296 break;
297 }
298 str.push_back(c);
299 }
300 return has_read;
301}
302
312NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string address_string(const void* p) {
313 if (p == nullptr) {
314 return {"nullptr"};
315 }
316
317#ifdef NEFORCE_ARCH_BITS_64
318 constexpr uintptr_t address_mask = 0xF000000000000000ULL;
319 constexpr int address_shift = 60;
320#else
321 constexpr uintptr_t address_mask = 0xF0000000UL;
322 constexpr int address_shift = 28;
323#endif
324 constexpr char hex_digits[] = "0123456789abcdef";
325 constexpr size_t hex_digit_count = sizeof(void*) * 2;
326
327 const uintptr_t addr_val = reinterpret_cast<uintptr_t>(p);
328 uintptr_t mask = address_mask;
329 int shift = address_shift;
330
331 string result{"0x"};
332 result.reserve(2 + hex_digit_count);
333
334 for (size_t i = 0; i < hex_digit_count; ++i) {
335 const byte_t digit = static_cast<byte_t>((addr_val & mask) >> shift);
336 result += hex_digits[digit];
337 mask >>= 4;
338 shift -= 4;
339 }
340 return result;
341}
342 // String
344
345NEFORCE_END_NAMESPACE__
346#endif // NEFORCE_CORE_STRING_STRING_HPP__
动态字符串容器
基本字符串视图模板
NEFORCE_NODISCARD constexpr size_type length() const noexcept
获取字符串长度
基础字符串模板
NEFORCE_CONSTEXPR20 void reserve(const size_type n)
预留容量
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 view_type view() const noexcept
获取字符串视图
NEFORCE_CONSTEXPR20 void push_back(value_type value)
在末尾插入字符
NEFORCE_CONSTEXPR20 void clear() noexcept
清空字符串
unsigned char byte_t
字节类型,定义为无符号字符
uint64_t uintptr_t
可容纳指针的无符号整数类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string address_string(const void *p)
将指针转换为十六进制地址字符串
basic_string< char16_t > u16string
UTF-16字符串
basic_string< char > string
字符字符串
NEFORCE_CONSTEXPR20 bool getline(const basic_string_view< CharT > data, size_t &pos, basic_string< CharT > &str, CharT delim=static_cast< CharT >('\n'))
从字符串视图中按分隔符读取一行(字符版本)
basic_string< char8_t > u8string
UTF-8字符串
basic_string< wchar_t > wstring
宽字符字符串
NEFORCE_CONSTEXPR20 string escape(const string_view str)
转义字符串视图中的特殊字符
basic_string< char32_t > u32string
UTF-32字符串
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针