chenjunfu2-nbt-cpp v2.1.5
一个基于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:
30 using Super = List;
31
36
37 using Value_Type = typename List::value_type;
38 using Allocator_Type = typename List::allocator_type;
39 using Size_Type = typename List::size_type;
40 using Difference_Type = typename List::difference_type;
41 using Reference = typename List::reference;
42 using Const_Reference = typename List::const_reference;
43 using Pointer = typename List::pointer;
44 using Const_Pointer = typename List::const_pointer;
45 using Iterator = typename List::iterator;
46 using Const_Iterator = typename List::const_iterator;
47 using Reverse_Iterator = typename List::reverse_iterator;
48 using Const_Reverse_Iterator = typename List::const_reverse_iterator;
49
51
52public:
53 //完美转发、初始化列表代理构造
54
58 template<typename... Args>
59 NBT_List(Args&&... args) : List(std::forward<Args>(args)...)
60 {}
61
64 NBT_List(std::initializer_list<typename List::value_type> init) : List(init)
65 {}
66
68 NBT_List(void) = default;
70 ~NBT_List(void) = default;
71
74 NBT_List(NBT_List &&_Move) noexcept :List(std::move(_Move))
75 {}
76
79 NBT_List(const NBT_List &_Copy) :List(_Copy)
80 {}
81
84 const List &GetData(void) const noexcept
85 {
86 return *this;
87 }
88
91 List &GetData(void) noexcept
92 {
93 return *this;
94 }
95
99 NBT_List &operator=(NBT_List &&_Move) noexcept
100 {
101 List::operator=(std::move(_Move));
102 return *this;
103 }
104
109 {
110 List::operator=(_Copy);
111 return *this;
112 }
113
117 bool operator==(const NBT_List &_Right) const noexcept
118 {
119 return (const List &)*this == (const List &)_Right;
120 }
121
125 bool operator!=(const NBT_List &_Right) const noexcept
126 {
127 return (const List &)*this != (const List &)_Right;
128 }
129
133 std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
134 {
135 return (const List &)*this <=> (const List &)_Right;
136 }
137
141
142 using List::begin;
143 using List::end;
144 using List::cbegin;
145 using List::cend;
146 using List::rbegin;
147 using List::rend;
148 using List::crbegin;
149 using List::crend;
150 using List::operator[];
151
153
157
162 typename List::value_type &Get(const typename List::size_type &szPos)
163 {
164 return List::at(szPos);
165 }
166
171 const typename List::value_type &Get(const typename List::size_type &szPos) const
172 {
173 return List::at(szPos);
174 }
175
179 typename List::value_type *Has(const typename List::size_type &szPos) noexcept
180 {
181 return szPos < List::size()
182 ? &List::operator[](szPos)
183 : nullptr;
184 }
185
189 const typename List::value_type *Has(const typename List::size_type &szPos) const noexcept
190 {
191 return szPos < List::size()
192 ? &List::operator[](szPos)
193 : nullptr;
194 }
195
199 typename List::value_type &Front(void) noexcept
200 {
201 return List::front();
202 }
203
207 const typename List::value_type &Front(void) const noexcept
208 {
209 return List::front();
210 }
211
215 typename List::value_type &Back(void) noexcept
216 {
217 return List::back();
218 }
219
223 const typename List::value_type &Back(void) const noexcept
224 {
225 return List::back();
226 }
227
229
233
240 template <typename V>
241 typename List::value_type &Add(typename List::size_type szPos, V &&vTagVal)
242 {
243 return *List::emplace(List::begin() + szPos, std::forward<V>(vTagVal));//插入
244 }
245
250 template <typename V>
251 typename List::value_type &AddFront(V &&vTagVal)
252 {
253 return *List::emplace(List::begin(), std::forward<V>(vTagVal));//插入
254 }
255
260 template <typename V>
261 typename List::value_type &AddBack(V &&vTagVal)
262 {
263 return List::emplace_back(std::forward<V>(vTagVal));
264 }
265
272 template <typename V>
273 typename List::value_type &Set(typename List::size_type szPos, V &&vTagVal)
274 {
275 return List::operator[](szPos) = std::forward<V>(vTagVal);
276 }
277
280 void Remove(typename List::size_type szPos)
281 {
282 List::erase(List::begin() + szPos);//这个没必要返回结果,直接丢弃
283 }
284
287 void Clear(void)
288 {
289 List::clear();
290 }
291
294 void Resize(typename List::size_type szNewSize)
295 {
296 return List::resize(szNewSize);
297 }
298
302 void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
303 {
304 return List::resize(szNewSize, value);
305 }
306
309 void Merge(const NBT_List &_Copy)
310 {
311 List::insert(List::end(), _Copy.begin(), _Copy.end());
312 }
313
316 void Merge(NBT_List &&_Move)
317 {
318 List::insert(List::end(), std::make_move_iterator(_Move.begin()), std::make_move_iterator(_Move.end()));
319 }
320
325 typename List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
326 {
327 return List::insert(itPos, value);
328 }
329
334 typename List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
335 {
336 return List::insert(itPos, std::move(value));
337 }
338
344 typename List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
345 {
346 return List::insert(itPos, szCount, value);
347 }
348
354 template<typename InputIt>
355 typename List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
356 {
357 return List::insert(itPos, itFirst, itLast);
358 }
359
364 typename List::iterator Insert(typename List::const_iterator itPos, std::initializer_list<typename List::value_type> ilistValue)
365 {
366 return List::insert(itPos, ilistValue);
367 }
368
370
373 bool Empty(void) const noexcept
374 {
375 return List::empty();
376 }
377
380 typename List::size_type Size(void) const noexcept
381 {
382 return List::size();
383 }
384
387 void Reserve(typename List::size_type szNewCap)
388 {
389 return List::reserve(szNewCap);
390 }
391
393 void ShrinkToFit(void)
394 {
395 return List::shrink_to_fit();
396 }
397
402 bool Contains(const typename List::value_type &tValue) const noexcept
403 {
404 return std::find(List::begin(), List::end(), tValue) != List::end();
405 }
406
412 template<typename Predicate>
413 bool ContainsIf(Predicate pred) const noexcept
414 {
415 return std::find_if(List::begin(), List::end(), pred) != List::end();
416 }
417
421#define TYPE_GET_FUNC(type)\
422\
429const typename NBT_Type::type &Get##type(const typename List::size_type &szPos) const\
430{\
431 return List::at(szPos).Get##type();\
432}\
433\
434\
441typename NBT_Type::type &Get##type(const typename List::size_type &szPos)\
442{\
443 return List::at(szPos).Get##type();\
444}\
445\
446\
451const typename NBT_Type::type *Has##type(const typename List::size_type &szPos) const noexcept\
452{\
453 auto *p = Has(szPos);\
454 return p != nullptr\
455 ? p->GetIf##type()\
456 : nullptr;\
457}\
458\
459\
464typename NBT_Type::type *Has##type(const typename List::size_type &szPos) noexcept\
465{\
466 auto *p = Has(szPos);\
467 return p != nullptr\
468 ? p->GetIf##type()\
469 : nullptr;\
470}\
471\
472\
478const typename NBT_Type::type &Front##type(void) const\
479{\
480 return List::front().Get##type();\
481}\
482\
483\
489typename NBT_Type::type &Front##type(void)\
490{\
491 return List::front().Get##type();\
492}\
493\
494\
499const typename NBT_Type::type *FrontIf##type(void) const\
500{\
501 return List::front().GetIf##type();\
502}\
503\
504\
509typename NBT_Type::type *FrontIf##type(void)\
511 return List::front().GetIf##type();\
520const typename NBT_Type::type &Back##type(void) const\
522 return List::back().Get##type();\
523}\
524\
525
530 */\
531typename NBT_Type::type &Back##type(void)\
532{\
533 return List::back().Get##type();\
534}\
535\
536\
541const typename NBT_Type::type *BackIf##type(void) const\
542{\
543 return List::back().GetIf##type();\
544}\
545\
546\
551typename NBT_Type::type *BackIf##type(void)\
552{\
553 return List::back().GetIf##type();\
554}
555
564
575 TYPE_GET_FUNC(String);
576 TYPE_GET_FUNC(List);
577 TYPE_GET_FUNC(Compound);
578
580
581#undef TYPE_GET_FUNC
582
586#define TYPE_PUT_FUNC(type)\
593typename List::value_type &Add##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
595 return Add(szPos, vTagVal);\
605typename List::value_type & Add##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
606{\
607 return Add(szPos, std::move(vTagVal));\
608}\
609\
610\
616typename List::value_type &AddFront##type(const typename NBT_Type::type &vTagVal)\
617{\
618 return AddFront(vTagVal); \
619}\
620\
621\
627typename List::value_type & AddFront##type(typename NBT_Type::type &&vTagVal)\
628{\
629 return AddFront(std::move(vTagVal));\
630}\
631\
632\
638typename List::value_type &AddBack##type(const typename NBT_Type::type &vTagVal)\
639{\
640 return AddBack(vTagVal);\
641}\
642\
643\
649typename List::value_type &AddBack##type(typename NBT_Type::type &&vTagVal)\
650{\
651 return AddBack(std::move(vTagVal));\
652}\
653\
654\
661typename List::value_type &Set##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
662{\
663 return Set(szPos, vTagVal);\
664}\
665\
666\
673typename List::value_type &Set##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
674{\
675 return Set(szPos, std::move(vTagVal));\
676}
677
685
696 TYPE_PUT_FUNC(String);
697 TYPE_PUT_FUNC(List);
698 TYPE_PUT_FUNC(Compound);
699
701
702#undef TYPE_PUT_FUNC
703};
#define TYPE_PUT_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:530
#define TYPE_GET_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:421
@ 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:38
typename List::const_pointer Const_Pointer
标准库容器公开类型映射
定义 NBT_List.hpp:44
typename List::size_type Size_Type
标准库容器公开类型映射
定义 NBT_List.hpp:39
List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
在指定位置插入一个元素(移动构造)
定义 NBT_List.hpp:334
bool Empty(void) const noexcept
检查容器是否为空
定义 NBT_List.hpp:373
List::value_type & Add(typename List::size_type szPos, V &&vTagVal)
在指定位置的前面插入元素
定义 NBT_List.hpp:241
void Reserve(typename List::size_type szNewCap)
预留存储空间
定义 NBT_List.hpp:387
typename List::reference Reference
标准库容器公开类型映射
定义 NBT_List.hpp:41
NBT_List(NBT_List &&_Move) noexcept
移动构造函数
定义 NBT_List.hpp:74
typename List::reverse_iterator Reverse_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:47
const List & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_List.hpp:84
List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
在指定位置插入一个元素(拷贝构造)
定义 NBT_List.hpp:325
List::value_type & Get(const typename List::size_type &szPos)
根据位置获取值
定义 NBT_List.hpp:162
List & GetData(void) noexcept
获取底层容器数据的引用
定义 NBT_List.hpp:91
List Super
父类类型
定义 NBT_List.hpp:30
const List::value_type & Back(void) const noexcept
获取列表最后的元素(常量版本)
定义 NBT_List.hpp:223
bool Contains(const typename List::value_type &tValue) const noexcept
检查是否包含指定元素
定义 NBT_List.hpp:402
void ShrinkToFit(void)
缩减容器容量以匹配大小
定义 NBT_List.hpp:393
List::size_type Size(void) const noexcept
获取容器中元素的数量
定义 NBT_List.hpp:380
bool operator==(const NBT_List &_Right) const noexcept
相等比较运算符
定义 NBT_List.hpp:117
typename List::const_reverse_iterator Const_Reverse_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:48
typename List::difference_type Difference_Type
标准库容器公开类型映射
定义 NBT_List.hpp:40
typename List::iterator Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:45
void Merge(NBT_List &&_Move)
移动合并另一个NBT_List的内容
定义 NBT_List.hpp:316
void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
调整容器大小,如果大小大于当前大小,那么使用val填充新增空间,否则删除多余元素
定义 NBT_List.hpp:302
List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
在指定位置插入一个范围内的元素
定义 NBT_List.hpp:355
std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
三路比较运算符
定义 NBT_List.hpp:133
const List::value_type & Front(void) const noexcept
获取列表开头的元素(常量版本)
定义 NBT_List.hpp:207
typename List::value_type Value_Type
标准库容器公开类型映射
定义 NBT_List.hpp:37
void Clear(void)
清空所有元素
定义 NBT_List.hpp:287
void Merge(const NBT_List &_Copy)
拷贝合并另一个NBT_List的内容
定义 NBT_List.hpp:309
NBT_List(Args &&... args)
构造函数
定义 NBT_List.hpp:59
void Resize(typename List::size_type szNewSize)
调整容器大小,如果大小大于当前大小,那么使用默认值填充新增空间,否则删除多余元素
定义 NBT_List.hpp:294
NBT_List(const NBT_List &_Copy)
拷贝构造函数
定义 NBT_List.hpp:79
List::value_type & Back(void) noexcept
获取列表最后的元素
定义 NBT_List.hpp:215
NBT_List(void)=default
默认构造函数
List::value_type & Set(typename List::size_type szPos, V &&vTagVal)
设置(替换)指定位置的元素
定义 NBT_List.hpp:273
NBT_List(std::initializer_list< typename List::value_type > init)
初始化列表构造函数
定义 NBT_List.hpp:64
~NBT_List(void)=default
析构函数
List::value_type & Front(void) noexcept
获取列表开头的元素
定义 NBT_List.hpp:199
List::value_type & AddFront(V &&vTagVal)
在列表头部插入元素
定义 NBT_List.hpp:251
typename List::pointer Pointer
标准库容器公开类型映射
定义 NBT_List.hpp:43
typename List::const_iterator Const_Iterator
标准库容器公开类型映射
定义 NBT_List.hpp:46
List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
在指定位置插入count个相同的元素
定义 NBT_List.hpp:344
bool operator!=(const NBT_List &_Right) const noexcept
不等比较运算符
定义 NBT_List.hpp:125
List::value_type * Has(const typename List::size_type &szPos) noexcept
根据位置查找值
定义 NBT_List.hpp:179
NBT_List & operator=(const NBT_List &_Copy)
拷贝赋值运算符
定义 NBT_List.hpp:108
void Remove(typename List::size_type szPos)
删除指定位置的元素
定义 NBT_List.hpp:280
bool ContainsIf(Predicate pred) const noexcept
使用谓词检查是否存在满足条件的元素
定义 NBT_List.hpp:413
List::value_type & AddBack(V &&vTagVal)
在列表末尾插入元素
定义 NBT_List.hpp:261
const List::value_type * Has(const typename List::size_type &szPos) const noexcept
根据位置查找值(常量版本)
定义 NBT_List.hpp:189
const List::value_type & Get(const typename List::size_type &szPos) const
根据位置获取值(常量版本)
定义 NBT_List.hpp:171
NBT_List & operator=(NBT_List &&_Move) noexcept
移动赋值运算符
定义 NBT_List.hpp:99
List::iterator Insert(typename List::const_iterator itPos, std::initializer_list< typename List::value_type > ilistValue)
在指定位置插入初始化列表中的元素
定义 NBT_List.hpp:364
typename List::const_reference Const_Reference
标准库容器公开类型映射
定义 NBT_List.hpp:42
这个类用于提供从NBT二进制流读取到NBT_Type::Compound对象的反序列化功能
定义 NBT_Reader.hpp:23
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:23
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:456