16template<
typename String,
typename StringView>
23template<
typename String,
typename StringView>
26 friend class NBT_Reader;
27 friend class NBT_Writer;
28 friend class NBT_Helper;
31 static constexpr typename StringView::size_type CalcStringViewSize(
const typename StringView::value_type *ltrStr,
typename StringView::size_type N)
34 if (N >= 1 && ltrStr[N - 1] == 0x00)
44 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)
57 using StringView::StringView;
60 using StringView::operator=;
79 template<
typename StringView::
size_type N>
80 constexpr NBT_StringView(
const typename StringView::value_type(<rStr)[N]) :StringView(ltrStr, CalcStringViewSize(ltrStr, N))
104 return std::basic_string_view<char>((
const char *)StringView::data(), StringView::size());
109 const StringView &
GetData(
void)
const noexcept
127template<
typename String,
typename StringView>
130 friend class NBT_Reader;
131 friend class NBT_Writer;
132 friend class NBT_Helper;
134 static_assert(
sizeof(char) ==
sizeof(
typename String::value_type),
"Size error");
137 static constexpr typename String::size_type CalcStringSize(
const typename String::value_type *ltrStr,
typename String::size_type N)
140 if (N >= 1 && ltrStr[N - 1] == 0x00)
150 if (N >= 2 && ltrStr[N - 1] == 0x80 && ltrStr[N - 2] == 0xC0)
166 using String::String;
169 using String::operator=;
191 NBT_String(
const std::basic_string<char> &u8CharTypeString, USE_RAW_DATA) :
NBT_String(
std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{})
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{})
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))
229 NBT_String(std::basic_string_view<char> u8CharTypeString, USE_RAW_DATA) :String((typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size())
236 NBT_String(std::basic_string_view<char8_t> u8String, USE_RAW_DATA) :String((typename String::value_type *)u8String.data(), u8String.size())
241 NBT_String(std::basic_string_view<char> u8CharTypeString) :String(
MUTF8_Tool<typename String::value_type, char16_t, char>::U8ToMU8(u8CharTypeString))
246 NBT_String(std::basic_string_view<char8_t> u8String) :String(
MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U8ToMU8(u8String))
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))
258 NBT_String(std::basic_string_view<char16_t> u16String) :String(
MUTF8_Tool<typename String::value_type, char16_t, char8_t>::U16ToMU8(u16String))
267 template<
typename String::
size_type N>
268 NBT_String(
const typename String::value_type(<rStr)[N]) :String(ltrStr, CalcStringSize(ltrStr, N))
287 return View{ *
this };
302 return std::basic_string_view<char>((
const char *)String::data(), String::size());
349 template<
typename =
void>
350 requires(
sizeof(wchar_t) ==
sizeof(char16_t))
380 FromCharTypeUTF8(std::basic_string_view<char>(u8CharTypeString), USE_RAW_DATA{});
386 void FromUTF8(
const std::basic_string<char8_t> &u8String)
388 FromUTF8(std::basic_string_view<char8_t>(u8String));
395 void FromUTF8(
const std::basic_string<char8_t> &u8String, USE_RAW_DATA)
397 FromUTF8(std::basic_string_view<char8_t>(u8String), USE_RAW_DATA{});
403 template<
typename =
void>
404 requires(
sizeof(wchar_t) ==
sizeof(char16_t))
413 void FromUTF16(
const std::basic_string<char16_t> &u16String)
415 FromUTF16(std::basic_string_view<char16_t>(u16String));
434 String::operator=((
typename String::value_type *)u8CharTypeString.data(), u8CharTypeString.size());
440 void FromUTF8(std::basic_string_view<char8_t> u8String)
449 void FromUTF8(std::basic_string_view<char8_t> u8String, USE_RAW_DATA)
451 String::operator=((
typename String::value_type *)u8String.data(), u8String.size());
457 template<
typename =
void>
458 requires(
sizeof(wchar_t) ==
sizeof(char16_t))
467 void FromUTF16(std::basic_string_view<char16_t> u16String)
482 template<
typename String,
typename StringView>
490 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
498 template<
typename String,
typename StringView>
506 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
516 template <
typename T>
517 struct Is_NBT_String : std::false_type
520 template <
typename String,
typename StringView>
521 struct Is_NBT_String<
NBT_String<String, StringView>> : std::true_type
524 template <
typename T>
525 inline constexpr bool Is_NBT_String_V = Is_NBT_String<T>::value;
527 template <
typename T>
528 struct Is_NBT_String_View : std::false_type
531 template <
typename String,
typename StringView>
532 struct Is_NBT_String_View<
NBT_StringView<String, StringView>> : std::true_type
535 template <
typename T>
536 inline constexpr bool Is_NBT_String_View_V = Is_NBT_String_View<T>::value;
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>>;
559 template <
typename T>
561 std::size_t
operator()(
const T &s)
const
563 return std::hash<std::basic_string_view<char>>{}(s.GetCharTypeView());
579 template <
typename TL,
typename TR>
583 std::equality_comparable_with<TL, TR>
585 bool operator()(
const TL &l,
const TR &r)
const
用于格式化打印、序列化、计算哈希等功能
定义 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(<rStr)[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(<rStr)[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