chenjunfu2-nbt-cpp v2.1.0
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Visitor.hpp
1#pragma once
2
3#include "NBT_Node.hpp"
4
5#include <stdint.h>
6
7//提示性实现类(鸭子类型),仅用于模板通过性验证与用户接口提示
9{
10public:
11 enum class ResultControl : uint8_t
12 {
16 };
17
18 enum class NestingControl : uint8_t
19 {
24 };
25
26public:
27 template<typename T>
29 ResultControl VisitNumericResult(T tNumericResult)
30 {
31 //do something...
33 }
34
35 template<typename T>
37 ResultControl VisitArrayResult(const T &tArrayResult)
38 {
39 //do something...
41 }
42
43 ResultControl VisitStringResult(const NBT_Type::String &strResult)
44 {
45 //do something...
47 }
48
49 ResultControl VisitEndResult(void)
50 {
51 //do something...
53 }
54
55 NestingControl VisitListBegin(NBT_TAG_RAW_TYPE tagElementType, NBT_Type::ListLength i32Length)
56 {
57 //do something...
59 }
60
61 NestingControl VisitListNextElement(NBT_TAG_RAW_TYPE tagElementType, NBT_Type::ListLength i32Index)
62 {
63 //do something...
65 }
66
67 ResultControl VisitListEnd(void)
68 {
69 //do something...
71 }
72
73 NestingControl VisitCompoundBegin(void)
74 {
75 //do something...
77 }
78
79 NestingControl VisitCompoundNextEntryType(NBT_TAG_RAW_TYPE tagEntryType)
80 {
81 //do something...
83 }
84
85 NestingControl VisitCompoundNextEntry(NBT_TAG_RAW_TYPE tagEntryType, const NBT_Type::String &strKey)
86 {
87 //do something...
89 }
90
91 ResultControl VisitCompoundEnd(void)
92 {
93 //do something...
95 }
96
97
98 void VisitBegin(void)
99 {
100 //do something...
101 return;
102 }
103
104 void VisitEnd(void)
105 {
106 //do something...
107 return;
108 }
109};
110
111template <typename T>
113requires(T visitor, NBT_Visitor nbt_visitor)
114{
115 //数值类型访问方法
116 {
117 visitor.VisitNumericResult(NBT_Type::Byte{})
118 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Byte{}))>;
119 {
120 visitor.VisitNumericResult(NBT_Type::Short{})
121 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Short{}))>;
122 {
123 visitor.VisitNumericResult(NBT_Type::Int{})
124 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Int{}))>;
125 {
126 visitor.VisitNumericResult(NBT_Type::Long{})
127 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Long{}))>;
128 {
129 visitor.VisitNumericResult(NBT_Type::Float{})
130 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Float{}))>;
131 {
132 visitor.VisitNumericResult(NBT_Type::Double{})
133 } -> std::same_as<decltype(nbt_visitor.VisitNumericResult(NBT_Type::Double{}))>;
134
135 //数组类型访问方法
136 {
137 visitor.VisitArrayResult(NBT_Type::ByteArray{})
138 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(NBT_Type::ByteArray{}))>;
139 {
140 visitor.VisitArrayResult(NBT_Type::IntArray{})
141 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(NBT_Type::IntArray{}))>;
142 {
143 visitor.VisitArrayResult(NBT_Type::LongArray{})
144 } -> std::same_as<decltype(nbt_visitor.VisitArrayResult(NBT_Type::LongArray{}))>;
145
146 //字符串访问方法
147 {
148 visitor.VisitStringResult(NBT_Type::String{})
149 } -> std::same_as<decltype(nbt_visitor.VisitStringResult(NBT_Type::String{}))>;
150
151 //结束标记访问方法
152 {
153 visitor.VisitEndResult()
154 } -> std::same_as<decltype(nbt_visitor.VisitEndResult())>;
155
156
157 //List相关方法
158 {
159 visitor.VisitListBegin(NBT_TAG_RAW_TYPE{}, NBT_Type::ListLength{})
160 } -> std::same_as<decltype(nbt_visitor.VisitListBegin(NBT_TAG_RAW_TYPE{}, NBT_Type::ListLength{}))>;
161 {
162 visitor.VisitListNextElement(NBT_TAG_RAW_TYPE{}, NBT_Type::ListLength{})
163 } -> std::same_as<decltype(nbt_visitor.VisitListNextElement(NBT_TAG_RAW_TYPE{}, NBT_Type::ListLength{}))>;
164 {
165 visitor.VisitListEnd()
166 } -> std::same_as<decltype(nbt_visitor.VisitListEnd())>;
167
168 //Compound相关方法
169 {
170 visitor.VisitCompoundBegin()
171 } -> std::same_as<decltype(nbt_visitor.VisitCompoundBegin())>;
172 {
173 visitor.VisitCompoundNextEntryType(NBT_TAG_RAW_TYPE{})
174 } -> std::same_as<decltype(nbt_visitor.VisitCompoundNextEntryType(NBT_TAG_RAW_TYPE{}))>;
175 {
176 visitor.VisitCompoundNextEntry(NBT_TAG_RAW_TYPE{}, NBT_Type::String{})
177 } -> std::same_as<decltype(nbt_visitor.VisitCompoundNextEntry(NBT_TAG_RAW_TYPE{}, NBT_Type::String{}))>;
178 {
179 visitor.VisitCompoundEnd()
180 } -> std::same_as<decltype(nbt_visitor.VisitCompoundEnd())>;
181
182 //开始/结束方法
183 {
184 visitor.VisitBegin()
185 };
186 {
187 visitor.VisitEnd()
188 };
189};
190
NBT节点类型,支持存储所有NBT类型的变体
uint8_t NBT_TAG_RAW_TYPE
NBT_TAG的原始类型,用于二进制读写或判断等
定义 NBT_TAG.hpp:12
int8_t Byte
8位有符号整数
定义 NBT_Type.hpp:48
static constexpr bool IsNumericType_V
判断类型是否为NBT数值类型(包含所有整数和浮点数类型)
定义 NBT_Type.hpp:260
int16_t Short
16位有符号整数
定义 NBT_Type.hpp:49
int64_t Long
64位有符号整数
定义 NBT_Type.hpp:51
NBT_String< std::basic_string< uint8_t >, std::basic_string_view< uint8_t > > String
字符串类型,存储Java M-UTF-8字符串
定义 NBT_Type.hpp:64
std::conditional_t<(sizeof(float)==sizeof(Float_Raw)), float, Float_Raw > Float
单精度浮点类型
定义 NBT_Type.hpp:55
NBT_Array< std::vector< Byte > > ByteArray
存储 8位有符号整数的数组类型
定义 NBT_Type.hpp:59
NBT_Array< std::vector< Int > > IntArray
存储32位有符号整数的数组类型
定义 NBT_Type.hpp:60
NBT_Array< std::vector< Long > > LongArray
存储64位有符号整数的数组类型
定义 NBT_Type.hpp:61
int32_t ListLength
列表长度类型
定义 NBT_Type.hpp:138
std::conditional_t<(sizeof(double)==sizeof(Double_Raw)), double, Double_Raw > Double
双精度浮点类型
定义 NBT_Type.hpp:56
static constexpr bool IsArrayType_V
判断类型是否为NBT数组类型(包含所有数组类型)
定义 NBT_Type.hpp:290
int32_t Int
32位有符号整数
定义 NBT_Type.hpp:50
定义 NBT_Visitor.hpp:9
ResultControl
定义 NBT_Visitor.hpp:12
@ Stop
停止处理(终止解析)
定义 NBT_Visitor.hpp:15
@ Continue
继续处理(继续迭代)
定义 NBT_Visitor.hpp:13
@ Break
跳过剩余值(离开当前结构层级回到父层级)
定义 NBT_Visitor.hpp:14
NestingControl
定义 NBT_Visitor.hpp:19
@ Skip
跳过当前值(跳过递归进入嵌套结构或展开值)
定义 NBT_Visitor.hpp:21
@ Enter
进入当前值(递归进入嵌套结构或展开值)
定义 NBT_Visitor.hpp:20
定义 NBT_Visitor.hpp:112