chenjunfu2-nbt-cpp v2.1.3
一个基于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 StringView::StringView;
54
56 using StringView::operator=;
57
60 constexpr NBT_StringView(const StringView &_Copy) :StringView(_Copy)
61 {}
62
65 constexpr NBT_StringView(StringView &&_Move) : StringView(std::move(_Move))
66 {}
67
75 template<typename StringView::size_type N>//c风格字符串or数组
76 constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N]) :StringView(ltrStr, CalcStringViewSize(ltrStr, N))
77 {}
78
85 constexpr explicit NBT_StringView(const NBT_String<String, StringView> &myString) : StringView(myString.data(), myString.size())
86 {}
87
92
98 std::basic_string_view<char> GetCharTypeView(void) const noexcept
99 {
100 return std::basic_string_view<char>((const char *)StringView::data(), StringView::size());
101 }
102};
103
104
109template<typename String, typename StringView>
110class NBT_String :public String//暂时不考虑保护继承
111{
112 friend class NBT_Reader;
113 friend class NBT_Writer;
114 friend class NBT_Helper;
115
116 static_assert(sizeof(char) == sizeof(typename String::value_type), "Size error");
117
118private:
119 static constexpr typename String::size_type CalcStringSize(const typename String::value_type *ltrStr, typename String::size_type N)
120 {
121 //c string - 0x00
122 if (N >= 1 && ltrStr[N - 1] == 0x00)
123 {
124 N -= 1;
125 }
126
127 //注意这里不返回,仍然要判断是否是mu8str
128 //因为一个c风格字符串仍然可以以mu8str形式初始化
129 //导致既包含末尾0也包含mu8结尾
130
131 //mutf8 string - 0xC0 0x80
132 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
133 {
134 N -= 2;
135 }
136
137 return N;
138 }
139
140public:
143
145 using String::String;
146
148 using String::operator=;
149
152 NBT_String(const String &_Copy) :String(_Copy)
153 {}
154
157 NBT_String(String &&_Move) :String(std::move(_Move))
158 {}
159
162 {};
163
164
165
170 NBT_String(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA) :NBT_String(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{})
171 {}
172
177 NBT_String(const std::basic_string<char8_t> &u8String, USE_RAW_DATA) :NBT_String(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{})
178 {}
179
182 NBT_String(const std::basic_string<char> &u8CharTypeString) : NBT_String(std::basic_string_view<char>(u8CharTypeString))
183 {}
184
187 NBT_String(const std::basic_string<char8_t> &u8String) : NBT_String(std::basic_string_view<char8_t>(u8String))
188 {}
189
192 template<typename = void>
193 requires(sizeof(wchar_t) == sizeof(char16_t))
194 NBT_String(const std::basic_string<wchar_t> &u16WCharTypeString) :NBT_String(std::basic_string_view<wchar_t>(u16WCharTypeString))
195 {}
196
199 NBT_String(const std::basic_string<char16_t> &u16String) :NBT_String(std::basic_string_view<char16_t>(u16String))
200 {}
201
202
203
208 NBT_String(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA) :String((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size())
209 {}
210
215 NBT_String(std::basic_string_view<char8_t> u8String, USE_RAW_DATA) :String((typename String::value_type *)u8String.data(), u8String.size())
216 {}
217
220 NBT_String(std::basic_string_view<char> u8CharTypeString) :String(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString))
221 {}
222
225 NBT_String(std::basic_string_view<char8_t> u8String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U8ToMU8(u8String))
226 {}
227
230 template<typename = void>
231 requires(sizeof(wchar_t) == sizeof(char16_t))
232 NBT_String(std::basic_string_view<wchar_t> u16WCharTypeString) :String(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString))
233 {}
234
237 NBT_String(std::basic_string_view<char16_t> u16String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U16ToMU8(u16String))
238 {}
239
240
241
246 template<typename String::size_type N>
247 NBT_String(const typename String::value_type(&ltrStr)[N]) :String(ltrStr, CalcStringSize(ltrStr, N))
248 {}
249
252 NBT_String(const View &view) :String(view)
253 {}
254
257 NBT_String(const StringView &_View) :String(_View)
258 {}
259
260
261
266 std::basic_string_view<char> GetCharTypeView(void) const noexcept
267 {
268 return std::basic_string_view<char>((const char *)String::data(), String::size());
269 }
270
271
272
277 auto ToCharTypeUTF8(void) const
278 {
280 }
281
289
294 template<typename = void>
295 requires(sizeof(wchar_t) == sizeof(char16_t))
296 auto ToWchartTypeUTF16(void) const
297 {
299 }
300
308
309
310
314 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString)
315 {
316 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString));
317 }
318
323 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA)
324 {
325 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{});
326 }
327
331 void FromUTF8(const std::basic_string<char8_t> &u8String)
332 {
333 FromUTF8(std::basic_string_view<char8_t>(u8String));
334 }
335
340 void FromUTF8(const std::basic_string<char8_t> &u8String, USE_RAW_DATA)
341 {
342 FromUTF8(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{});
343 }
344
348 template<typename = void>
349 requires(sizeof(wchar_t) == sizeof(char16_t))
350 void FromWchartTypeUTF16(const std::basic_string<wchar_t> &u16WCharTypeString)
351 {
352 FromWchartTypeUTF16(std::basic_string_view<wchar_t>(u16WCharTypeString));
353 }
354
358 void FromUTF16(const std::basic_string<char16_t> &u16String)
359 {
360 FromUTF16(std::basic_string_view<char16_t>(u16String));
361 }
362
363
364
368 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString)
369 {
370 String::operator=(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString));//char8_t改为char
371 }
372
377 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA)
378 {
379 String::operator=((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size());
380 }
381
385 void FromUTF8(std::basic_string_view<char8_t> u8String)
386 {
388 }
389
394 void FromUTF8(std::basic_string_view<char8_t> u8String, USE_RAW_DATA)
395 {
396 String::operator=((typename String::value_type *)u8String.data(), u8String.size());
397 }
398
402 template<typename = void>
403 requires(sizeof(wchar_t) == sizeof(char16_t))
404 void FromWchartTypeUTF16(std::basic_string_view<wchar_t> u16WCharTypeString)
405 {
406 String::operator=(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString));//char16_t改为wchar_t
407 }
408
412 void FromUTF16(std::basic_string_view<char16_t> u16String)
413 {
415 }
416};
417
418
421namespace std
422{
427 template<typename String, typename StringView>
428 struct hash<NBT_String<String, StringView>>
429 {
433 size_t operator()(const NBT_String<String, StringView> &s) const noexcept
434 {
435 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
436 }
437 };
438
443 template<typename String, typename StringView>
444 struct hash<NBT_StringView<String, StringView>>
445 {
449 size_t operator()(const NBT_StringView<String, StringView> &s) const noexcept
450 {
451 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
452 }
453 };
454}
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
constexpr NBT_StringView(const NBT_String< String, StringView > &myString)
通过对应的NBT_String,也就是NBT_Type::String显示初始化为视图View
定义 NBT_String.hpp:85
constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:76
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接获取char类型的视图
定义 NBT_String.hpp:98
constexpr NBT_StringView(const StringView &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:60
NBT_StringView(NBT_String< String, StringView > &&_Temp)=delete
删除临时对象构造方式,防止从临时对象构造导致悬空指针
constexpr NBT_StringView(StringView &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:65
继承自标准库std::basic_string的代理类,用于存储、处理与转换Modified-UTF-8字符串
定义 NBT_String.hpp:111
NBT_String(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:177
NBT_StringView< String, StringView > View
当前String对应的视图View类型
定义 NBT_String.hpp:142
NBT_String(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:208
auto ToUTF16(void) const
转换到UTF-16字符编码
定义 NBT_String.hpp:304
NBT_String(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:194
void FromUTF16(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:412
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:314
void FromUTF8(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:340
NBT_String(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:199
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:377
NBT_String(String &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:157
NBT_String(const String &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:152
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从 char 类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:323
NBT_String(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:225
NBT_String(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:170
NBT_String(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:182
auto ToUTF8(void) const
转换到UTF-8字符编码
定义 NBT_String.hpp:285
void FromUTF16(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:358
NBT_String(const typename String::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:247
auto ToWchartTypeUTF16(void) const
转换到UTF-16字符编码,但是返回为wchar_t类型而非char16_t类型
定义 NBT_String.hpp:296
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接从当前对象获取char类型的视图
定义 NBT_String.hpp:266
void FromWchartTypeUTF16(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:350
NBT_String(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:220
NBT_String(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:237
void FromUTF8(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:394
NBT_String(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:232
NBT_String(const View &view)
从对应的视图类型View中构造String
定义 NBT_String.hpp:252
NBT_String(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:215
NBT_String(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:187
NBT_String(const StringView &_View)
从对应的视图类型View的父类构造String
定义 NBT_String.hpp:257
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:368
auto ToCharTypeUTF8(void) const
转换到UTF-8字符编码,但是返回为char类型而非char8_t类型
定义 NBT_String.hpp:277
void FromWchartTypeUTF16(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:404
void FromUTF8(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:331
void FromUTF8(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:385
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:23
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:422
用于重载匹配的标签类型,指示直接使用原始值而非自动转换
定义 NBT_String.hpp:162
size_t operator()(const NBT_StringView< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:449
size_t operator()(const NBT_String< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:433