chenjunfu2-nbt-cpp v2.1.3
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Visitor.hpp
浏览该文件的文档.
1#pragma once
2
3#include "NBT_Node.hpp"
4#include "NBT_Print.hpp"
5
6#include <stdint.h>
7#include <vector>
8
11
12
14enum class NBT_Visitor_ResultControl : uint8_t
15{
19};
20
29
30
35{
36public:
39
40public:
45 template<typename T>
48 {
49 //do something...
50 return ResultControl::Continue;
51 }
52
57 template<typename T>
58 requires(NBT_Type::IsArrayType_V<T> && !std::is_reference_v<T>)//防止引用折叠
60 {
61 //do something...
62 return ResultControl::Continue;
63 }
64
69 {
70 //do something...
71 return ResultControl::Continue;
72 }
73
78 {
79 //do something...
80 return ResultControl::Continue;
81 }
82
87 ResultControl VisitListBegin(NBT_TAG enListElementTag, size_t szListLength)
88 {
89 //do something...
90 return ResultControl::Continue;
91 }
92
97 NestingControl VisitListElementBegin(NBT_TAG enListElementTag, size_t szListIndex)
98 {
99 //do something...
100 return NestingControl::Enter;
101 }
102
107 ResultControl VisitListElementEnd(NBT_TAG enListElementTag, size_t szListIndex)
108 {
109 //do something...
110 return ResultControl::Continue;
111 }
112
116 {
117 //do something...
118 return ResultControl::Continue;
119 }
120
124 {
125 //do something...
126 return ResultControl::Continue;
127 }
128
133 {
134 //do something...
135 return NestingControl::Enter;
136 }
137
143 {
144 //do something...
145 return NestingControl::Enter;
146 }
147
153 {
154 //do something...
155 return ResultControl::Continue;
156 }
157
161 {
162 //do something...
163 return ResultControl::Continue;
164 }
165
167 void VisitBegin(void)
168 {
169 //do something...
170 return;
171 }
172
174 void VisitEnd(void)
175 {
176 //do something...
177 return;
178 }
179
186 template<typename... Args>
187 void VisitError(NBT_Print_Level lvl, const std::format_string<Args...> fmt, Args&&... args) noexcept
188 {
189 //throw or print error
190 return;
191 }
192};
193
199template <typename T>
201requires(
202 T visitor,
203 NBT_Visitor nbt_visitor,
204
205 NBT_Type::Byte nbt_byte,
206 NBT_Type::Short nbt_short,
207 NBT_Type::Int nbt_int,
208 NBT_Type::Long nbt_long,
209 NBT_Type::Float nbt_float,
210 NBT_Type::Double nbt_double,
211
212 NBT_TAG nbt_tag,
213 size_t nbt_list_length,
214 size_t nbt_list_index,
215
216 NBT_Type::ByteArray nbt_bytearray,
217 NBT_Type::IntArray nbt_intarray,
218 NBT_Type::LongArray nbt_longarray,
219 NBT_Type::String nbt_string,
220 NBT_Print_Level nbt_print_level
221 )
222{
223 //数值类型访问方法
224 {
225 visitor.VisitNumericResult(nbt_byte)
226 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_byte))>;
227 {
228 visitor.VisitNumericResult(nbt_short)
229 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_short))>;
230 {
231 visitor.VisitNumericResult(nbt_int)
232 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_int))>;
233 {
234 visitor.VisitNumericResult(nbt_long)
235 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_long))>;
236 {
237 visitor.VisitNumericResult(nbt_float)
238 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_float))>;
239 {
240 visitor.VisitNumericResult(nbt_double)
241 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(nbt_double))>;
242
243 //数组类型访问方法
244 {
245 visitor.VisitArrayResult(std::move(nbt_bytearray))
246 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(std::move(nbt_bytearray)))>;
247 {
248 visitor.VisitArrayResult(std::move(nbt_intarray))
249 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(std::move(nbt_intarray)))>;
250 {
251 visitor.VisitArrayResult(std::move(nbt_longarray))
252 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(std::move(nbt_longarray)))>;
253
254 //字符串访问方法
255 {
256 visitor.VisitStringResult(std::move(nbt_string))
257 } -> std::same_as<decltype(nbt_visitor.VisitStringResult(std::move(nbt_string)))>;
258
259 //结束标记访问方法
260 {
261 visitor.VisitEndResult()
262 } -> std::same_as<decltype(nbt_visitor.VisitEndResult())>;
263
264
265 //List相关方法
266 {
267 visitor.VisitListBegin(nbt_tag, nbt_list_length)
268 } -> std::same_as<decltype(nbt_visitor.VisitListBegin(nbt_tag, nbt_list_length))>;
269 {
270 visitor.VisitListElementBegin(nbt_tag, nbt_list_index)
271 } -> std::same_as<decltype(nbt_visitor.VisitListElementBegin(nbt_tag, nbt_list_index))>;
272 {
273 visitor.VisitListElementEnd(nbt_tag, nbt_list_index)
274 } -> std::same_as<decltype(nbt_visitor.VisitListElementEnd(nbt_tag, nbt_list_index))>;
275 {
276 visitor.VisitListEnd()
277 } -> std::same_as<decltype(nbt_visitor.VisitListEnd())>;
278
279 //Compound相关方法
280 {
281 visitor.VisitCompoundBegin()
282 } -> std::same_as<decltype(nbt_visitor.VisitCompoundBegin())>;
283 {
284 visitor.VisitCompoundNextEntryType(nbt_tag)
285 } -> std::same_as<decltype(nbt_visitor.VisitCompoundNextEntryType(nbt_tag))>;
286 {
287 visitor.VisitCompoundEntryBegin(nbt_tag, std::move(nbt_string))
288 } -> std::same_as<decltype(nbt_visitor.VisitCompoundEntryBegin(nbt_tag, std::move(nbt_string)))>;
289 {
290 visitor.VisitCompoundEntryEnd(nbt_tag, std::move(nbt_string))
291 } -> std::same_as<decltype(nbt_visitor.VisitCompoundEntryEnd(nbt_tag, std::move(nbt_string)))>;
292 {
293 visitor.VisitCompoundEnd()
294 } -> std::same_as<decltype(nbt_visitor.VisitCompoundEnd())>;
295
296 //开始/结束方法
297 {
298 visitor.VisitBegin()
299 };
300 {
301 visitor.VisitEnd()
302 };
303
304 //错误处理(不完全验证)
305 {
306 visitor.VisitError(nbt_print_level, "error message")
307 };
308 {
309 visitor.VisitError(nbt_print_level, "error with code: {}", 0)
310 };
311 {
312 visitor.VisitError(nbt_print_level, "error with info: {}", "test info")
313 };
314};
315
317
321class NBT_Visitor_Collector
322{
323protected:
325 struct Frame
326 {
328 enum class Type : uint8_t
329 {
330 Compound,
331 List,
332 };
333
334 public:
336 union
337 {
340 };
341 };
342
343protected:
345 std::vector<Frame> vStack{};
347
348protected:
354 template<typename T>
355 bool AppendStackTop(T &&tVal)
356 {
357 if (vStack.empty())
358 {
359 return false;
360 }
361
362 void *pNewElement = NULL;
363
364 Frame &stTopFrame = vStack.back();
365 switch (stTopFrame.enType)
366 {
368 {
369 if (stTopFrame.pCompound == NULL)
370 {
371 return false;
372 }
373
374 //尝试插入,遇到重复则替换
375 auto [it, b] = stTopFrame.pCompound->Put(std::move(sPendingKey), std::forward<T>(tVal));
376 pNewElement = (void*)&(it->second);
377 }
378 break;
380 {
381 if (stTopFrame.pList == NULL)
382 {
383 return false;
384 }
385
386 pNewElement = (void*)&stTopFrame.pList->AddBack(std::forward<T>(tVal));
387 }
388 break;
389 default:
390 return false;
391 break;
392 }
393
394 if constexpr (NBT_Type::IsCompoundType_V<T>)
395 {
396 vStack.push_back(
397 Frame
398 {
399 .enType = Frame::Type::Compound,
400 .pCompound = (NBT_Type::Compound *)pNewElement,
401 }
402 );
403 }
404 else if constexpr (NBT_Type::IsListType_V<T>)
405 {
406 vStack.push_back(
407 Frame
408 {
409 .enType = Frame::Type::List,
410 .pList = (NBT_Type::List *)pNewElement,
411 }
412 );
413 }
414
415 return true;
416 }
417
421 bool PopStack(Frame::Type enTypeRequires)
422 {
423 if (vStack.empty())
424 {
425 return false;
426 }
427
428 if (vStack.back().enType != enTypeRequires)
429 {
430 return false;
431 }
432
433 vStack.pop_back();
434 return true;
435 }
436
437public:
438 NBT_Visitor_Collector(void) = default;
439 ~NBT_Visitor_Collector(void) = default;
440
442 NBT_Visitor_Collector(const NBT_Visitor_Collector &) = delete;
444 NBT_Visitor_Collector(NBT_Visitor_Collector &&) = default;
446 NBT_Visitor_Collector &operator=(const NBT_Visitor_Collector &) = delete;
448 NBT_Visitor_Collector &operator=(NBT_Visitor_Collector &&) = default;
449
450public:
453
456 const NBT_Type::Compound &ViewRoot(void) const noexcept
457 {
458 return cpdRoot;
459 }
460
464 {
465 return std::move(cpdRoot);
466 }
467
468public:
470 template<typename T>
473 {
474 if (!AppendStackTop(tNumericResult))
475 {
476 return ResultControl::Stop;
477 }
478 return ResultControl::Continue;
479 }
480
482 template<typename T>
483 requires(NBT_Type::IsArrayType_V<T> && !std::is_reference_v<T>)//防止引用折叠
485 {
486 if (!AppendStackTop(tArrayResult))
487 {
488 return ResultControl::Stop;
489 }
490 return ResultControl::Continue;
491 }
492
495 {
496 if (!AppendStackTop(strResult))
497 {
498 return ResultControl::Stop;
499 }
500 return ResultControl::Continue;
501 }
502
505 {
507 {
508 return ResultControl::Stop;
509 }
510 return ResultControl::Continue;
511 }
512
514 ResultControl VisitListBegin(NBT_TAG enListElementTag, size_t szListLength)
515 {
516 NBT_Type::List tmpList{};
517 tmpList.Reserve(szListLength);
518
519 if (!AppendStackTop(std::move(tmpList)))
520 {
521 return ResultControl::Stop;
522 }
523 return ResultControl::Continue;
524 }
525
527 NestingControl VisitListElementBegin(NBT_TAG enListElementTag, size_t szListIndex)
528 {
529 return NestingControl::Enter;
530 }
531
533 ResultControl VisitListElementEnd(NBT_TAG enListElementTag, size_t szListIndex)
534 {
535 return ResultControl::Continue;
536 }
537
540 {
542 {
543 return ResultControl::Stop;
544 }
545 return ResultControl::Continue;
546 }
547
550 {
552 {
553 return ResultControl::Stop;
554 }
555 return ResultControl::Continue;
556 }
557
560 {
561 return NestingControl::Enter;
562 }
563
566 {
567 sPendingKey = sName;
568 return NestingControl::Enter;
569 }
570
573 {
574 return ResultControl::Continue;
575 }
576
579 {
581 {
582 return ResultControl::Stop;
583 }
584 return ResultControl::Continue;
585 }
586
589 void VisitBegin(void)
590 {
591 vStack.clear();
592 vStack.push_back(
593 Frame
594 {
595 .enType = Frame::Type::Compound,
596 .pCompound = &cpdRoot,
597 }
598 );
599 sPendingKey.clear();
600 //cpdRoot.Clear();//不清理,方便拼接,用户需要可自行清理
601 return;
602 }
603
605 void VisitEnd(void)
606 {
607 vStack.pop_back();
608 vStack.clear();
609 vStack.shrink_to_fit();
610 return;
611 }
612
614 template<typename... Args>
615 void VisitError(NBT_Print_Level lvl, const std::format_string<Args...> fmt, Args&&... args) noexcept
616 {
617 NBT_Print{}(lvl, fmt, std::forward<Args>(args)...);
618 return;
619 }
620};
621
NBT节点类型,支持存储所有NBT类型的变体
用于处理NBT信息打印的默认实现
NBT_Print_Level
用于指示信息打印等级的枚举
定义 NBT_Print.hpp:11
NBT_TAG
枚举NBT类型对应的类型标签值
定义 NBT_TAG.hpp:17
NBT_Visitor_ResultControl
控制流返回码(用于普通回调)
定义 NBT_Visitor.hpp:15
@ Stop
停止处理(终止解析)
定义 NBT_Visitor.hpp:18
@ Continue
继续处理(继续迭代)
定义 NBT_Visitor.hpp:16
@ Break
跳过剩余值(离开当前结构层级回到父层级)
定义 NBT_Visitor.hpp:17
NBT_Visitor_NestingControl
控制流返回码(用于嵌套结构回调)
定义 NBT_Visitor.hpp:23
@ Skip
跳过当前值(跳过递归进入嵌套结构或展开值)
定义 NBT_Visitor.hpp:25
@ Enter
进入当前值(递归进入嵌套结构或展开值)
定义 NBT_Visitor.hpp:24
std::pair< typename Compound::iterator, bool > Put(K &&sTagName, V &&vTagVal)
插入或替换键值对
定义 NBT_Compound.hpp:312
void Reserve(typename List::size_type szNewCap)
预留存储空间
定义 NBT_List.hpp:377
List::value_type & AddBack(V &&vTagVal)
在列表末尾插入元素
定义 NBT_List.hpp:251
一个用于打印信息到指定的C文件对象的工具类,作为库内大部分存在信息输出接口的默认实现。 实际可被使用此类为默认值参数的函数的调用方,以类似此类的仿函数参数重写的其它类型替换, 比如调用方实现了一个My_...
定义 NBT_Print.hpp:24
int8_t Byte
8位有符号整数
定义 NBT_Type.hpp:49
static constexpr bool IsNumericType_V
判断类型是否为NBT数值类型(包含所有整数和浮点数类型)
定义 NBT_Type.hpp:261
std::monostate End
结束标记类型,无数据
定义 NBT_Type.hpp:48
int16_t Short
16位有符号整数
定义 NBT_Type.hpp:50
static constexpr bool IsCompoundType_V
判断类型是否为NBT Compound类型
定义 NBT_Type.hpp:325
NBT_String< MUTF8_String, MUTF8_String_View > String
字符串类型,存储Java M-UTF-8字符串
定义 NBT_Type.hpp:65
int64_t Long
64位有符号整数
定义 NBT_Type.hpp:52
NBT_List< std::vector< NBT_Node > > List
列表类型,可顺序存储任意相同的NBT类型
定义 NBT_Type.hpp:69
std::conditional_t<(sizeof(float)==sizeof(Float_Raw)), float, Float_Raw > Float
单精度浮点类型
定义 NBT_Type.hpp:56
NBT_Array< std::vector< Byte > > ByteArray
存储 8位有符号整数的数组类型
定义 NBT_Type.hpp:60
NBT_Array< std::vector< Int > > IntArray
存储32位有符号整数的数组类型
定义 NBT_Type.hpp:61
NBT_Compound< std::unordered_map< String, NBT_Node > > Compound
集合类型,可存储任意不同的NBT类型,通过名称映射值
定义 NBT_Type.hpp:73
NBT_Array< std::vector< Long > > LongArray
存储64位有符号整数的数组类型
定义 NBT_Type.hpp:62
std::conditional_t<(sizeof(double)==sizeof(Double_Raw)), double, Double_Raw > Double
双精度浮点类型
定义 NBT_Type.hpp:57
static constexpr bool IsArrayType_V
判断类型是否为NBT数组类型(包含所有数组类型)
定义 NBT_Type.hpp:291
static constexpr bool IsListType_V
判断类型是否为NBT List类型
定义 NBT_Type.hpp:318
int32_t Int
32位有符号整数
定义 NBT_Type.hpp:51
NBT 数据收集器,实现访问器接口,将扫描结果构建为完整的 Compound 树
定义 NBT_Visitor.hpp:322
std::vector< Frame > vStack
栈,记录当前嵌套的容器
定义 NBT_Visitor.hpp:345
NBT_Visitor_Collector(NBT_Visitor_Collector &&)=default
默认移动构造函数
ResultControl VisitListElementEnd(NBT_TAG enListElementTag, size_t szListIndex)
结束处理 List 中的一个元素
定义 NBT_Visitor.hpp:533
const NBT_Type::Compound & ViewRoot(void) const noexcept
获取根节点的常量引用
定义 NBT_Visitor.hpp:456
void VisitError(NBT_Print_Level lvl, const std::format_string< Args... > fmt, Args &&... args) noexcept
错误处理回调
定义 NBT_Visitor.hpp:615
NBT_Visitor_Collector & operator=(NBT_Visitor_Collector &&)=default
默认移动赋值运算符
ResultControl VisitStringResult(NBT_Type::String &&strResult)
处理字符串类型节点
定义 NBT_Visitor.hpp:494
ResultControl VisitCompoundEnd(void)
定义 NBT_Visitor.hpp:578
ResultControl VisitListEnd(void)
定义 NBT_Visitor.hpp:539
ResultControl VisitListBegin(NBT_TAG enListElementTag, size_t szListLength)
定义 NBT_Visitor.hpp:514
ResultControl VisitArrayResult(T &&tArrayResult)
处理数组类型节点(ByteArray/IntArray/LongArray)
定义 NBT_Visitor.hpp:484
bool PopStack(Frame::Type enTypeRequires)
弹出栈顶,并检查类型是否匹配
定义 NBT_Visitor.hpp:421
ResultControl VisitEndResult(void)
处理 End 标记节点
定义 NBT_Visitor.hpp:504
bool AppendStackTop(T &&tVal)
将值追加到当前栈顶的容器中
定义 NBT_Visitor.hpp:355
NBT_Type::String sPendingKey
暂存的键名,用于插入 Compound
定义 NBT_Visitor.hpp:344
NBT_Visitor_NestingControl NestingControl
控制流返回码(嵌套结构入口回调),直接映射 NBT_Visitor_NestingControl
定义 NBT_Visitor.hpp:452
NBT_Type::Compound && MoveRoot(void) noexcept
移动根节点(获取所有权)
定义 NBT_Visitor.hpp:463
NestingControl VisitListElementBegin(NBT_TAG enListElementTag, size_t szListIndex)
开始处理 List 中的一个元素
定义 NBT_Visitor.hpp:527
void VisitEnd(void)
整体扫描结束:清理栈帧
定义 NBT_Visitor.hpp:605
NBT_Visitor_Collector(const NBT_Visitor_Collector &)=delete
禁用拷贝构造函数
NestingControl VisitCompoundNextEntryType(NBT_TAG enCompoundEntryTag)
在 Compound 中,开始处理下一个条目之前,仅提供类型信息
定义 NBT_Visitor.hpp:559
ResultControl VisitNumericResult(T tNumericResult)
处理数值类型节点
定义 NBT_Visitor.hpp:472
void VisitBegin(void)
整体扫描开始:初始化栈,将根节点设为当前帧
定义 NBT_Visitor.hpp:589
NestingControl VisitCompoundEntryBegin(NBT_TAG enCompoundEntryTag, NBT_Type::String &&sName)
定义 NBT_Visitor.hpp:565
ResultControl VisitCompoundBegin(void)
定义 NBT_Visitor.hpp:549
NBT_Type::Compound cpdRoot
根 Compound 节点
定义 NBT_Visitor.hpp:346
ResultControl VisitCompoundEntryEnd(NBT_TAG enCompoundEntryTag, NBT_Type::String &&sName)
结束处理 Compound 中的一个条目
定义 NBT_Visitor.hpp:572
NBT_Visitor_Collector & operator=(const NBT_Visitor_Collector &)=delete
禁用拷贝赋值运算符
NBT_Visitor_ResultControl ResultControl
控制流返回码(普通回调),直接映射 NBT_Visitor_ResultControl
定义 NBT_Visitor.hpp:451
提示性实现类(鸭子类型),仅用于模板通过性验证与用户接口提示
定义 NBT_Visitor.hpp:35
void VisitError(NBT_Print_Level lvl, const std::format_string< Args... > fmt, Args &&... args) noexcept
错误处理回调
定义 NBT_Visitor.hpp:187
NestingControl VisitListElementBegin(NBT_TAG enListElementTag, size_t szListIndex)
开始处理 List 中的一个元素
定义 NBT_Visitor.hpp:97
NestingControl VisitCompoundEntryBegin(NBT_TAG enCompoundEntryTag, NBT_Type::String &&sName)
开始处理 Compound 中的一个条目(键值对)
定义 NBT_Visitor.hpp:142
ResultControl VisitCompoundEnd(void)
结束处理整个 Compound 节点
定义 NBT_Visitor.hpp:160
ResultControl VisitArrayResult(T &&tArrayResult)
处理数组类型节点(ByteArray/IntArray/LongArray)
定义 NBT_Visitor.hpp:59
ResultControl VisitListBegin(NBT_TAG enListElementTag, size_t szListLength)
开始处理一个 List 节点
定义 NBT_Visitor.hpp:87
ResultControl VisitListEnd(void)
结束处理整个 List 节点
定义 NBT_Visitor.hpp:115
void VisitBegin(void)
整个 NBT 扫描开始回调(根部调用)
定义 NBT_Visitor.hpp:167
ResultControl VisitListElementEnd(NBT_TAG enListElementTag, size_t szListIndex)
结束处理 List 中的一个元素
定义 NBT_Visitor.hpp:107
NBT_Visitor_ResultControl ResultControl
控制流返回码(普通回调),直接映射 NBT_Visitor_ResultControl
定义 NBT_Visitor.hpp:37
ResultControl VisitEndResult(void)
处理 End 标记节点
定义 NBT_Visitor.hpp:77
NestingControl VisitCompoundNextEntryType(NBT_TAG enCompoundEntryTag)
在 Compound 中,开始处理下一个条目之前,仅提供类型信息
定义 NBT_Visitor.hpp:132
void VisitEnd(void)
整个 NBT 扫描结束回调(根部调用)
定义 NBT_Visitor.hpp:174
ResultControl VisitNumericResult(T tNumericResult)
处理数值类型节点
定义 NBT_Visitor.hpp:47
NBT_Visitor_NestingControl NestingControl
控制流返回码(嵌套结构入口回调),直接映射 NBT_Visitor_NestingControl
定义 NBT_Visitor.hpp:38
ResultControl VisitStringResult(NBT_Type::String &&strResult)
处理字符串类型节点
定义 NBT_Visitor.hpp:68
ResultControl VisitCompoundEntryEnd(NBT_TAG enCompoundEntryTag, NBT_Type::String &&sName)
结束处理 Compound 中的一个条目
定义 NBT_Visitor.hpp:152
ResultControl VisitCompoundBegin(void)
开始处理一个 Compound 节点
定义 NBT_Visitor.hpp:123
检查类型是否符合 NBT 访问器(Visitor)的接口要求
定义 NBT_Visitor.hpp:200
栈帧
定义 NBT_Visitor.hpp:326
Type
帧的容器类型
定义 NBT_Visitor.hpp:329
@ Compound
当前存储的是 Compound 类型
定义 NBT_Visitor.hpp:330
@ List
当前存储的是 List 类型
定义 NBT_Visitor.hpp:331
NBT_Type::Compound * pCompound
当前存储的 Compound 容器指针
定义 NBT_Visitor.hpp:338
Type enType
当前帧的容器类型
定义 NBT_Visitor.hpp:335
NBT_Type::List * pList
当前存储的 List 容器指针
定义 NBT_Visitor.hpp:339