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#ifdef NEFORCE_STANDARD_20
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) { return {str, len}; }
55
62NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 wstring operator""_s(const wchar_t* str, size_t len) { return {str, len}; }
63
64#ifdef NEFORCE_STANDARD_20
71NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u8string operator""_s(const char8_t* str, size_t len) { return {str, len}; }
72#endif
73
80NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u16string operator""_s(const char16_t* str, size_t len) { return {str, len}; }
81
88NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 u32string operator""_s(const char32_t* str, size_t len) { return {str, len}; }
89 // UserLiterals
91
92NEFORCE_END_LITERALS__
93
99
108NEFORCE_CONSTEXPR20 string escape(const string_view str) {
109 string result;
110 result.reserve(str.length() + str.length() / 4);
111
112 for (const char c: str) {
113 switch (c) {
114 case '\"': {
115 result += "\\\"";
116 break;
117 }
118 case '\'': {
119 result += "\\\'";
120 break;
121 }
122 case '\\': {
123 result += "\\\\";
124 break;
125 }
126 case '\b': {
127 result += "\\b";
128 break;
129 }
130 case '\f': {
131 result += "\\f";
132 break;
133 }
134 case '\n': {
135 result += "\\n";
136 break;
137 }
138 case '\r': {
139 result += "\\r";
140 break;
141 }
142 case '\t': {
143 result += "\\t";
144 break;
145 }
146 case '\v': {
147 result += "\\v";
148 break;
149 }
150 default: {
151 if (static_cast<byte_t>(c) < 0x20) {
152 result += "\\u";
153 constexpr char hex[] = "0123456789abcdef";
154 result += "00";
155 result += hex[(c >> 4) & 0x0F];
156 result += hex[c & 0x0F];
157 } else {
158 result += c;
159 }
160 break;
161 }
162 }
163 }
164 return result;
165}
166
172NEFORCE_CONSTEXPR20 string escape(const string& str) { return escape(str.view()); }
173
179NEFORCE_CONSTEXPR20 string escape(const char* str) { return escape(string_view{str}); }
180
194template <typename CharT>
195NEFORCE_CONSTEXPR20 bool getline(const basic_string_view<CharT> data, size_t& pos, basic_string<CharT>& str,
196 CharT delim = static_cast<CharT>('\n')) {
197 str.clear();
198 bool has_read = false;
199 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
200 while (pos < data.size()) {
201 has_read = true;
202 const CharT c = data[pos++];
203 if (c == delim) {
204 break;
205 }
206 str.push_back(c);
207 }
208 return has_read;
209}
210
220template <typename CharT>
221NEFORCE_CONSTEXPR20 bool getline(const basic_string<CharT>& data, size_t& pos, basic_string<CharT>& str,
222 CharT delim = static_cast<CharT>('\n')) {
223 str.clear();
224 bool has_read = false;
225 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
226 while (pos < data.size()) {
227 has_read = true;
228 const CharT c = data[pos++];
229 if (c == delim) {
230 break;
231 }
232 str.push_back(c);
233 }
234 return has_read;
235}
236
249template <typename CharT, typename Pred>
250NEFORCE_CONSTEXPR20 bool getline(
251 const basic_string_view<CharT> data, size_t& pos, basic_string<CharT>& str,
252 Pred split = [](const CharT c) { return c == static_cast<CharT>('\n'); }) {
253 str.clear();
254 bool has_read = false;
255 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
256 while (pos < data.size()) {
257 has_read = true;
258 const CharT c = data[pos++];
259 if (split(c)) {
260 break;
261 }
262 str.push_back(c);
263 }
264 return has_read;
265}
266
277template <typename CharT, typename Pred>
278NEFORCE_CONSTEXPR20 bool getline(
279 const basic_string<CharT>& data, size_t& pos, basic_string<CharT>& str,
280 Pred split = [](const CharT c) { return c == static_cast<CharT>('\n'); }) {
281 str.clear();
282 bool has_read = false;
283 // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
284 while (pos < data.size()) {
285 has_read = true;
286 const CharT c = data[pos++];
287 if (split(c)) {
288 break;
289 }
290 str.push_back(c);
291 }
292 return has_read;
293}
294
304NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string address_string(const void* p) {
305 if (p == nullptr) {
306 return {"nullptr"};
307 }
308
309#ifdef NEFORCE_ARCH_BITS_64
310 constexpr uintptr_t address_mask = 0xF000000000000000ULL;
311 constexpr int address_shift = 60;
312#else
313 constexpr uintptr_t address_mask = 0xF0000000UL;
314 constexpr int address_shift = 28;
315#endif
316 constexpr char hex_digits[] = "0123456789abcdef";
317 constexpr size_t hex_digit_count = sizeof(void*) * 2;
318
319 const auto addr_val = reinterpret_cast<uintptr_t>(p);
320 uintptr_t mask = address_mask;
321 int shift = address_shift;
322
323 string result{"0x"};
324 result.reserve(2 + hex_digit_count);
325
326 for (size_t i = 0; i < hex_digit_count; ++i) {
327 const auto digit = static_cast<byte_t>((addr_val & mask) >> shift);
328 result += hex_digits[digit];
329 mask >>= 4;
330 shift -= 4;
331 }
332 return result;
333}
334 // String
336
337NEFORCE_END_NAMESPACE__
338#endif // NEFORCE_CORE_STRING_STRING_HPP__
动态字符串容器
基本字符串视图模板
constexpr size_type length() const noexcept
获取字符串长度
基础字符串模板
constexpr void push_back(value_type value)
在末尾插入字符
constexpr void clear() noexcept
清空字符串
constexpr void reserve(const size_type n)
预留容量
constexpr view_type view() const noexcept
获取字符串视图
unsigned char byte_t
字节类型,定义为无符号字符
uint64_t uintptr_t
可容纳指针的无符号整数类型
basic_string< char16_t > u16string
UTF-16字符串
constexpr bool getline(const basic_string_view< CharT > data, size_t &pos, basic_string< CharT > &str, CharT delim=static_cast< CharT >('\n'))
从字符串视图中按分隔符读取一行(字符版本)
basic_string< char > string
字符字符串
constexpr string escape(const string_view str)
转义字符串视图中的特殊字符
basic_string< char8_t > u8string
UTF-8字符串
basic_string< wchar_t > wstring
宽字符字符串
basic_string< char32_t > u32string
UTF-32字符串
constexpr string address_string(const void *p)
将指针转换为十六进制地址字符串
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针