chenjunfu2-nbt-cpp v2.1.0
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Scanner.hpp
1#pragma once
2
3#include "NBT_Reader.hpp"//友元
4#include "NBT_Visitor.hpp"//鸭子类
5#include "NBT_Print.hpp"//打印输出
6#include "NBT_IO.hpp"//IO流
7
8#include <stdint.h>
9
10class NBT_Scanner
11{
13 NBT_Scanner(void) = delete;
15 ~NBT_Scanner(void) = delete;
16
17protected:
19 enum class Control : uint8_t
20 {
21 Continue,
22 Break,
23 Stop,
24 Error,
25 };
26
27 Control ResultControlToControl(NBT_Visitor::ResultControl enResultControl)
28 {
29 switch (enResultControl)
30 {
31 case NBT_Visitor::ResultControl::Continue: return Control::Continue;
32 case NBT_Visitor::ResultControl::Break: return Control::Break;
33 case NBT_Visitor::ResultControl::Stop: return Control::Stop;
34 default: return Control::Error;
35 }
36 }
37
38 template<bool bNoCheck = false, typename T, typename InputStream, typename InfoFunc>
39 requires std::integral<T>
40 static inline std::conditional_t<bNoCheck, void, bool> ReadBigEndian(InputStream &tData, T &tVal)
41 {
42 if constexpr (!bNoCheck)
43 {
44 if (!tData.HasAvailData(sizeof(T)))
45 {
46 return false;
47 }
48 }
49
50 T BigEndianVal{};
51 tData.GetRange((uint8_t *)&BigEndianVal, sizeof(BigEndianVal));
52 tVal = NBT_Endian::BigToNativeAny(BigEndianVal);
53
54 if constexpr (!bNoCheck)
55 {
56 return true;
57 }
58 }
59
60 //增加skip系列函数,用于跳过值
61
62
63 template<typename InputStream, typename Visitor>
64 static Control ScanEndType(InputStream &tData, Visitor &tVisitor)
65 {
66 return ResultControlToControl(tVisitor.VisitListEnd());
67 }
68
69 template<typename T, typename InputStream, typename Visitor>
70 static Control ScanBuiltInType(InputStream &tData, Visitor &tVisitor)
71 {
72 using RAW_DATA_T = NBT_Type::BuiltinRawType_T<T>;//类型映射
73 RAW_DATA_T tTmpRawData = 0;
74 if (!ReadBigEndian(tData, tTmpRawData, funcInfo))
75 {
76 return Control::Error;
77 }
78
79 return ResultControlToControl(tVisitor.VisitNumericResult<T>(tTmpRawData));
80 }
81
82 template<typename T, typename InputStream, typename Visitor>
83 static Control ScanArrayType(InputStream &tData, Visitor &tVisitor)
84 {
85
86 }
87
88 template<typename InputStream, typename Visitor>
89 static Control ScanStringType(InputStream &tData, Visitor &tVisitor)
90 {
91
92 }
93
94 template<typename InputStream, typename Visitor>
95 static Control ScanListType(InputStream &tData, Visitor &tVisitor, size_t szStackDepth)
96 {
97
98 }
99
100 template<typename InputStream, typename Visitor>
101 static Control ScanCompoundType(InputStream &tData, Visitor &tVisitor, size_t szStackDepth)
102 {
103
104 }
105
106
107 template<typename InputStream, typename Visitor>
108 static Control ScanSwitch(InputStream &tData, Visitor &tVisitor, size_t szStackDepth)
109 {
110 if (!tData.HasAvailData(sizeof(NBT_TAG_RAW_TYPE)))
111 {
112 return Control::Error;
113 }
114
115 Control retControl;
116 NBT_TAG tagNbt = (NBT_TAG)(NBT_TAG_RAW_TYPE)tData.GetNext();
117 switch (tagNbt)
118 {
119 case NBT_TAG::End:
120 {
121 retControl = ScanEndType(tData, tVisitor);
122 }
123 break;
124 case NBT_TAG::Byte:
125 {
127 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
128 }
129 break;
130 case NBT_TAG::Short:
131 {
133 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
134 }
135 break;
136 case NBT_TAG::Int:
137 {
139 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
140 }
141 break;
142 case NBT_TAG::Long:
143 {
145 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
146 }
147 break;
148 case NBT_TAG::Float:
149 {
151 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
152 }
153 break;
154 case NBT_TAG::Double:
155 {
157 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
158 }
159 break;
161 {
163 retControl = ScanArrayType<CurType>(tData, tVisitor);
164 }
165 break;
166 case NBT_TAG::String:
167 {
168 retControl = ScanStringType(tData, tVisitor);
169 }
170 break;
171 case NBT_TAG::List:
172 {
173 retControl = ScanListType(tData, tVisitor);
174 }
175 break;
177 {
178 retControl = ScanCompoundType(tData, tVisitor);
179 }
180 break;
182 {
184 retControl = ScanArrayType<CurType>(tData, tVisitor);
185 }
186 break;
188 {
190 retControl = ScanArrayType<CurType>(tData, tVisitor);
191 }
192 break;
193 default:
194 {
195 retControl = Control::Error;
196 }
197 break;
198 }
199
200 switch (retControl)
201 {
202 case NBT_Scanner::Control::Continue:
203 break;
204 case NBT_Scanner::Control::Break:
205 break;
206 case NBT_Scanner::Control::Stop:
207 break;
208 case NBT_Scanner::Control::Error:
209 break;
210 default:
211 break;
212 }
213
214 return retControl;
215 }
216
218
219public:
220 template<typename InputStream, typename Visitor>
222 static bool Scan(InputStream &IptStream, Visitor &tVisitor, size_t szStackDepth = 512)
223 {
224 tVisitor.VisitBegin();
225 //TODO
226 tVisitor.VisitEnd();
227 }
228
229 template<typename DataType = std::vector<uint8_t>, typename Visitor>
231 static bool Scan(const DataType &tDataInput, size_t szStartIdx, Visitor &tVisitor, size_t szStackDepth = 512)
232 {
233 NBT_IO::DefaultInputStream<DataType> IptStream(tDataInput, szStartIdx);
234
235 tVisitor.VisitBegin();
236 //TODO
237 tVisitor.VisitEnd();
238 }
239
240};
IO工具集
用于处理NBT信息打印的默认实现
NBT类型二进制反序列化工具
uint8_t NBT_TAG_RAW_TYPE
NBT_TAG的原始类型,用于二进制读写或判断等
定义 NBT_TAG.hpp:12
NBT_TAG
枚举NBT类型对应的类型标签值
定义 NBT_TAG.hpp:17
@ Int
对应NBT_Type::Int
定义 NBT_TAG.hpp:21
@ Float
对应NBT_Type::Float
定义 NBT_TAG.hpp:23
@ Compound
对应NBT_Type::Compound
定义 NBT_TAG.hpp:28
@ String
对应NBT_Type::String
定义 NBT_TAG.hpp:26
@ 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
static T BigToNativeAny(T data) noexcept
从大端字节序转换到当前平台字节序,自动匹配位数
定义 NBT_Endian.hpp:209
默认输入流类,用于从标准库容器中读取数据
定义 NBT_IO.hpp:45
typename TagToType< Tag >::type TagToType_T
从NBT_TAG获取对应的类型:编译期从NBT_TAG的enum值获取类型
定义 NBT_Type.hpp:250
typename BuiltinRawType< T >::Type BuiltinRawType_T
映射内建类型到方便读写的raw类型:编译期获得内建类型到可以进行二进制读写的原始类型
定义 NBT_Type.hpp:341
ResultControl
定义 NBT_Visitor.hpp:12
@ Stop
停止处理(终止解析)
定义 NBT_Visitor.hpp:15
@ Continue
继续处理(继续迭代)
定义 NBT_Visitor.hpp:13
@ Break
跳过剩余值(离开当前结构层级回到父层级)
定义 NBT_Visitor.hpp:14
定义 NBT_Visitor.hpp:112