NBT: implement NBT::helper::readInt64Array
parent
edcf40d5a5
commit
975cdd309d
|
@ -141,8 +141,19 @@ namespace NBT {
|
|||
}
|
||||
|
||||
ErrorOr<std::vector<int64_t>> readInt64Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
||||
//TODO: implement
|
||||
return ErrorOr<std::vector<int64_t>>({0});
|
||||
// get size prefix
|
||||
ErrorOr<int32_t> size = readInt32(data, dataSize, currentPosition);
|
||||
if (size.isError) return ErrorOr<std::vector<int64_t>>(true, size.errorCode);
|
||||
|
||||
// get content
|
||||
if (currentPosition+4+(size.value*8) > dataSize) return ErrorOr<std::vector<int64_t>>(true, ErrorCodes::OVERRUN_ERROR);
|
||||
std::vector<int64_t> result = std::vector<int64_t>();
|
||||
for (int i=0; i<size.value; i++) {
|
||||
ErrorOr<int64_t> nextInt64 = readInt64(data, dataSize, currentPosition+4+(i*8));
|
||||
if (nextInt64.isError) return ErrorOr<std::vector<int64_t>>(true, nextInt64.errorCode);
|
||||
result.push_back(nextInt64.value);
|
||||
}
|
||||
return ErrorOr<std::vector<int64_t>>(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -184,5 +184,29 @@ int main(){
|
|||
|
||||
std::cout << "Passed int32[] NBT helper test" << std::endl;
|
||||
|
||||
// int64 "array" ###################################################
|
||||
// read successfully
|
||||
currentPosition = 44;
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).value == std::vector<int64_t>({2966230773313449776, 3544952156018063160, 4123673537695186954, 4413034230074983236, 4991755612779596620}));
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).isError == false);
|
||||
// read empty
|
||||
currentPosition = 112;
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).value == std::vector<int64_t>());
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).isError == false);
|
||||
// read overrun
|
||||
currentPosition = 20;
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::OVERRUN_ERROR);
|
||||
// read with size partially out of bounds
|
||||
currentPosition = 114;
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::RANGE_ERROR);
|
||||
// read out of bounds
|
||||
currentPosition = 200;
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||
ASSERT(NBT::helper::readInt64Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::RANGE_ERROR);
|
||||
|
||||
std::cout << "Passed int64[] NBT helper test" << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue