13 NBT_Scanner(
void) =
delete;
15 ~NBT_Scanner(
void) =
delete;
19 enum class Control : uint8_t
29 switch (enResultControl)
34 default:
return Control::Error;
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)
42 if constexpr (!bNoCheck)
44 if (!tData.HasAvailData(
sizeof(T)))
51 tData.GetRange((uint8_t *)&BigEndianVal,
sizeof(BigEndianVal));
54 if constexpr (!bNoCheck)
63 template<
typename InputStream,
typename Visitor>
64 static Control ScanEndType(InputStream &tData, Visitor &tVisitor)
66 return ResultControlToControl(tVisitor.VisitListEnd());
69 template<
typename T,
typename InputStream,
typename Visitor>
70 static Control ScanBuiltInType(InputStream &tData, Visitor &tVisitor)
73 RAW_DATA_T tTmpRawData = 0;
74 if (!ReadBigEndian(tData, tTmpRawData, funcInfo))
76 return Control::Error;
79 return ResultControlToControl(tVisitor.VisitNumericResult<T>(tTmpRawData));
82 template<
typename T,
typename InputStream,
typename Visitor>
83 static Control ScanArrayType(InputStream &tData, Visitor &tVisitor)
88 template<
typename InputStream,
typename Visitor>
89 static Control ScanStringType(InputStream &tData, Visitor &tVisitor)
94 template<
typename InputStream,
typename Visitor>
95 static Control ScanListType(InputStream &tData, Visitor &tVisitor,
size_t szStackDepth)
100 template<
typename InputStream,
typename Visitor>
101 static Control ScanCompoundType(InputStream &tData, Visitor &tVisitor,
size_t szStackDepth)
107 template<
typename InputStream,
typename Visitor>
108 static Control ScanSwitch(InputStream &tData, Visitor &tVisitor,
size_t szStackDepth)
112 return Control::Error;
121 retControl = ScanEndType(tData, tVisitor);
127 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
133 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
139 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
145 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
151 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
157 retControl = ScanBuiltInType<CurType>(tData, tVisitor);
163 retControl = ScanArrayType<CurType>(tData, tVisitor);
168 retControl = ScanStringType(tData, tVisitor);
173 retControl = ScanListType(tData, tVisitor);
178 retControl = ScanCompoundType(tData, tVisitor);
184 retControl = ScanArrayType<CurType>(tData, tVisitor);
190 retControl = ScanArrayType<CurType>(tData, tVisitor);
195 retControl = Control::Error;
202 case NBT_Scanner::Control::Continue:
204 case NBT_Scanner::Control::Break:
206 case NBT_Scanner::Control::Stop:
208 case NBT_Scanner::Control::Error:
220 template<
typename InputStream,
typename Visitor>
222 static bool Scan(InputStream &IptStream, Visitor &tVisitor,
size_t szStackDepth = 512)
224 tVisitor.VisitBegin();
229 template<
typename DataType = std::vector<u
int8_t>,
typename Visitor>
231 static bool Scan(
const DataType &tDataInput,
size_t szStartIdx, Visitor &tVisitor,
size_t szStackDepth = 512)
235 tVisitor.VisitBegin();