chenjunfu2-nbt-cpp v2.1.5
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_String.hpp
浏览该文件的文档.
1#pragma once
2
3#include <string>
4#include <array>
5
6#include "MUTF8_Tool.hpp"
7
10
11class NBT_Reader;
12class NBT_Writer;
13class NBT_Helper;
14
15template<typename String, typename StringView>
16class NBT_String;
17
22template<typename String, typename StringView>
23class NBT_StringView : public StringView
24{
25 friend class NBT_Reader;
26 friend class NBT_Writer;
27 friend class NBT_Helper;
28
29private:
30 static constexpr typename StringView::size_type CalcStringViewSize(const typename StringView::value_type *ltrStr, typename StringView::size_type N)
31 {
32 //c string - 0x00
33 if (N >= 1 && ltrStr[N - 1] == 0x00)
34 {
35 N -= 1;
36 }
37
38 //注意这里不返回,仍然要判断是否是mu8str
39 //因为一个c风格字符串仍然可以以mu8str形式初始化
40 //导致既包含末尾0也包含mu8结尾
41
42 //mutf8 string - 0xC0 0x80
43 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
44 {
45 N -= 2;
46 }
47
48 return N;
49 }
50
51public:
53 using Super = StringView;
54
56 using StringView::StringView;
57
59 using StringView::operator=;
60
63 constexpr NBT_StringView(const StringView &_Copy) :StringView(_Copy)
64 {}
65
68 constexpr NBT_StringView(StringView &&_Move) : StringView(std::move(_Move))
69 {}
70
78 template<typename StringView::size_type N>//c风格字符串or数组
79 constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N]) :StringView(ltrStr, CalcStringViewSize(ltrStr, N))
80 {}
81
88 constexpr explicit NBT_StringView(const NBT_String<String, StringView> &myString) : StringView(myString.data(), myString.size())
89 {}
90
95
101 std::basic_string_view<char> GetCharTypeView(void) const noexcept
102 {
103 return std::basic_string_view<char>((const char *)StringView::data(), StringView::size());
104 }
105
108 const StringView &GetData(void) const noexcept
109 {
110 return *this;
111 }
112
115 StringView &GetData(void) noexcept
116 {
117 return *this;
118 }
119};
120
121
126template<typename String, typename StringView>
127class NBT_String :public String//暂时不考虑保护继承
128{
129 friend class NBT_Reader;
130 friend class NBT_Writer;
131 friend class NBT_Helper;
132
133 static_assert(sizeof(char) == sizeof(typename String::value_type), "Size error");
134
135private:
136 static constexpr typename String::size_type CalcStringSize(const typename String::value_type *ltrStr, typename String::size_type N)
137 {
138 //c string - 0x00
139 if (N >= 1 && ltrStr[N - 1] == 0x00)
140 {
141 N -= 1;
142 }
143
144 //注意这里不返回,仍然要判断是否是mu8str
145 //因为一个c风格字符串仍然可以以mu8str形式初始化
146 //导致既包含末尾0也包含mu8结尾
147
148 //mutf8 string - 0xC0 0x80
149 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
150 {
151 N -= 2;
152 }
153
154 return N;
155 }
156
157public:
159 using Super = String;
160
163
165 using String::String;
166
168 using String::operator=;
169
172 NBT_String(const String &_Copy) :String(_Copy)
173 {}
174
177 NBT_String(String &&_Move) :String(std::move(_Move))
178 {}
179
182 {};
183
184
185
190 NBT_String(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA) :NBT_String(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{})
191 {}
192
197 NBT_String(const std::basic_string<char8_t> &u8String, USE_RAW_DATA) :NBT_String(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{})
198 {}
199
202 NBT_String(const std::basic_string<char> &u8CharTypeString) : NBT_String(std::basic_string_view<char>(u8CharTypeString))
203 {}
204
207 NBT_String(const std::basic_string<char8_t> &u8String) : NBT_String(std::basic_string_view<char8_t>(u8String))
208 {}
209
212 template<typename = void>
213 requires(sizeof(wchar_t) == sizeof(char16_t))
214 NBT_String(const std::basic_string<wchar_t> &u16WCharTypeString) :NBT_String(std::basic_string_view<wchar_t>(u16WCharTypeString))
215 {}
216
219 NBT_String(const std::basic_string<char16_t> &u16String) :NBT_String(std::basic_string_view<char16_t>(u16String))
220 {}
221
222
223
228 NBT_String(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA) :String((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size())
229 {}
230
235 NBT_String(std::basic_string_view<char8_t> u8String, USE_RAW_DATA) :String((typename String::value_type *)u8String.data(), u8String.size())
236 {}
237
240 NBT_String(std::basic_string_view<char> u8CharTypeString) :String(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString))
241 {}
242
245 NBT_String(std::basic_string_view<char8_t> u8String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U8ToMU8(u8String))
246 {}
247
250 template<typename = void>
251 requires(sizeof(wchar_t) == sizeof(char16_t))
252 NBT_String(std::basic_string_view<wchar_t> u16WCharTypeString) :String(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString))
253 {}
254
257 NBT_String(std::basic_string_view<char16_t> u16String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U16ToMU8(u16String))
258 {}
259
260
261
266 template<typename String::size_type N>
267 NBT_String(const typename String::value_type(&ltrStr)[N]) :String(ltrStr, CalcStringSize(ltrStr, N))
268 {}
269
272 NBT_String(const View &view) :String(view)
273 {}
274
277 NBT_String(const StringView &_View) :String(_View)
278 {}
279
280
281
286 std::basic_string_view<char> GetCharTypeView(void) const noexcept
287 {
288 return std::basic_string_view<char>((const char *)String::data(), String::size());
289 }
290
291
294 const String &GetData(void) const noexcept
295 {
296 return *this;
297 }
298
301 String &GetData(void) noexcept
302 {
303 return *this;
304 }
305
306
311 auto ToCharTypeUTF8(void) const
312 {
314 }
315
323
328 template<typename = void>
329 requires(sizeof(wchar_t) == sizeof(char16_t))
330 auto ToWchartTypeUTF16(void) const
331 {
333 }
334
342
343
344
348 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString)
349 {
350 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString));
351 }
352
357 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA)
358 {
359 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{});
360 }
361
365 void FromUTF8(const std::basic_string<char8_t> &u8String)
366 {
367 FromUTF8(std::basic_string_view<char8_t>(u8String));
368 }
369
374 void FromUTF8(const std::basic_string<char8_t> &u8String, USE_RAW_DATA)
375 {
376 FromUTF8(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{});
377 }
378
382 template<typename = void>
383 requires(sizeof(wchar_t) == sizeof(char16_t))
384 void FromWchartTypeUTF16(const std::basic_string<wchar_t> &u16WCharTypeString)
385 {
386 FromWchartTypeUTF16(std::basic_string_view<wchar_t>(u16WCharTypeString));
387 }
388
392 void FromUTF16(const std::basic_string<char16_t> &u16String)
393 {
394 FromUTF16(std::basic_string_view<char16_t>(u16String));
395 }
396
397
398
402 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString)
403 {
404 String::operator=(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString));//char8_t改为char
405 }
406
411 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA)
412 {
413 String::operator=((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size());
414 }
415
419 void FromUTF8(std::basic_string_view<char8_t> u8String)
420 {
422 }
423
428 void FromUTF8(std::basic_string_view<char8_t> u8String, USE_RAW_DATA)
429 {
430 String::operator=((typename String::value_type *)u8String.data(), u8String.size());
431 }
432
436 template<typename = void>
437 requires(sizeof(wchar_t) == sizeof(char16_t))
438 void FromWchartTypeUTF16(std::basic_string_view<wchar_t> u16WCharTypeString)
439 {
440 String::operator=(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString));//char16_t改为wchar_t
441 }
442
446 void FromUTF16(std::basic_string_view<char16_t> u16String)
447 {
449 }
450};
451
452
455namespace std
456{
461 template<typename String, typename StringView>
462 struct hash<NBT_String<String, StringView>>
463 {
467 size_t operator()(const NBT_String<String, StringView> &s) const noexcept
468 {
469 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
470 }
471 };
472
477 template<typename String, typename StringView>
478 struct hash<NBT_StringView<String, StringView>>
479 {
483 size_t operator()(const NBT_StringView<String, StringView> &s) const noexcept
484 {
485 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
486 }
487 };
488}
Java Modified-UTF-8工具集
用于处理Java的Modified-UTF-8(以下简称M-UTF-8)字符串与UTF-8或UTF-16的静态或动态转换
定义 MUTF8_Tool.hpp:261
static std::basic_string< U16T > MU8ToU16(const MU8_String_View &mu8String, size_t szReserve=0)
获取M-UTF-8转换到UTF-16的字符串
定义 MUTF8_Tool.hpp:1216
static MU8_String U8ToMU8(const std::basic_string_view< U8T > &u8String, size_t szReserve=0)
获取UTF-8转换到M-UTF-8的字符串
定义 MUTF8_Tool.hpp:1154
static MU8_String U16ToMU8(const std::basic_string_view< U16T > &u16String, size_t szReserve=0)
获取UTF-16转换到M-UTF-8的字符串
定义 MUTF8_Tool.hpp:1093
static std::basic_string< U8T > MU8ToU8(const MU8_String_View &mu8String, size_t szReserve=0)
获取M-UTF-8转换到UTF-8的字符串
定义 MUTF8_Tool.hpp:1258
用于格式化打印、序列化、计算哈希等功能
定义 NBT_Helper.hpp:25
这个类用于提供从NBT二进制流读取到NBT_Type::Compound对象的反序列化功能
定义 NBT_Reader.hpp:23
继承自标准库std::basic_string_view的代理类,用来提供Modified-UTF-8 String的视图类型
定义 NBT_String.hpp:24
StringView & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_String.hpp:115
StringView Super
父类类型
定义 NBT_String.hpp:53
const StringView & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_String.hpp:108
constexpr NBT_StringView(const NBT_String< String, StringView > &myString)
通过对应的NBT_String,也就是NBT_Type::String显示初始化为视图View
定义 NBT_String.hpp:88
constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:79
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接获取char类型的视图
定义 NBT_String.hpp:101
constexpr NBT_StringView(const StringView &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:63
NBT_StringView(NBT_String< String, StringView > &&_Temp)=delete
删除临时对象构造方式,防止从临时对象构造导致悬空指针
constexpr NBT_StringView(StringView &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:68
继承自标准库std::basic_string的代理类,用于存储、处理与转换Modified-UTF-8字符串
定义 NBT_String.hpp:128
NBT_String(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:197
NBT_StringView< String, StringView > View
当前String对应的视图View类型
定义 NBT_String.hpp:162
NBT_String(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:228
auto ToUTF16(void) const
转换到UTF-16字符编码
定义 NBT_String.hpp:338
NBT_String(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:214
void FromUTF16(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:446
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:348
void FromUTF8(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:374
NBT_String(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:219
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:411
NBT_String(String &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:177
NBT_String(const String &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:172
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从 char 类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:357
NBT_String(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:245
NBT_String(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:190
NBT_String(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:202
auto ToUTF8(void) const
转换到UTF-8字符编码
定义 NBT_String.hpp:319
void FromUTF16(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:392
NBT_String(const typename String::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:267
auto ToWchartTypeUTF16(void) const
转换到UTF-16字符编码,但是返回为wchar_t类型而非char16_t类型
定义 NBT_String.hpp:330
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接从当前对象获取char类型的视图
定义 NBT_String.hpp:286
void FromWchartTypeUTF16(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:384
NBT_String(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:240
NBT_String(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:257
String Super
父类类型
定义 NBT_String.hpp:159
void FromUTF8(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:428
NBT_String(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:252
const String & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_String.hpp:294
NBT_String(const View &view)
从对应的视图类型View中构造String
定义 NBT_String.hpp:272
NBT_String(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:235
NBT_String(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:207
String & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_String.hpp:301
NBT_String(const StringView &_View)
从对应的视图类型View的父类构造String
定义 NBT_String.hpp:277
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:402
auto ToCharTypeUTF8(void) const
转换到UTF-8字符编码,但是返回为char类型而非char8_t类型
定义 NBT_String.hpp:311
void FromWchartTypeUTF16(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:438
void FromUTF8(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:365
void FromUTF8(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:419
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:23
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:456
用于重载匹配的标签类型,指示直接使用原始值而非自动转换
定义 NBT_String.hpp:182
size_t operator()(const NBT_StringView< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:483
size_t operator()(const NBT_String< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:467