chenjunfu2-nbt-cpp v2.1.5
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Node.hpp
浏览该文件的文档.
1#pragma once
2
3#include <compare>
4
5#include "NBT_Type.hpp"
6
7#include "NBT_Array.hpp"
8#include "NBT_String.hpp"
9#include "NBT_List.hpp"
10#include "NBT_Compound.hpp"
11
14
15//在这里,所有依赖的定义都已完备,给出方便调用获取字符串字面量的的宏定义
16
21#define MU8STR(charLiteralString) (NBT_Type::String(U8TOMU8STR(u8##charLiteralString)))//从工具返回的std::string_view构造到nbt的string::view
22
28#define MU8STRV(charLiteralString) (NBT_Type::String::View(U8TOMU8STR(u8##charLiteralString)))//从工具返回的std::string_view构造到nbt的string::view
29
30template <bool bIsConst>
31class NBT_Node_View;
32
37{
38 template <bool bIsConst>
39 friend class NBT_Node_View;//视图类作为友元,互相访问数据
40
41public:
42 //类型列表展开,声明std::variant
44 template <typename T>
45 struct TypeListToVariant;
46
47 template <typename... Ts>
48 struct TypeListToVariant<NBT_Type::_TypeList<Ts...>>
49 {
50 using type = std::variant<Ts...>;
51 };
53
55 using VariantData = TypeListToVariant<NBT_Type::TypeList>::type;
56
57protected:
60
61public:
67 template <typename T, typename... Args>
68 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && std::is_constructible_v<VariantData, std::in_place_type_t<T>, Args&&...>)
69 explicit NBT_Node(std::in_place_type_t<T>, Args&&... args) : data(std::in_place_type<T>, std::forward<Args>(args)...)
70 {}
71
77 template <typename T, typename U>
78 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && std::is_constructible_v<VariantData, std::in_place_type_t<T>, std::initializer_list<U>>)
79 explicit NBT_Node(std::in_place_type_t<T>, std::initializer_list<U> init_list) : data(std::in_place_type<T>, init_list)
80 {}
81
86 template <typename T>
87 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && std::is_constructible_v<VariantData, T&&>)
88 NBT_Node(T &&value) noexcept : data(std::forward<T>(value))
89 {}
90
97 template <typename T, typename... Args>
98 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && std::is_constructible_v<T, Args&&...>)
99 T &Set(Args&&... args)
100 {
101 return data.emplace<T>(std::forward<Args>(args)...);
102 }
103
109 template<typename T>
110 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V <std::decay_t<T>> && std::is_constructible_v<VariantData, T&&>)
111 NBT_Node &operator=(T &&value) noexcept
112 {
113 data = std::forward<T>(value);
114 return *this;
115 }
116
119 {}
120
122 ~NBT_Node() = default;
123
126 NBT_Node(const NBT_Node &_NBT_Node) : data(_NBT_Node.data)
127 {}
128
131 NBT_Node(NBT_Node &&_NBT_Node) noexcept : data(std::move(_NBT_Node.data))
132 {}
133
136 const VariantData &GetData(void) const noexcept
137 {
138 return data;
139 }
140
143 VariantData &GetData(void) noexcept
144 {
145 return data;
146 }
147
151 NBT_Node &operator=(const NBT_Node &_NBT_Node)
152 {
153 data = _NBT_Node.data;
154 return *this;
155 }
156
160 NBT_Node &operator=(NBT_Node &&_NBT_Node) noexcept
161 {
162 data = std::move(_NBT_Node.data);
163 return *this;
164 }
165
169 bool operator==(const NBT_Node &_Right) const noexcept
170 {
171 return data == _Right.data;
172 }
173
177 bool operator!=(const NBT_Node &_Right) const noexcept
178 {
179 return data != _Right.data;
180 }
181
185 std::partial_ordering operator<=>(const NBT_Node &_Right) const noexcept
186 {
187 return data <=> _Right.data;
188 }
189
191 void Clear(void)
192 {
193 data.emplace<NBT_Type::End>(NBT_Type::End{});
194 }
195
198 NBT_TAG GetTag() const noexcept
199 {
200 return (NBT_TAG)(NBT_TAG_RAW_TYPE)data.index();//返回当前存储类型的index(0基索引,与NBT_TAG enum一一对应)
201 }
202
203
208 template<typename T>
209 const T &Get() const
210 {
211 return std::get<T>(data);
212 }
213
218 template<typename T>
219 T &Get()
220 {
221 return std::get<T>(data);
222 }
223
227 template<typename T>
228 const T *GetIf() const noexcept
229 {
230 return std::get_if<T>(&data);
231 }
232
236 template<typename T>
237 T *GetIf() noexcept
238 {
239 return std::get_if<T>(&data);
240 }
241
245 template<typename T>
246 bool TypeHolds() const
247 {
248 return std::holds_alternative<T>(data);
249 }
250
251//针对每种类型生成一个方便的函数
252//通过宏定义批量生成
253
257#define TYPE_GET_FUNC(type)\
258\
263const NBT_Type::type &Get##type() const\
264{\
265 return std::get<NBT_Type::type>(data);\
266}\
267\
268\
273NBT_Type::type &Get##type()\
274{\
275 return std::get<NBT_Type::type>(data);\
276}\
277\
278\
283const NBT_Type::type *GetIf##type() const noexcept\
284{\
285 return std::get_if<NBT_Type::type>(&data);\
286}\
287\
288\
293NBT_Type::type *GetIf##type() noexcept\
294{\
295 return std::get_if<NBT_Type::type>(&data);\
296}\
297\
298\
302bool Is##type() const\
303{\
304 return std::holds_alternative<NBT_Type::type>(data);\
305}\
306\
307\
313friend NBT_Type::type &Get##type(NBT_Node & node)\
314{\
315 return node.Get##type();\
316}\
317\
318\
324friend const NBT_Type::type &Get##type(const NBT_Node & node)\
326 return node.Get##type();\
335friend NBT_Type::type *GetIf##type(NBT_Node & node) noexcept\
337 return node.GetIf##type();\
338}\
339\
340
345 */\
346friend const NBT_Type::type *GetIf##type(const NBT_Node & node) noexcept\
347{\
348 return node.GetIf##type();\
349}\
350\
351\
356friend bool Is##type(const NBT_Node &node)\
357{\
358 return node.Is##type();\
359}
360
363
366
379 TYPE_GET_FUNC(Compound);
382
383#undef TYPE_GET_FUNC
384
387
388#define TYPE_SET_FUNC(type)\
389\
394NBT_Type::type &Set##type(const NBT_Type::type &value)\
395{\
396 return Set<NBT_Type::type>(value);\
397}\
398\
399\
404NBT_Type::type &Set##type(NBT_Type::type &&value)\
405{\
406 return Set<NBT_Type::type>(std::move(value));\
407}\
408\
409\
413NBT_Type::type &Set##type(void)\
414{\
415 return Set<NBT_Type::type>();\
416}
417
422
433 TYPE_SET_FUNC(String);
434 TYPE_SET_FUNC(List);
435 TYPE_SET_FUNC(Compound);
436
438
439#undef TYPE_SET_FUNC
440};
441
442/*
443TODO:
444给NBTList与NBTCompound添加一个附加字段
445往里面插入数据的时候,会根据数据的大小计算
446出nbt的大小合并到自身,删除的时候去掉
447这样在写出的时候可以预分配,而不是被动的触发
448容器的扩容拷贝,增加写出性能
449*/
NBT数组基础类型
NBT集合基础类型
NBT列表类型
#define TYPE_SET_FUNC(type)
不同类型名接口生成宏
定义 NBT_Node.hpp:345
#define TYPE_GET_FUNC(type)
不同类型名获取接口生成宏
定义 NBT_Node.hpp:257
NBT字符串类型
uint8_t NBT_TAG_RAW_TYPE
NBT_TAG的原始类型,用于二进制读写或判断等
定义 NBT_TAG.hpp:12
NBT_TAG
枚举NBT类型对应的类型标签值
定义 NBT_TAG.hpp:17
@ Int
对应NBT_Type::Int
定义 NBT_TAG.hpp:21
@ Float
对应NBT_Type::Float
定义 NBT_TAG.hpp:23
@ ByteArray
对应NBT_Type::ByteArray
定义 NBT_TAG.hpp:25
@ Short
对应NBT_Type::Short
定义 NBT_TAG.hpp:20
@ Long
对应NBT_Type::Long
定义 NBT_TAG.hpp:22
@ End
对应NBT_Type::End
定义 NBT_TAG.hpp:18
@ LongArray
对应NBT_Type::LongArray
定义 NBT_TAG.hpp:30
@ Byte
对应NBT_Type::Byte
定义 NBT_TAG.hpp:19
@ IntArray
对应NBT_Type::IntArray
定义 NBT_TAG.hpp:29
@ Double
对应NBT_Type::Double
定义 NBT_TAG.hpp:24
NBT所有类型定义与类型处理工具集
NBT节点的视图,用于指向而不持有对象,类似于标准库的std::string与std::string_view的关系
定义 NBT_Node_View.hpp:24
NBT节点,用于存储NBT格式的各种数据类型
定义 NBT_Node.hpp:37
NBT_Node(const NBT_Node &_NBT_Node)
拷贝构造函数
定义 NBT_Node.hpp:126
T & Set(Args &&... args)
原位放置新对象并替换当前对象
定义 NBT_Node.hpp:99
T & Get()
通过指定类型获取当前存储的数据对象
定义 NBT_Node.hpp:219
NBT_Node(std::in_place_type_t< T >, std::initializer_list< U > init_list)
显式类型列表构造函数(通过in_place_type_t指定目标类型)
定义 NBT_Node.hpp:79
TypeListToVariant< NBT_Type::TypeList >::type VariantData
用于存储NBT数据的具体变体类型
定义 NBT_Node.hpp:55
NBT_TAG GetTag() const noexcept
获取当前存储的NBT类型的枚举值
定义 NBT_Node.hpp:198
const T * GetIf() const noexcept
通过指定类型获取当前存储的数据对象指针
定义 NBT_Node.hpp:228
bool operator!=(const NBT_Node &_Right) const noexcept
不等比较运算符
定义 NBT_Node.hpp:177
NBT_Node()
默认构造函数(构造为TAG_End类型)
定义 NBT_Node.hpp:118
NBT_Node & operator=(const NBT_Node &_NBT_Node)
拷贝赋值运算符
定义 NBT_Node.hpp:151
~NBT_Node()=default
默认析构函数
VariantData & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_Node.hpp:143
NBT_Node(NBT_Node &&_NBT_Node) noexcept
移动构造函数
定义 NBT_Node.hpp:131
VariantData data
数据对象(要求必须持有数据)
定义 NBT_Node.hpp:59
const VariantData & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_Node.hpp:136
NBT_Node & operator=(NBT_Node &&_NBT_Node) noexcept
移动赋值运算符
定义 NBT_Node.hpp:160
bool TypeHolds() const
类型判断
定义 NBT_Node.hpp:246
NBT_Node(T &&value) noexcept
通用类型构造函数,可以拷贝或移动元素到对象内
定义 NBT_Node.hpp:88
std::partial_ordering operator<=>(const NBT_Node &_Right) const noexcept
三路比较运算符
定义 NBT_Node.hpp:185
const T & Get() const
通过指定类型获取当前存储的数据对象
定义 NBT_Node.hpp:209
T * GetIf() noexcept
通过指定类型获取当前存储的数据对象指针
定义 NBT_Node.hpp:237
bool operator==(const NBT_Node &_Right) const noexcept
相等比较运算符
定义 NBT_Node.hpp:169
NBT_Node(std::in_place_type_t< T >, Args &&... args)
显式类型构造函数(通过in_place_type_t指定目标类型)
定义 NBT_Node.hpp:69
void Clear(void)
清除所有数据,重置为TAG_End类型
定义 NBT_Node.hpp:191
提供NBT类型定义,包括NBT格式中的所有数据类型,以及部分辅助功能,比如静态类型与Tag映射,类型存在查询,类型列表大小,类型最大小值等
定义 NBT_Type.hpp:29
std::monostate End
结束标记类型,无数据
定义 NBT_Type.hpp:48
static constexpr bool IsValidType_V
类型存在检查:用于编译期检查一个给定类型是否为NBT中的类型
定义 NBT_Type.hpp:183