chenjunfu2-nbt-cpp v2.1.0
一个基于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
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};
106
107
112template<typename String, typename StringView>
113class NBT_String :public String//暂时不考虑保护继承
114{
115 friend class NBT_Reader;
116 friend class NBT_Writer;
117 friend class NBT_Helper;
118
119 static_assert(sizeof(char) == sizeof(typename String::value_type), "Size error");
120
121private:
122 static constexpr typename String::size_type CalcStringSize(const typename String::value_type *ltrStr, typename String::size_type N)
123 {
124 //c string - 0x00
125 if (N >= 1 && ltrStr[N - 1] == 0x00)
126 {
127 N -= 1;
128 }
129
130 //注意这里不返回,仍然要判断是否是mu8str
131 //因为一个c风格字符串仍然可以以mu8str形式初始化
132 //导致既包含末尾0也包含mu8结尾
133
134 //mutf8 string - 0xC0 0x80
135 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
136 {
137 N -= 2;
138 }
139
140 return N;
141 }
142
143public:
146
148 using String::String;
149
151 using String::operator=;
152
154 using String::operator[];
155
158 NBT_String(const String &_Copy) :String(_Copy)
159 {}
160
163 NBT_String(String &&_Move) :String(std::move(_Move))
164 {}
165
168 {};
169
170
171
176 NBT_String(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA) :NBT_String(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{})
177 {}
178
183 NBT_String(const std::basic_string<char8_t> &u8String, USE_RAW_DATA) :NBT_String(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{})
184 {}
185
188 NBT_String(const std::basic_string<char> &u8CharTypeString) : NBT_String(std::basic_string_view<char>(u8CharTypeString))
189 {}
190
193 NBT_String(const std::basic_string<char8_t> &u8String) : NBT_String(std::basic_string_view<char8_t>(u8String))
194 {}
195
198 template<typename = void>
199 requires(sizeof(wchar_t) == sizeof(char16_t))
200 NBT_String(const std::basic_string<wchar_t> &u16WCharTypeString) :NBT_String(std::basic_string_view<wchar_t>(u16WCharTypeString))
201 {}
202
205 NBT_String(const std::basic_string<char16_t> &u16String) :NBT_String(std::basic_string_view<char16_t>(u16String))
206 {}
207
208
209
214 NBT_String(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA) :String((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size())
215 {}
216
221 NBT_String(std::basic_string_view<char8_t> u8String, USE_RAW_DATA) :String((typename String::value_type *)u8String.data(), u8String.size())
222 {}
223
226 NBT_String(std::basic_string_view<char> u8CharTypeString) :String(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString))
227 {}
228
231 NBT_String(std::basic_string_view<char8_t> u8String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U8ToMU8(u8String))
232 {}
233
236 template<typename = void>
237 requires(sizeof(wchar_t) == sizeof(char16_t))
238 NBT_String(std::basic_string_view<wchar_t> u16WCharTypeString) :String(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString))
239 {}
240
243 NBT_String(std::basic_string_view<char16_t> u16String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U16ToMU8(u16String))
244 {}
245
246
247
252 template<typename String::size_type N>
253 NBT_String(const typename String::value_type(&ltrStr)[N]) :String(ltrStr, CalcStringSize(ltrStr, N))
254 {}
255
258 NBT_String(const View &view) :String(view)
259 {}
260
263 NBT_String(const StringView &_View) :String(_View)
264 {}
265
266
267
272 std::basic_string_view<char> GetCharTypeView(void) const noexcept
273 {
274 return std::basic_string_view<char>((const char *)String::data(), String::size());
275 }
276
277
278
283 auto ToCharTypeUTF8(void) const
284 {
286 }
287
295
300 template<typename = void>
301 requires(sizeof(wchar_t) == sizeof(char16_t))
302 auto ToWchartTypeUTF16(void) const
303 {
305 }
306
314
315
316
320 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString)
321 {
322 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString));
323 }
324
329 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA)
330 {
331 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{});
332 }
333
337 void FromUTF8(const std::basic_string<char8_t> &u8String)
338 {
339 FromUTF8(std::basic_string_view<char8_t>(u8String));
340 }
341
346 void FromUTF8(const std::basic_string<char8_t> &u8String, USE_RAW_DATA)
347 {
348 FromUTF8(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{});
349 }
350
354 template<typename = void>
355 requires(sizeof(wchar_t) == sizeof(char16_t))
356 void FromWchartTypeUTF16(const std::basic_string<wchar_t> &u16WCharTypeString)
357 {
358 FromWchartTypeUTF16(std::basic_string_view<wchar_t>(u16WCharTypeString));
359 }
360
364 void FromUTF16(const std::basic_string<char16_t> &u16String)
365 {
366 FromUTF16(std::basic_string_view<char16_t>(u16String));
367 }
368
369
370
374 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString)
375 {
376 String::operator=(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString));//char8_t改为char
377 }
378
383 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA)
384 {
385 String::operator=((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size());
386 }
387
391 void FromUTF8(std::basic_string_view<char8_t> u8String)
392 {
394 }
395
400 void FromUTF8(std::basic_string_view<char8_t> u8String, USE_RAW_DATA)
401 {
402 String::operator=((typename String::value_type *)u8String.data(), u8String.size());
403 }
404
408 template<typename = void>
409 requires(sizeof(wchar_t) == sizeof(char16_t))
410 void FromWchartTypeUTF16(std::basic_string_view<wchar_t> u16WCharTypeString)
411 {
412 String::operator=(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString));//char16_t改为wchar_t
413 }
414
418 void FromUTF16(std::basic_string_view<char16_t> u16String)
419 {
421 }
422};
423
424
427namespace std
428{
433 template<typename String, typename StringView>
434 struct hash<NBT_String<String, StringView>>
435 {
439 size_t operator()(const NBT_String<String, StringView> &s) const noexcept
440 {
441 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
442 }
443 };
444
449 template<typename String, typename StringView>
450 struct hash<NBT_StringView<String, StringView>>
451 {
455 size_t operator()(const NBT_StringView<String, StringView> &s) const noexcept
456 {
457 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
458 }
459 };
460}
Java Modified-UTF-8工具集
用于处理Java的Modified-UTF-8(以下简称M-UTF-8)字符串与UTF-8或UTF-16的静态或动态转换
定义 MUTF8_Tool.hpp:64
static std::basic_string< MU8T > U8ToMU8(const std::basic_string_view< U8T > &u8String, size_t szReserve=0)
获取UTF-8转换到M-UTF-8的字符串
定义 MUTF8_Tool.hpp:952
static std::basic_string< U8T > MU8ToU8(const std::basic_string_view< MU8T > &mu8String, size_t szReserve=0)
获取M-UTF-8转换到UTF-8的字符串
定义 MUTF8_Tool.hpp:1056
static std::basic_string< U16T > MU8ToU16(const std::basic_string_view< MU8T > &mu8String, size_t szReserve=0)
获取M-UTF-8转换到UTF-16的字符串
定义 MUTF8_Tool.hpp:1014
static std::basic_string< MU8T > U16ToMU8(const std::basic_string_view< U16T > &u16String, size_t szReserve=0)
获取UTF-16转换到M-UTF-8的字符串
定义 MUTF8_Tool.hpp:891
用于格式化打印、序列化、计算哈希等功能
定义 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: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:114
NBT_String(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:183
NBT_StringView< String, StringView > View
当前String对应的视图View类型
定义 NBT_String.hpp:145
NBT_String(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:214
void FromWchartTypeUTF16(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:410
NBT_String(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:200
auto ToUTF16(void) const
转换到UTF-16字符编码
定义 NBT_String.hpp:310
void FromUTF16(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:418
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:320
void FromUTF8(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:346
NBT_String(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:205
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:383
NBT_String(String &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:163
NBT_String(const String &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:158
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从 char 类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:329
NBT_String(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:231
NBT_String(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:176
NBT_String(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:188
void FromWchartTypeUTF16(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:356
auto ToUTF8(void) const
转换到UTF-8字符编码
定义 NBT_String.hpp:291
void FromUTF16(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:364
NBT_String(const typename String::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:253
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接从当前对象获取char类型的视图
定义 NBT_String.hpp:272
NBT_String(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:226
NBT_String(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:243
void FromUTF8(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:400
NBT_String(const View &view)
从对应的视图类型View中构造String
定义 NBT_String.hpp:258
NBT_String(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:221
NBT_String(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:193
NBT_String(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:238
NBT_String(const StringView &_View)
从对应的视图类型View的父类构造String
定义 NBT_String.hpp:263
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:374
auto ToCharTypeUTF8(void) const
转换到UTF-8字符编码,但是返回为char类型而非char8_t类型
定义 NBT_String.hpp:283
void FromUTF8(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:337
void FromUTF8(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:391
auto ToWchartTypeUTF16(void) const
转换到UTF-16字符编码,但是返回为wchar_t类型而非char16_t类型
定义 NBT_String.hpp:302
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:22
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:428
用于重载匹配的标签类型,指示直接使用原始值而非自动转换
定义 NBT_String.hpp:168
size_t operator()(const NBT_StringView< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:455
size_t operator()(const NBT_String< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:439