chenjunfu2-nbt-cpp v2.1.0
一个基于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:
29 //完美转发、初始化列表代理构造
30
34 template<typename... Args>
35 NBT_List(Args&&... args) : List(std::forward<Args>(args)...)
36 {}
37
40 NBT_List(std::initializer_list<typename List::value_type> init) : List(init)
41 {}
42
44 NBT_List(void) = default;
46 ~NBT_List(void) = default;
47
50 NBT_List(NBT_List &&_Move) noexcept :List(std::move(_Move))
51 {}
52
55 NBT_List(const NBT_List &_Copy) :List(_Copy)
56 {}
57
61 NBT_List &operator=(NBT_List &&_Move) noexcept
62 {
63 List::operator=(std::move(_Move));
64 return *this;
65 }
66
71 {
72 List::operator=(_Copy);
73 return *this;
74 }
75
78 const List &GetData(void) const noexcept
79 {
80 return *this;
81 }
82
86 bool operator==(const NBT_List &_Right) const noexcept
87 {
88 return (const List &)*this == (const List &)_Right;
89 }
90
94 bool operator!=(const NBT_List &_Right) const noexcept
95 {
96 return (const List &)*this != (const List &)_Right;
97 }
98
102 std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
103 {
104 return (const List &)*this <=> (const List &)_Right;
105 }
106
110
111 using List::begin;
112 using List::end;
113 using List::cbegin;
114 using List::cend;
115 using List::rbegin;
116 using List::rend;
117 using List::crbegin;
118 using List::crend;
119 using List::operator[];
120
122
126
131 typename List::value_type &Get(const typename List::size_type &szPos)
132 {
133 return List::at(szPos);
134 }
135
140 const typename List::value_type &Get(const typename List::size_type &szPos) const
141 {
142 return List::at(szPos);
143 }
144
148 typename List::value_type *Has(const typename List::size_type &szPos) noexcept
149 {
150 return szPos < List::size()
151 ? &List::operator[](szPos)
152 : NULL;
153 }
154
158 const typename List::value_type *Has(const typename List::size_type &szPos) const noexcept
159 {
160 return szPos < List::size()
161 ? &List::operator[](szPos)
162 : NULL;
163 }
164
168 typename List::value_type &Front(void) noexcept
169 {
170 return List::front();
171 }
172
176 const typename List::value_type &Front(void) const noexcept
177 {
178 return List::front();
179 }
180
184 typename List::value_type &Back(void) noexcept
185 {
186 return List::back();
187 }
188
192 const typename List::value_type &Back(void) const noexcept
193 {
194 return List::back();
195 }
196
198
202
209 template <typename V>
210 typename List::value_type &Add(typename List::size_type szPos, V &&vTagVal)
211 {
212 return *List::emplace(List::begin() + szPos, std::forward<V>(vTagVal));//插入
213 }
214
219 template <typename V>
220 typename List::value_type &AddFront(V &&vTagVal)
221 {
222 return *List::emplace(List::begin(), std::forward<V>(vTagVal));//插入
223 }
224
229 template <typename V>
230 typename List::value_type &AddBack(V &&vTagVal)
231 {
232 return List::emplace_back(std::forward<V>(vTagVal));
233 }
234
241 template <typename V>
242 typename List::value_type &Set(typename List::size_type szPos, V &&vTagVal)
243 {
244 return List::operator[](szPos) = std::forward<V>(vTagVal);
245 }
246
249 void Remove(typename List::size_type szPos)
250 {
251 List::erase(List::begin() + szPos);//这个没必要返回结果,直接丢弃
252 }
253
256 void Clear(void)
257 {
258 List::clear();
259 }
260
263 void Resize(typename List::size_type szNewSize)
264 {
265 return List::resize(szNewSize);
266 }
267
271 void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
272 {
273 return List::resize(szNewSize, value);
274 }
275
278 void Merge(const NBT_List &_Copy)
279 {
280 List::insert(List::end(), _Copy.begin(), _Copy.end());
281 }
282
285 void Merge(NBT_List &&_Move)
286 {
287 List::insert(List::end(), std::make_move_iterator(_Move.begin()), std::make_move_iterator(_Move.end()));
288 }
289
294 typename List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
295 {
296 return List::insert(itPos, value);
297 }
298
303 typename List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
304 {
305 return List::insert(itPos, std::move(value));
306 }
307
313 typename List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
314 {
315 return List::insert(itPos, szCount, value);
316 }
317
323 template<typename InputIt>
324 typename List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
325 {
326 return List::insert(itPos, itFirst, itLast);
327 }
328
333 typename List::iterator Insert(typename List::const_iterator itPos, std::initializer_list<typename List::value_type> ilistValue)
334 {
335 return List::insert(itPos, ilistValue);
336 }
337
339
342 bool Empty(void) const noexcept
343 {
344 return List::empty();
345 }
346
349 typename List::size_type Size(void) const noexcept
350 {
351 return List::size();
352 }
353
356 void Reserve(typename List::size_type szNewCap)
357 {
358 return List::reserve(szNewCap);
359 }
360
362 void ShrinkToFit(void)
363 {
364 return List::shrink_to_fit();
365 }
366
371 bool Contains(const typename List::value_type &tValue) const noexcept
372 {
373 return std::find(List::begin(), List::end(), tValue) != List::end();
374 }
375
381 template<typename Predicate>
382 bool ContainsIf(Predicate pred) const noexcept
383 {
384 return std::find_if(List::begin(), List::end(), pred) != List::end();
385 }
386
390#define TYPE_GET_FUNC(type)\
391\
398const typename NBT_Type::type &Get##type(const typename List::size_type &szPos) const\
399{\
400 return List::at(szPos).Get##type();\
401}\
402\
403\
410typename NBT_Type::type &Get##type(const typename List::size_type &szPos)\
411{\
412 return List::at(szPos).Get##type();\
413}\
414\
415\
420const typename NBT_Type::type *Has##type(const typename List::size_type &szPos) const noexcept\
421{\
422 auto *p = Has(szPos);\
423 return p != NULL && p->Is##type()\
424 ? &p->Get##type()\
425 : NULL;\
426}\
427\
428\
433typename NBT_Type::type *Has##type(const typename List::size_type &szPos) noexcept\
434{\
435 auto *p = Has(szPos);\
436 return p != NULL && p->Is##type()\
437 ? &p->Get##type()\
438 : NULL;\
439}\
440\
441
443\
447const typename NBT_Type::type &Front##type(void) const\
448{\
449 return List::front().Get##type(); \
450}\
451\
452\
458typename NBT_Type::type &Front##type(void)\
459 {\
460 return List::front().Get##type(); \
461 }\
468const typename NBT_Type::type &Back##type(void) const\
469{\
470 return List::back().Get##type();\
471}\
472\
473
474 @brief 获取列表最后一个 type 类型数据
475 @return type 类型数据的引用
476 @note 如果列表为空或类型不匹配则抛出异常,
477 具体请参考std::vector关于back的说明与std::get的说明
478 */\
479typename NBT_Type::type &Back##type(void)\
480{\
481 return List::back().Get##type();\
482}
483
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_PUT_FUNC(type)\
515\
521typename List::value_type &Add##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
522{\
523 return Add(szPos, vTagVal);\
524}\
525\
526\
533typename List::value_type & Add##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
535 return Add(szPos, std::move(vTagVal));\
544typename List::value_type &AddFront##type(const typename NBT_Type::type &vTagVal)\
545{\
546 return AddFront(vTagVal); \
547}\
548\
549\
555typename List::value_type & AddFront##type(typename NBT_Type::type &&vTagVal)\
556{\
557 return AddFront(std::move(vTagVal));\
558}\
559\
560\
566typename List::value_type &AddBack##type(const typename NBT_Type::type &vTagVal)\
567{\
568 return AddBack(vTagVal);\
569}\
570\
571\
577typename List::value_type &AddBack##type(typename NBT_Type::type &&vTagVal)\
578{\
579 return AddBack(std::move(vTagVal));\
580}\
581\
582\
589typename List::value_type &Set##type(typename List::size_type szPos, const typename NBT_Type::type &vTagVal)\
590{\
591 return Set(szPos, vTagVal);\
592}\
593\
594\
601typename List::value_type &Set##type(typename List::size_type szPos, typename NBT_Type::type &&vTagVal)\
602{\
603 return Set(szPos, std::move(vTagVal));\
604}
605
613
624 TYPE_PUT_FUNC(String);
625 TYPE_PUT_FUNC(List);
626 TYPE_PUT_FUNC(Compound);
627
629
630#undef TYPE_PUT_FUNC
631};
#define TYPE_PUT_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:474
#define TYPE_GET_FUNC(type)
不同类型名接口生成宏
定义 NBT_List.hpp:390
@ 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
List::iterator Insert(typename List::const_iterator itPos, typename List::value_type &&value)
在指定位置插入一个元素(移动构造)
定义 NBT_List.hpp:303
bool Empty(void) const noexcept
检查容器是否为空
定义 NBT_List.hpp:342
List::value_type & Add(typename List::size_type szPos, V &&vTagVal)
在指定位置的前面插入元素
定义 NBT_List.hpp:210
void Reserve(typename List::size_type szNewCap)
预留存储空间
定义 NBT_List.hpp:356
NBT_List(NBT_List &&_Move) noexcept
移动构造函数
定义 NBT_List.hpp:50
const List & GetData(void) const noexcept
获取底层容器数据的常量引用
定义 NBT_List.hpp:78
List::iterator Insert(typename List::const_iterator itPos, const typename List::value_type &value)
在指定位置插入一个元素(拷贝构造)
定义 NBT_List.hpp:294
List::value_type & Get(const typename List::size_type &szPos)
根据位置获取值
定义 NBT_List.hpp:131
const List::value_type & Back(void) const noexcept
获取列表最后的元素(常量版本)
定义 NBT_List.hpp:192
bool Contains(const typename List::value_type &tValue) const noexcept
检查是否包含指定元素
定义 NBT_List.hpp:371
void ShrinkToFit(void)
缩减容器容量以匹配大小
定义 NBT_List.hpp:362
List::size_type Size(void) const noexcept
获取容器中元素的数量
定义 NBT_List.hpp:349
bool operator==(const NBT_List &_Right) const noexcept
相等比较运算符
定义 NBT_List.hpp:86
void Merge(NBT_List &&_Move)
移动合并另一个NBT_List的内容
定义 NBT_List.hpp:285
void Resize(typename List::size_type szNewSize, const typename List::value_type &value)
调整容器大小,如果大小大于当前大小,那么使用val填充新增空间,否则删除多余元素
定义 NBT_List.hpp:271
List::iterator Insert(typename List::const_iterator itPos, InputIt itFirst, InputIt itLast)
在指定位置插入一个范围内的元素
定义 NBT_List.hpp:324
std::partial_ordering operator<=>(const NBT_List &_Right) const noexcept
三路比较运算符
定义 NBT_List.hpp:102
const List::value_type & Front(void) const noexcept
获取列表开头的元素(常量版本)
定义 NBT_List.hpp:176
void Clear(void)
清空所有元素
定义 NBT_List.hpp:256
void Merge(const NBT_List &_Copy)
拷贝合并另一个NBT_List的内容
定义 NBT_List.hpp:278
NBT_List(Args &&... args)
构造函数
定义 NBT_List.hpp:35
void Resize(typename List::size_type szNewSize)
调整容器大小,如果大小大于当前大小,那么使用默认值填充新增空间,否则删除多余元素
定义 NBT_List.hpp:263
NBT_List(const NBT_List &_Copy)
拷贝构造函数
定义 NBT_List.hpp:55
List::value_type & Back(void) noexcept
获取列表最后的元素
定义 NBT_List.hpp:184
NBT_List(void)=default
默认构造函数
List::value_type & Set(typename List::size_type szPos, V &&vTagVal)
设置(替换)指定位置的元素
定义 NBT_List.hpp:242
NBT_List(std::initializer_list< typename List::value_type > init)
初始化列表构造函数
定义 NBT_List.hpp:40
~NBT_List(void)=default
析构函数
List::value_type & Front(void) noexcept
获取列表开头的元素
定义 NBT_List.hpp:168
List::value_type & AddFront(V &&vTagVal)
在列表头部插入元素
定义 NBT_List.hpp:220
List::iterator Insert(typename List::const_iterator itPos, typename List::size_type szCount, const typename List::value_type &value)
在指定位置插入count个相同的元素
定义 NBT_List.hpp:313
bool operator!=(const NBT_List &_Right) const noexcept
不等比较运算符
定义 NBT_List.hpp:94
List::value_type * Has(const typename List::size_type &szPos) noexcept
根据位置查找值
定义 NBT_List.hpp:148
NBT_List & operator=(const NBT_List &_Copy)
拷贝赋值运算符
定义 NBT_List.hpp:70
void Remove(typename List::size_type szPos)
删除指定位置的元素
定义 NBT_List.hpp:249
bool ContainsIf(Predicate pred) const noexcept
使用谓词检查是否存在满足条件的元素
定义 NBT_List.hpp:382
List::value_type & AddBack(V &&vTagVal)
在列表末尾插入元素
定义 NBT_List.hpp:230
const List::value_type * Has(const typename List::size_type &szPos) const noexcept
根据位置查找值(常量版本)
定义 NBT_List.hpp:158
const List::value_type & Get(const typename List::size_type &szPos) const
根据位置获取值(常量版本)
定义 NBT_List.hpp:140
NBT_List & operator=(NBT_List &&_Move) noexcept
移动赋值运算符
定义 NBT_List.hpp:61
List::iterator Insert(typename List::const_iterator itPos, std::initializer_list< typename List::value_type > ilistValue)
在指定位置插入初始化列表中的元素
定义 NBT_List.hpp:333
这个类用于提供从NBT二进制流读取到NBT_Type::Compound对象的反序列化功能
定义 NBT_Reader.hpp:23
这个类用于提供从NBT_Type::Compound对象写出到NBT二进制流的序列化功能
定义 NBT_Writer.hpp:22
在std命名空间中添加类的默认hash特化以便unordered_map等容器自动获取
定义 NBT_String.hpp:428