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#include <concepts>
6
7#include "MUTF8_Tool.hpp"
8
11
12class NBT_Reader;
13class NBT_Writer;
14class NBT_Helper;
15
16template<typename String, typename StringView>
17class NBT_String;
18
23template<typename String, typename StringView>
24class NBT_StringView : public StringView
25{
26 friend class NBT_Reader;
27 friend class NBT_Writer;
28 friend class NBT_Helper;
29
30private:
31 static constexpr typename StringView::size_type CalcStringViewSize(const typename StringView::value_type *ltrStr, typename StringView::size_type N)
32 {
33 //c string - 0x00
34 if (N >= 1 && ltrStr[N - 1] == 0x00)
35 {
36 N -= 1;
37 }
38
39 //注意这里不返回,仍然要判断是否是mu8str
40 //因为一个c风格字符串仍然可以以mu8str形式初始化
41 //导致既包含末尾0也包含mu8结尾
42
43 //mutf8 string - 0xC0 0x80
44 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
45 {
46 N -= 2;
47 }
48
49 return N;
50 }
51
52public:
54 using Super = StringView;
55
57 using StringView::StringView;
58
60 using StringView::operator=;
61
64 constexpr NBT_StringView(const StringView &_Copy) :StringView(_Copy)
65 {}
66
69 constexpr NBT_StringView(StringView &&_Move) : StringView(std::move(_Move))
70 {}
71
79 template<typename StringView::size_type N>//c风格字符串or数组
80 constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N]) :StringView(ltrStr, CalcStringViewSize(ltrStr, N))
81 {}
82
89 constexpr explicit NBT_StringView(const NBT_String<String, StringView> &myString) : StringView(myString.data(), myString.size())
90 {}
91
96
102 std::basic_string_view<char> GetCharTypeView(void) const noexcept
103 {
104 return std::basic_string_view<char>((const char *)StringView::data(), StringView::size());
105 }
106
109 const StringView &GetData(void) const noexcept
110 {
111 return *this;
112 }
113
116 StringView &GetData(void) noexcept
117 {
118 return *this;
119 }
120};
121
122
127template<typename String, typename StringView>
128class NBT_String :public String//暂时不考虑保护继承
129{
130 friend class NBT_Reader;
131 friend class NBT_Writer;
132 friend class NBT_Helper;
133
134 static_assert(sizeof(char) == sizeof(typename String::value_type), "Size error");
135
136private:
137 static constexpr typename String::size_type CalcStringSize(const typename String::value_type *ltrStr, typename String::size_type N)
138 {
139 //c string - 0x00
140 if (N >= 1 && ltrStr[N - 1] == 0x00)
141 {
142 N -= 1;
143 }
144
145 //注意这里不返回,仍然要判断是否是mu8str
146 //因为一个c风格字符串仍然可以以mu8str形式初始化
147 //导致既包含末尾0也包含mu8结尾
148
149 //mutf8 string - 0xC0 0x80
150 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)//这里仍然用N,因为前面可能已经递减,这样就能正确访问
151 {
152 N -= 2;
153 }
154
155 return N;
156 }
157
158public:
160 using Super = String;
161
164
166 using String::String;
167
169 using String::operator=;
170
173 NBT_String(const String &_Copy) :String(_Copy)
174 {}
175
178 NBT_String(String &&_Move) :String(std::move(_Move))
179 {}
180
183 {};
184
185
186
191 NBT_String(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA) :NBT_String(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{})
192 {}
193
198 NBT_String(const std::basic_string<char8_t> &u8String, USE_RAW_DATA) :NBT_String(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{})
199 {}
200
203 NBT_String(const std::basic_string<char> &u8CharTypeString) : NBT_String(std::basic_string_view<char>(u8CharTypeString))
204 {}
205
208 NBT_String(const std::basic_string<char8_t> &u8String) : NBT_String(std::basic_string_view<char8_t>(u8String))
209 {}
210
213 template<typename = void>
214 requires(sizeof(wchar_t) == sizeof(char16_t))
215 NBT_String(const std::basic_string<wchar_t> &u16WCharTypeString) :NBT_String(std::basic_string_view<wchar_t>(u16WCharTypeString))
216 {}
217
220 NBT_String(const std::basic_string<char16_t> &u16String) :NBT_String(std::basic_string_view<char16_t>(u16String))
221 {}
222
223
224
229 NBT_String(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA) :String((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size())
230 {}
231
236 NBT_String(std::basic_string_view<char8_t> u8String, USE_RAW_DATA) :String((typename String::value_type *)u8String.data(), u8String.size())
237 {}
238
241 NBT_String(std::basic_string_view<char> u8CharTypeString) :String(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString))
242 {}
243
246 NBT_String(std::basic_string_view<char8_t> u8String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U8ToMU8(u8String))
247 {}
248
251 template<typename = void>
252 requires(sizeof(wchar_t) == sizeof(char16_t))
253 NBT_String(std::basic_string_view<wchar_t> u16WCharTypeString) :String(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString))
254 {}
255
258 NBT_String(std::basic_string_view<char16_t> u16String) :String(MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U16ToMU8(u16String))
259 {}
260
261
262
267 template<typename String::size_type N>
268 NBT_String(const typename String::value_type(&ltrStr)[N]) :String(ltrStr, CalcStringSize(ltrStr, N))
269 {}
270
273 NBT_String(const View &view) :String(view)
274 {}
275
278 NBT_String(const StringView &_View) :String(_View)
279 {}
280
281
285 View GetView(void) const & noexcept
286 {
287 return View{ *this };
288 }
289
293 View GetView(void) const &&noexcept = delete;
294
295
300 std::basic_string_view<char> GetCharTypeView(void) const & noexcept
301 {
302 return std::basic_string_view<char>((const char *)String::data(), String::size());
303 }
304
308 std::basic_string_view<char> GetCharTypeView(void) const &&noexcept = delete;
309
310
311
314 const String &GetData(void) const noexcept
315 {
316 return *this;
317 }
318
321 String &GetData(void) noexcept
322 {
323 return *this;
324 }
325
326
327
332 auto ToCharTypeUTF8(void) const
333 {
335 }
336
344
349 template<typename = void>
350 requires(sizeof(wchar_t) == sizeof(char16_t))
351 auto ToWchartTypeUTF16(void) const
352 {
354 }
355
363
364
365
369 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString)
370 {
371 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString));
372 }
373
378 void FromCharTypeUTF8(const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA)
379 {
380 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{});
381 }
382
386 void FromUTF8(const std::basic_string<char8_t> &u8String)
387 {
388 FromUTF8(std::basic_string_view<char8_t>(u8String));
389 }
390
395 void FromUTF8(const std::basic_string<char8_t> &u8String, USE_RAW_DATA)
396 {
397 FromUTF8(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{});
398 }
399
403 template<typename = void>
404 requires(sizeof(wchar_t) == sizeof(char16_t))
405 void FromWchartTypeUTF16(const std::basic_string<wchar_t> &u16WCharTypeString)
406 {
407 FromWchartTypeUTF16(std::basic_string_view<wchar_t>(u16WCharTypeString));
408 }
409
413 void FromUTF16(const std::basic_string<char16_t> &u16String)
414 {
415 FromUTF16(std::basic_string_view<char16_t>(u16String));
416 }
417
418
419
423 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString)
424 {
425 String::operator=(MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString));//char8_t改为char
426 }
427
432 void FromCharTypeUTF8(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA)
433 {
434 String::operator=((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size());
435 }
436
440 void FromUTF8(std::basic_string_view<char8_t> u8String)
441 {
443 }
444
449 void FromUTF8(std::basic_string_view<char8_t> u8String, USE_RAW_DATA)
450 {
451 String::operator=((typename String::value_type *)u8String.data(), u8String.size());
452 }
453
457 template<typename = void>
458 requires(sizeof(wchar_t) == sizeof(char16_t))
459 void FromWchartTypeUTF16(std::basic_string_view<wchar_t> u16WCharTypeString)
460 {
461 String::operator=(MUTF8_Tool<typename String::value_type, wchar_t, char8_t>::U16ToMU8(u16WCharTypeString));//char16_t改为wchar_t
462 }
463
467 void FromUTF16(std::basic_string_view<char16_t> u16String)
468 {
470 }
471};
472
473
476namespace std
477{
482 template<typename String, typename StringView>
483 struct hash<NBT_String<String, StringView>>
484 {
488 size_t operator()(const NBT_String<String, StringView> &s) const noexcept
489 {
490 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
491 }
492 };
493
498 template<typename String, typename StringView>
499 struct hash<NBT_StringView<String, StringView>>
500 {
504 size_t operator()(const NBT_StringView<String, StringView> &s) const noexcept
505 {
506 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
507 }
508 };
509}
510
513{
515
516 template <typename T>
517 struct Is_NBT_String : std::false_type
518 {};
519
520 template <typename String, typename StringView>
521 struct Is_NBT_String<NBT_String<String, StringView>> : std::true_type
522 {};
523
524 template <typename T>
525 inline constexpr bool Is_NBT_String_V = Is_NBT_String<T>::value;
526
527 template <typename T>
528 struct Is_NBT_String_View : std::false_type
529 {};
530
531 template <typename String, typename StringView>
532 struct Is_NBT_String_View<NBT_StringView<String, StringView>> : std::true_type
533 {};
534
535 template <typename T>
536 inline constexpr bool Is_NBT_String_View_V = Is_NBT_String_View<T>::value;
537
539
543 template <typename T>
545 Is_NBT_String_V<std::remove_cvref_t<T>> ||
546 Is_NBT_String_View_V<std::remove_cvref_t<T>>;
547};
548
551{
553 using is_transparent = void;
554
559 template <typename T>
561 std::size_t operator()(const T &s) const
562 {
563 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
564 }
565};
566
569{
571 using is_transparent = void;
572
579 template <typename TL, typename TR>
580 requires (
583 std::equality_comparable_with<TL, TR>
584 )
585 bool operator()(const TL &l, const TR &r) const
586 {
587 return l == r;
588 }
589};
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:25
StringView & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_String.hpp:116
StringView Super
父类类型
定义 NBT_String.hpp:54
const StringView & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_String.hpp:109
constexpr NBT_StringView(const NBT_String< String, StringView > &myString)
通过对应的NBT_String,也就是NBT_Type::String显示初始化为视图View
定义 NBT_String.hpp:89
constexpr NBT_StringView(const typename StringView::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:80
std::basic_string_view< char > GetCharTypeView(void) const noexcept
直接获取char类型的视图
定义 NBT_String.hpp:102
constexpr NBT_StringView(const StringView &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:64
NBT_StringView(NBT_String< String, StringView > &&_Temp)=delete
删除临时对象构造方式,防止从临时对象构造导致悬空指针
constexpr NBT_StringView(StringView &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:69
继承自标准库std::basic_string的代理类,用于存储、处理与转换Modified-UTF-8字符串
定义 NBT_String.hpp:129
NBT_String(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:198
NBT_StringView< String, StringView > View
当前String对应的视图View类型
定义 NBT_String.hpp:163
NBT_String(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:229
auto ToUTF16(void) const
转换到UTF-16字符编码
定义 NBT_String.hpp:359
NBT_String(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:215
void FromUTF16(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:467
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:369
void FromUTF8(const std::basic_string< char8_t > &u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:395
NBT_String(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串构造NBT_String对象
定义 NBT_String.hpp:220
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:432
NBT_String(String &&_Move)
提供从父类移动构造此类的途径
定义 NBT_String.hpp:178
NBT_String(const String &_Copy)
提供从父类拷贝构造此类的途径
定义 NBT_String.hpp:173
void FromCharTypeUTF8(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从 char 类型的UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:378
NBT_String(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:246
NBT_String(const std::basic_string< char > &u8CharTypeString, USE_RAW_DATA)
从char类型的UTF-8编码字符串直接构造NBT_String对象
定义 NBT_String.hpp:191
NBT_String(const std::basic_string< char > &u8CharTypeString)
从char类型的UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:203
auto ToUTF8(void) const
转换到UTF-8字符编码
定义 NBT_String.hpp:340
void FromUTF16(const std::basic_string< char16_t > &u16String)
从UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:413
View GetView(void) const &noexcept
直接从当前对象获取视图
定义 NBT_String.hpp:285
NBT_String(const typename String::value_type(&ltrStr)[N])
通过c风格字符串或字符数组初始化
定义 NBT_String.hpp:268
auto ToWchartTypeUTF16(void) const
转换到UTF-16字符编码,但是返回为wchar_t类型而非char16_t类型
定义 NBT_String.hpp:351
void FromWchartTypeUTF16(const std::basic_string< wchar_t > &u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:405
View GetView(void) const &&noexcept=delete
删除临时对象转化为视图的方式,防止从临时对象构造导致悬空指针
NBT_String(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:241
NBT_String(std::basic_string_view< char16_t > u16String)
从UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:258
String Super
父类类型
定义 NBT_String.hpp:160
void FromUTF8(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串直接替换当前对象内容
定义 NBT_String.hpp:449
NBT_String(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串视图构造NBT_String对象
定义 NBT_String.hpp:253
const String & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_String.hpp:314
NBT_String(const View &view)
从对应的视图类型View中构造String
定义 NBT_String.hpp:273
NBT_String(std::basic_string_view< char8_t > u8String, USE_RAW_DATA)
从UTF-8编码字符串视图直接构造NBT_String对象
定义 NBT_String.hpp:236
NBT_String(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串构造NBT_String对象
定义 NBT_String.hpp:208
String & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_String.hpp:321
NBT_String(const StringView &_View)
从对应的视图类型View的父类构造String
定义 NBT_String.hpp:278
void FromCharTypeUTF8(std::basic_string_view< char > u8CharTypeString)
从char类型的UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:423
std::basic_string_view< char > GetCharTypeView(void) const &noexcept
直接从当前对象获取char类型的视图
定义 NBT_String.hpp:300
auto ToCharTypeUTF8(void) const
转换到UTF-8字符编码,但是返回为char类型而非char8_t类型
定义 NBT_String.hpp:332
std::basic_string_view< char > GetCharTypeView(void) const &&noexcept=delete
删除临时对象转化为char类型视图的方式,防止从临时对象构造导致悬空指针
void FromWchartTypeUTF16(std::basic_string_view< wchar_t > u16WCharTypeString)
从wchar_t类型的UTF-16编码字符串替换当前对象内容
定义 NBT_String.hpp:459
void FromUTF8(const std::basic_string< char8_t > &u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:386
void FromUTF8(std::basic_string_view< char8_t > u8String)
从UTF-8编码字符串替换当前对象内容
定义 NBT_String.hpp:440
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:23
约束类型 T 去除 cv-ref 限定后必须是 NBT_String 或其对应的 View
定义 NBT_String.hpp:544
内部命名空间,提供概念约束
定义 NBT_String.hpp:513
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:477
用于重载匹配的标签类型,指示直接使用原始值而非自动转换
定义 NBT_String.hpp:183
透明相等比较函数对象,用于 unordered 容器的异构查找
定义 NBT_String.hpp:569
void is_transparent
透明比较标记
定义 NBT_String.hpp:571
透明哈希函数对象,用于 unordered 容器的异构查找
定义 NBT_String.hpp:551
void is_transparent
透明哈希标记
定义 NBT_String.hpp:553
size_t operator()(const NBT_StringView< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:504
size_t operator()(const NBT_String< String, StringView > &s) const noexcept
仿函数调用运算符
定义 NBT_String.hpp:488