chenjunfu2-nbt-cpp v2.1.3
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_List.hpp
浏览该文件的文档.
1#pragma once
2
3#include <vector>
4#include <compare>
5#include <type_traits>
6#include <initializer_list>
7#include <stdexcept>
8
9#include "NBT_Type.hpp"
10
13
14class NBT_Reader;
15class NBT_Writer;
16class NBT_Helper;
17
21template <typename List>
22class NBT_List :protected List
23{
24 friend class NBT_Reader;
25 friend class NBT_Writer;
26 friend class NBT_Helper;
27
28public:
33
34 using Value_Type = typename List::value_type;
35 using Allocator_Type = typename List::allocator_type;
36 using Size_Type = typename List::size_type;
37 using Difference_Type = typename List::difference_type;
38 using Reference = typename List::reference;
39 using Const_Reference = typename List::const_reference;
40 using Pointer = typename List::pointer;
41 using Const_Pointer = typename List::const_pointer;
42 using Iterator = typename List::iterator;
43 using Const_Iterator = typename List::const_iterator;
44 using Reverse_Iterator = typename List::reverse_iterator;
45 using Const_Reverse_Iterator = typename List::const_reverse_iterator;
46
48
49public:
50 //完美转发、初始化列表代理构造
51
55 template<typename... Args>
56 NBT_List(Args&&... args) : List(std::forward<Args>(args)...)
57 {}
58
61 NBT_List(std::initializer_list<typename List::value_type> init) : List(init)
62 {}
63
65 NBT_List(void) = default;
67 ~NBT_List(void) = default;
68
71 NBT_List(NBT_List &&_Move) noexcept :List(std::move(_Move))
72 {}
73
76 NBT_List(const NBT_List &_Copy) :List(_Copy)
77 {}
78
82 NBT_List &operator=(NBT_List &&_Move) noexcept
83 {
84 List::operator=(std::move(_Move));
85 return *this;
86 }
87
92 {
93 List::operator=(_Copy);
94 return *this;
95 }
96
99 const List &GetData(void) const noexcept
100 {
101 return *this;
102 }
103
107 bool operator==(const NBT_List &_Right) const noexcept
108 {
109 return (const List &)*this == (const List &)_Right;
110 }
111
115 bool operator!=(const NBT_List &_Right) const noexcept
116 {
117 return (const List &)*this != (const List &)_Right;
118 }
119
123 std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
124 {
125 return (const List &)*this <=> (const List &)_Right;
126 }
127
131
132 using List::begin;
133 using List::end;
134 using List::cbegin;
135 using List::cend;
136 using List::rbegin;
137 using List::rend;
138 using List::crbegin;
139 using List::crend;
140 using List::operator[];
141
143
147
152 typename List::value_type &Get(const typename List::size_type &szPos)
153 {
154 return List::at(szPos);
155 }
156
161 const typename List::value_type &Get(const typename List::size_type &szPos) const
162 {
163 return List::at(szPos);
164 }
165
169 typename List::value_type *Has(const typename List::size_type &szPos) noexcept
170 {
171 return szPos < List::size()
172 ? &List::operator[](szPos)
173 : NULL;
174 }
175
179 const typename List::value_type *Has(const typename List::size_type &szPos) const noexcept
180 {
181 return szPos < List::size()
182 ? &List::operator[](szPos)
183 : NULL;
184 }
185
189 typename List::value_type &Front(void) noexcept
190 {
191 return List::front();
192 }
193
197 const typename List::value_type &Front(void) const noexcept
198 {
199 return List::front();
200 }
201
205 typename List::value_type &Back(void) noexcept
206 {
207 return List::back();
208 }
209
213 const typename List::value_type &Back(void) const noexcept
214 {
215 return List::back();
216 }
217
219
223
230 template <typename V>
231 typename List::value_type &Add(typename List::size_type szPos, V &&vTagVal)
232 {
233 return *List::emplace(List::begin() + szPos, std::forward<V>(vTagVal));//插入
234 }
235
240 template <typename V>
241 typename List::value_type &AddFront(V &&vTagVal)
242 {
243 return *List::emplace(List::begin(), std::forward<V>(vTagVal));//插入
244 }
245
250 template <typename V>
251 typename List::value_type &AddBack(V &&vTagVal)
252 {
253 return List::emplace_back(std::forward<V>(vTagVal));
254 }
255
262 template <typename V>
263 typename List::value_type &Set(typename List::size_type szPos, V &&vTagVal)
264 {
265 return List::operator[](szPos) = std::forward<V>(vTagVal);
266 }
267
270 void Remove(typename List::size_type szPos)
271 {
272 List::erase(List::begin() + szPos);//这个没必要返回结果,直接丢弃
273 }
274
277 void Clear(void)
278 {
279 List::clear();
280 }
281
284 void Resize(typename List::size_type szNewSize)
285 {
286 return List::resize(szNewSize);
287 }
288
292 void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
293 {
294 return List::resize(szNewSize, value);
295 }
296
299 void Merge(const NBT_List &_Copy)
300 {
301 List::insert(List::end(), _Copy.begin(), _Copy.end());
302 }
303
306 void Merge(NBT_List &&_Move)
307 {
308 List::insert(List::end(), std::make_move_iterator(_Move.begin()), std::make_move_iterator(_Move.end()));
309 }
310
315 typename List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
316 {
317 return List::insert(itPos, value);
318 }
319
324 typename List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
325 {
326 return List::insert(itPos, std::move(value));
327 }
328
334 typename List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
335 {
336 return List::insert(itPos, szCount, value);
337 }
338
344 template<typename InputIt>
345 typename List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
346 {
347 return List::insert(itPos, itFirst, itLast);
348 }
349
354 typename List::iterator Insert(typename List::const_iterator itPos, std::initializer_list<typename List::value_type> ilistValue)
355 {
356 return List::insert(itPos, ilistValue);
357 }
358
360
363 bool Empty(void) const noexcept
364 {
365 return List::empty();
366 }
367
370 typename List::size_type Size(void) const noexcept
371 {
372 return List::size();
373 }
374
377 void Reserve(typename List::size_type szNewCap)
378 {
379 return List::reserve(szNewCap);
380 }
381
383 void ShrinkToFit(void)
384 {
385 return List::shrink_to_fit();
386 }
387
392 bool Contains(const typename List::value_type &tValue) const noexcept
393 {
394 return std::find(List::begin(), List::end(), tValue) != List::end();
395 }
396
402 template<typename Predicate>
403 bool ContainsIf(Predicate pred) const noexcept
404 {
405 return std::find_if(List::begin(), List::end(), pred) != List::end();
406 }
407
411#define TYPE_GET_FUNC(type)\
412\
419const typename NBT_Type::type &Get##type(const typename List::size_type &szPos) const\
420{\
421 return List::at(szPos).Get##type();\
422}\
423\
424\
431typename NBT_Type::type &Get##type(const typename List::size_type &szPos)\
432{\
433 return List::at(szPos).Get##type();\
434}\
435\
436\
441const typename NBT_Type::type *Has##type(const typename List::size_type &szPos) const noexcept\
442{\
443 auto *p = Has(szPos);\
444 return p != NULL && p->Is##type()\
445 ? &p->Get##type()\
446 : NULL;\
447}\
448\
449\
454typename NBT_Type::type *Has##type(const typename List::size_type &szPos) noexcept\
455{\
456 auto *p = Has(szPos);\
457 return p != NULL && p->Is##type()\
458 ? &p->Get##type()\
459 : NULL;\
460}\
461\
462
464\
468const typename NBT_Type::type &Front##type(void) const\
469{\
470 return List::front().Get##type(); \
471}\
472\
473\
479typename NBT_Type::type &Front##type(void)\
480 {\
481 return List::front().Get##type(); \
482 }\
489const typename NBT_Type::type &Back##type(void) const\
490{\
491 return List::back().Get##type();\
492}\
493\
494
495 @brief 获取列表最后一个 type 类型数据
496 @return type 类型数据的引用
497 @note 如果列表为空或类型不匹配则抛出异常,
498 具体请参考std::vector关于back的说明与std::get的说明
499 */\
500typename NBT_Type::type &Back##type(void)\
501{\
502 return List::back().Get##type();\
503}
504
513
524 TYPE_GET_FUNC(String);
525 TYPE_GET_FUNC(List);
526 TYPE_GET_FUNC(Compound);
527
529
530#undef TYPE_GET_FUNC
531
535#define TYPE_PUT_FUNC(type)\
536\
542typename List::value_type &Add##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
543{\
544 return Add(szPos, vTagVal);\
545}\
546\
547\
554typename List::value_type & Add##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
556 return Add(szPos, std::move(vTagVal));\
565typename List::value_type &AddFront##type(const typename NBT_Type::type &vTagVal)\
566{\
567 return AddFront(vTagVal); \
568}\
569\
570\
576typename List::value_type & AddFront##type(typename NBT_Type::type &&vTagVal)\
577{\
578 return AddFront(std::move(vTagVal));\
579}\
580\
581\
587typename List::value_type &AddBack##type(const typename NBT_Type::type &vTagVal)\
588{\
589 return AddBack(vTagVal);\
590}\
591\
592\
598typename List::value_type &AddBack##type(typename NBT_Type::type &&vTagVal)\
599{\
600 return AddBack(std::move(vTagVal));\
601}\
602\
603\
610typename List::value_type &Set##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
611{\
612 return Set(szPos, vTagVal);\
613}\
614\
615\
622typename List::value_type &Set##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
623{\
624 return Set(szPos, std::move(vTagVal));\
625}
626
634
645 TYPE_PUT_FUNC(String);
646 TYPE_PUT_FUNC(List);
647 TYPE_PUT_FUNC(Compound);
648
650
651#undef TYPE_PUT_FUNC
652};
#define TYPE_PUT_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:495
#define TYPE_GET_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:411
@ 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
@ List
对应NBT_Type::List
定义 NBT_TAG.hpp:27
@ 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_Helper.hpp:25
typename List::allocator_type Allocator_Type
标准库容器公开类型映射
定义 NBT_List.hpp:35
typename List::const_pointer Const_Pointer
标准库容器公开类型映射
定义 NBT_List.hpp:41
typename List::size_type Size_Type
标准库容器公开类型映射
定义 NBT_List.hpp:36
List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
在指定位置插入一个元素(移动构造)
定义 NBT_List.hpp:324
bool Empty(void) const noexcept
检查容器是否为空
定义 NBT_List.hpp:363
List::value_type & Add(typename List::size_type szPos, V &&vTagVal)
在指定位置的前面插入元素
定义 NBT_List.hpp:231
void Reserve(typename List::size_type szNewCap)
预留存储空间
定义 NBT_List.hpp:377
typename List::reference Reference
标准库容器公开类型映射
定义 NBT_List.hpp:38
NBT_List(NBT_List &&_Move) noexcept
移动构造函数
定义 NBT_List.hpp:71
typename List::reverse_iterator Reverse_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:44
const List & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_List.hpp:99
List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
在指定位置插入一个元素(拷贝构造)
定义 NBT_List.hpp:315
List::value_type & Get(const typename List::size_type &szPos)
根据位置获取值
定义 NBT_List.hpp:152
const List::value_type & Back(void) const noexcept
获取列表最后的元素(常量版本)
定义 NBT_List.hpp:213
bool Contains(const typename List::value_type &tValue) const noexcept
检查是否包含指定元素
定义 NBT_List.hpp:392
void ShrinkToFit(void)
缩减容器容量以匹配大小
定义 NBT_List.hpp:383
List::size_type Size(void) const noexcept
获取容器中元素的数量
定义 NBT_List.hpp:370
bool operator==(const NBT_List &_Right) const noexcept
相等比较运算符
定义 NBT_List.hpp:107
typename List::const_reverse_iterator Const_Reverse_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:45
typename List::difference_type Difference_Type
标准库容器公开类型映射
定义 NBT_List.hpp:37
typename List::iterator Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:42
void Merge(NBT_List &&_Move)
移动合并另一个NBT_List的内容
定义 NBT_List.hpp:306
void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
调整容器大小,如果大小大于当前大小,那么使用val填充新增空间,否则删除多余元素
定义 NBT_List.hpp:292
List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
在指定位置插入一个范围内的元素
定义 NBT_List.hpp:345
std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
三路比较运算符
定义 NBT_List.hpp:123
const List::value_type & Front(void) const noexcept
获取列表开头的元素(常量版本)
定义 NBT_List.hpp:197
typename List::value_type Value_Type
标准库容器公开类型映射
定义 NBT_List.hpp:34
void Clear(void)
清空所有元素
定义 NBT_List.hpp:277
void Merge(const NBT_List &_Copy)
拷贝合并另一个NBT_List的内容
定义 NBT_List.hpp:299
NBT_List(Args &&... args)
构造函数
定义 NBT_List.hpp:56
void Resize(typename List::size_type szNewSize)
调整容器大小,如果大小大于当前大小,那么使用默认值填充新增空间,否则删除多余元素
定义 NBT_List.hpp:284
NBT_List(const NBT_List &_Copy)
拷贝构造函数
定义 NBT_List.hpp:76
List::value_type & Back(void) noexcept
获取列表最后的元素
定义 NBT_List.hpp:205
NBT_List(void)=default
默认构造函数
List::value_type & Set(typename List::size_type szPos, V &&vTagVal)
设置(替换)指定位置的元素
定义 NBT_List.hpp:263
NBT_List(std::initializer_list< typename List::value_type > init)
初始化列表构造函数
定义 NBT_List.hpp:61
~NBT_List(void)=default
析构函数
List::value_type & Front(void) noexcept
获取列表开头的元素
定义 NBT_List.hpp:189
List::value_type & AddFront(V &&vTagVal)
在列表头部插入元素
定义 NBT_List.hpp:241
typename List::pointer Pointer
标准库容器公开类型映射
定义 NBT_List.hpp:40
typename List::const_iterator Const_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:43
List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
在指定位置插入count个相同的元素
定义 NBT_List.hpp:334
bool operator!=(const NBT_List &_Right) const noexcept
不等比较运算符
定义 NBT_List.hpp:115
List::value_type * Has(const typename List::size_type &szPos) noexcept
根据位置查找值
定义 NBT_List.hpp:169
NBT_List & operator=(const NBT_List &_Copy)
拷贝赋值运算符
定义 NBT_List.hpp:91
void Remove(typename List::size_type szPos)
删除指定位置的元素
定义 NBT_List.hpp:270
bool ContainsIf(Predicate pred) const noexcept
使用谓词检查是否存在满足条件的元素
定义 NBT_List.hpp:403
List::value_type & AddBack(V &&vTagVal)
在列表末尾插入元素
定义 NBT_List.hpp:251
const List::value_type * Has(const typename List::size_type &szPos) const noexcept
根据位置查找值(常量版本)
定义 NBT_List.hpp:179
const List::value_type & Get(const typename List::size_type &szPos) const
根据位置获取值(常量版本)
定义 NBT_List.hpp:161
NBT_List & operator=(NBT_List &&_Move) noexcept
移动赋值运算符
定义 NBT_List.hpp:82
List::iterator Insert(typename List::const_iterator itPos, std::initializer_list< typename List::value_type > ilistValue)
在指定位置插入初始化列表中的元素
定义 NBT_List.hpp:354
typename List::const_reference Const_Reference
标准库容器公开类型映射
定义 NBT_List.hpp:39
这个类用于提供从NBT二进制流读取到NBT_Type::Compound对象的反序列化功能
定义 NBT_Reader.hpp:23
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:23
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:422