chenjunfu2-nbt-cpp v2.1.0
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Node_View.hpp
浏览该文件的文档.
1#pragma once
2
3#include "NBT_Node.hpp"
4
7
8//用法和NBT_Node一致,但是只持有构造时传入对象的指针,且不持有对象
9//对象随时可销毁,如果销毁后使用持有销毁对象的view则行为未定义,用户自行负责
10//构造传入nullptr指针且进行使用则后果自负
11
22template <bool bIsConst>
23class NBT_Node_View
24{
25 template <bool _bIsConst>
26 friend class NBT_Node_View;//需要设置自己为友元,这样不同模板的类实例之间才能相互访问
27
28private:
29 //类型列表展开,声明std::variant
30 template <typename T>
31 struct AddConstIf
32 {
33 using type = std::conditional<bIsConst, const T, T>::type;
34 };
35
36 template <typename T>
37 using PtrType = typename AddConstIf<T>::type *;
38
39 template <typename T>
40 struct TypeListPointerToVariant;
41
42 template <typename... Ts>
43 struct TypeListPointerToVariant<NBT_Type::_TypeList<Ts...>>
44 {
45 using type = std::variant<PtrType<Ts>...>;//展开成指针类型
46 };
47
48 using VariantData = TypeListPointerToVariant<NBT_Type::TypeList>::type;
49
50 //数据对象(仅持有数据的指针)
51 VariantData data;
52public:
54 static inline constexpr bool is_const = bIsConst;
55
56
57
63 template <typename T>
64 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> &&NBT_Type::IsValidType_V<std::decay_t<T>> && !bIsConst)
65 NBT_Node_View(T &value) : data(&value)
66 {}
67
73 template <typename T>
74 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && bIsConst)
75 NBT_Node_View(const T &value) : data(&value)
76 {}
77
83 {
84 std::visit([this](auto &arg)
85 {
86 this->data = &arg;
87 }, node.data);
88 }
89
94 template <typename = void>//requires占位模板
95 requires(bIsConst)//此构造只在const的情况下生效,因为非const的情况下不能通过const对象初始化非const指针
97 {
98 std::visit([this](auto &arg)
99 {
100 this->data = &arg;
101 }, node.data);
102 }
103
108 template <typename = void>//requires占位模板
109 requires(bIsConst)//此构造只在const的情况下生效,不能从const视图转换到非const视图
110 NBT_Node_View(const NBT_Node_View<false> &_Other)
111 {
112 std::visit([this](auto &arg)
113 {
114 this->data = arg;//此处arg为非const指针
115 }, _Other.data);
116 }
117
122 template <typename T>
123 requires(!std::is_lvalue_reference_v<T>)
124 NBT_Node_View(T &&_Temp) = delete;
125
132 template <typename T>
133 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && !bIsConst)
134 T &Set(T &value)
135 {
136 data.template emplace<PtrType<T>>(&value);
137 return value;
138 }
139
146 template <typename T>
147 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && bIsConst)
148 const T &Set(const T &value)
149 {
150 data.template emplace<PtrType<T>>(&value);
151 return value;
152 }
153
159 template <typename = void>//requires占位模板
160 requires(!bIsConst)
162 {
163 std::visit([this](auto &arg)
164 {
165 this->data = &arg;
166 }, node.data);
167
168 return node;
169 }
170
176 template <typename = void>//requires占位模板
177 requires(bIsConst)
178 const NBT_Node &Set(const NBT_Node &node)
179 {
180 std::visit([this](auto &arg)
181 {
182 this->data = &arg;
183 }, node.data);
184
185 return node;
186 }
187
192 template <typename T>
193 requires(!std::is_lvalue_reference_v<T>)
194 T &Set(T &&_Temp) = delete;
195
202 template <typename T>
203 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && !bIsConst)
204 NBT_Node_View &operator=(T &value)
205 {
206 data = &value;
207
208 return *this;
209 }
210
217 template <typename T>
218 requires(!std::is_same_v<std::decay_t<T>, NBT_Node> && NBT_Type::IsValidType_V<std::decay_t<T>> && bIsConst)
219 NBT_Node_View &operator=(const T &value)
220 {
221 data = &value;
222
223 return *this;
224 }
225
231 template <typename = void>
232 requires(!bIsConst)
233 NBT_Node_View &operator=(NBT_Node &node)
234 {
235 std::visit([this](auto &arg)
236 {
237 this->data = &arg;
238 }, node.data);
239
240 return *this;
241 }
242
248 template <typename = void>
249 requires(bIsConst)
250 NBT_Node_View &operator=(const NBT_Node &node)
251 {
252 std::visit([this](auto &arg)
253 {
254 this->data = &arg;
255 }, node.data);
256
257 return *this;
258 }
259
264 template <typename T>
265 requires(!std::is_lvalue_reference_v<T>)
266 NBT_Node_View &operator=(T &&_Temp) = delete;
267
268public:
271 NBT_Node_View() : data(PtrType<NBT_Type::End>{})
272 {}
273
276 ~NBT_Node_View() = default;
277
281 NBT_Node_View(const NBT_Node_View &_Copy) : data(_Copy.data)
282 {}
283
287 NBT_Node_View(NBT_Node_View &&_Move) noexcept : data(std::move(_Move.data))
288 {}
289
294 NBT_Node_View &operator=(const NBT_Node_View &_Copy)
295 {
296 data = _Copy.data;
297 return *this;
298 }
299
304 NBT_Node_View &operator=(NBT_Node_View &&_Move) noexcept
305 {
306 data = std::move(_Move.data);
307 return *this;
308 }
309
315 bool operator==(const NBT_Node_View &_Right) const noexcept
316 {
317 if (GetTag() != _Right.GetTag())
318 {
319 return false;
320 }
321
322 return std::visit([this](const auto *argL, const auto *argR)-> bool
323 {
324 using TL = const std::decay_t<decltype(argL)>;
325 return *argL == *(TL)argR;
326 }, this->data, _Right.data);
327 }
328
334 bool operator!=(const NBT_Node_View &_Right) const noexcept
335 {
336 if (GetTag() != _Right.GetTag())
337 {
338 return true;
339 }
340
341 return std::visit([this](const auto *argL, const auto *argR)-> bool
342 {
343 using TL = const std::decay_t<decltype(argL)>;
344 return *argL != *(TL)argR;
345 }, this->data, _Right.data);
346 }
347
353 std::partial_ordering operator<=>(const NBT_Node_View &_Right) const noexcept
354 {
355 if (GetTag() != _Right.GetTag())
356 {
357 return std::partial_ordering::unordered;
358 }
359
360 return std::visit([this](const auto *argL, const auto *argR)-> std::partial_ordering
361 {
362 using TL = const std::decay_t<decltype(argL)>;
363 return *argL <=> *(TL)argR;
364 }, this->data, _Right.data);
365 }
366
369 NBT_TAG GetTag() const noexcept
370 {
371 return (NBT_TAG)data.index();//返回当前存储类型的index(0基索引,与NBT_TAG enum一一对应)
372 }
373
378 template<typename T>
379 const T &Get() const
380 {
381 return *std::get<PtrType<T>>(data);
382 }
383
388 template<typename T>
389 requires(!bIsConst)//仅在非const的情况下可用
390 T &Get()
391 {
392 return *std::get<PtrType<T>>(data);
393 }
394
398 template<typename T>
399 bool TypeHolds() const
400 {
401 return std::holds_alternative<PtrType<T>>(data);
402 }
403
406 bool IsEmpty() const
407 {
408 return TypeHolds<NBT_Type::End>() &&
409 std::get<PtrType<NBT_Type::End>>(data) == PtrType<NBT_Type::End>{};
410 }
411
413 void SetEmpty()
414 {
415 data.template emplace<PtrType<NBT_Type::End>>(PtrType<NBT_Type::End>{});
416 }
417
418//针对每种类型生成一个方便的函数
419//通过宏定义批量生成
420
424#define TYPE_GET_FUNC(type)\
425\
430const NBT_Type::type &Get##type() const\
431{\
432 return *std::get<PtrType<NBT_Type::type>>(data);\
433}\
434\
435\
440template <typename = void>\
441requires(!bIsConst)\
442NBT_Type::type &Get##type()\
443{\
444 return *std::get<PtrType<NBT_Type::type>>(data);\
445}\
446\
447\
451bool Is##type() const\
452{\
453 return std::holds_alternative<PtrType<NBT_Type::type>>(data);\
454}\
455\
461friend std::conditional_t<bIsConst, const NBT_Type::type &, NBT_Type::type &> Get##type(NBT_Node_View & node)\
462{\
463 return node.Get##type();\
464}\
465\
466\
472friend std::conditional_t<bIsConst, const NBT_Type::type &, NBT_Type::type &> &Get##type(const NBT_Node_View & node)\
474 return node.Get##type();\
482friend bool Is##type(const NBT_Node_View &node)\
483{\
484 return node.Is##type();\
485}
486
489 /// - Get开头+类型名的函数:直接获取此类型,不做任何检查,由std::get具体实现决定
490 /// - Is开头 + 类型名的函数:判断当前NBT_Node_View是否指向此类型
491 /// @{
492
503 TYPE_GET_FUNC(String);
504 TYPE_GET_FUNC(List);
505 TYPE_GET_FUNC(Compound);
506
508
509#undef TYPE_GET_FUNC
510
514#define TYPE_SET_FUNC(type)\
520template <typename = void>\
521requires(!bIsConst)\
522NBT_Type::type &Set##type(NBT_Type::type &value)\
524 return Set<NBT_Type::type>(value); \
527\
532template <typename = void>\
533requires(bIsConst)\
534const NBT_Type::type &Set##type(const NBT_Type::type &value)\
535{\
536 return Set<NBT_Type::type>(value); \
537}\
538\
539\
544NBT_Type::type &Set##type(NBT_Type::type &&_Temp) = delete;
545
550
561 TYPE_SET_FUNC(String);
562 TYPE_SET_FUNC(List);
563 TYPE_SET_FUNC(Compound);
564
566
567#undef TYPE_SET_FUNC
568};
NBT节点类型,支持存储所有NBT类型的变体
#define TYPE_SET_FUNC(type)
不同类型名接口生成宏
定义 NBT_Node_View.hpp:489
#define TYPE_GET_FUNC(type)
不同类型名接口生成宏
定义 NBT_Node_View.hpp:424
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
static constexpr bool is_const
静态常量,表示当前视图指向的数据是否只读
定义 NBT_Node_View.hpp:54
bool operator==(const NBT_Node_View &_Right) const noexcept
相等比较运算符
定义 NBT_Node_View.hpp:315
~NBT_Node_View()=default
默认析构函数
NBT_Node_View(T &&_Temp)=delete
删除临时对象构造方式,防止从临时对象构造导致悬空指针
const T & Get() const
通过指定类型获取当前视图指向的数据对象
定义 NBT_Node_View.hpp:379
const NBT_Node & Set(const NBT_Node &node)
从NBT_Node重设视图(仅适用于const)
定义 NBT_Node_View.hpp:178
NBT_Node_View & operator=(NBT_Node_View &&_Move) noexcept
移动赋值运算符
定义 NBT_Node_View.hpp:304
NBT_Node & Set(NBT_Node &node)
从NBT_Node重设视图(仅适用于非const)
定义 NBT_Node_View.hpp:161
NBT_Node_View(const T &value)
通用构造函数(仅适用于const)
定义 NBT_Node_View.hpp:75
T & Set(T &&_Temp)=delete
删除临时对象设置方式,防止从临时对象构造导致悬空指针
NBT_Node_View(T &value)
通用构造函数(仅适用于非const)
定义 NBT_Node_View.hpp:65
NBT_Node_View(NBT_Node_View &&_Move) noexcept
移动构造函数
定义 NBT_Node_View.hpp:287
bool IsEmpty() const
为空判断
定义 NBT_Node_View.hpp:406
T & Set(T &value)
通用设置函数(仅适用于非const)
定义 NBT_Node_View.hpp:134
NBT_TAG GetTag() const noexcept
获取当前视图指向的NBT类型的枚举值
定义 NBT_Node_View.hpp:369
NBT_Node_View(const NBT_Node &node)
从NBT_Node构造视图(仅适用于const)
定义 NBT_Node_View.hpp:96
NBT_Node_View(const NBT_Node_View< false > &_Other)
从非const视图隐式构造const视图
定义 NBT_Node_View.hpp:110
NBT_Node_View(NBT_Node &node)
从NBT_Node构造视图(仅适用于非const)
定义 NBT_Node_View.hpp:82
NBT_Node_View()
默认构造函数
定义 NBT_Node_View.hpp:271
T & Get()
通过指定类型获取当前视图指向的数据对象(仅适用于非const视图)
定义 NBT_Node_View.hpp:390
void SetEmpty()
设置为空
定义 NBT_Node_View.hpp:413
std::partial_ordering operator<=>(const NBT_Node_View &_Right) const noexcept
三路比较运算符
定义 NBT_Node_View.hpp:353
bool TypeHolds() const
类型判断
定义 NBT_Node_View.hpp:399
NBT_Node_View & operator=(const NBT_Node_View &_Copy)
拷贝赋值运算符
定义 NBT_Node_View.hpp:294
bool operator!=(const NBT_Node_View &_Right) const noexcept
不等比较运算符
定义 NBT_Node_View.hpp:334
const T & Set(const T &value)
通用设置函数(仅适用于const)
定义 NBT_Node_View.hpp:148
NBT_Node_View(const NBT_Node_View &_Copy)
拷贝构造函数
定义 NBT_Node_View.hpp:281
NBT节点,用于存储NBT格式的各种数据类型
定义 NBT_Node.hpp:37
提供NBT类型定义,包括NBT格式中的所有数据类型,以及部分辅助功能,比如静态类型与Tag映射,类型存在查询,类型列表大小,类型最大小值等
定义 NBT_Type.hpp:28
static constexpr bool IsValidType_V
类型存在检查:用于编译期检查一个给定类型是否为NBT中的类型
定义 NBT_Type.hpp:182