lib/nbt: Implement the rest of the functions outline in the header
This concludes the implementation of the in-memory NBT representation. This is still all untested code so it might just blow up in your face. The next step will be writing tests (and probably a lot of cursing and debugging)...Soda
parent
2d2b67373c
commit
79650e390e
217
src/lib/nbt.cpp
217
src/lib/nbt.cpp
|
@ -805,9 +805,12 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOrVoid Int8Array::removeElement(uint64_t position) {
|
ErrorOrVoid Int8Array::removeElement(uint64_t position) {
|
||||||
#pragma message("TODO: implement")
|
if (position >= this->data.size()) {
|
||||||
//this->data.erase(position);
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
return ErrorOrVoid(true, ErrorCodes::UNIMPLEMENTED);
|
}
|
||||||
|
|
||||||
|
this->data.erase(this->data.begin()+position);
|
||||||
|
return ErrorOrVoid();
|
||||||
}
|
}
|
||||||
|
|
||||||
String::String() {
|
String::String() {
|
||||||
|
@ -916,17 +919,217 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOrVoid List::deleteElement(uint64_t position) {
|
ErrorOrVoid List::deleteElement(uint64_t position) {
|
||||||
#pragma message("TODO: Implement.")
|
if (position >= this->tags.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
// Step 1) delete pointer
|
delete this->tags[position];
|
||||||
// Step 2) remove element from vector
|
this->tags.erase(this->tags.begin()+position);
|
||||||
|
|
||||||
return ErrorOrVoid(true, ErrorCodes::UNIMPLEMENTED);
|
return ErrorOrVoid();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t List::length() {
|
uint64_t List::length() {
|
||||||
return this->tags.size();
|
return this->tags.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Compound::Compound() {
|
||||||
|
this->type = TagType::COMPOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
Compound::Compound(tiny_utf8::string name) {
|
||||||
|
this->type = TagType::COMPOUND;
|
||||||
|
this->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
Compound::Compound(tiny_utf8::string name, std::vector<Generic*> data) {
|
||||||
|
this->type = TagType::COMPOUND;
|
||||||
|
this->name = name;
|
||||||
|
this->tags = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Compound::~Compound() {
|
||||||
|
for (uint64_t i=0; i<this->tags.size(); i++) {
|
||||||
|
delete this->tags.at(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Compound::serializeWithoutHeader(std::vector<uint8_t>* rawData) {
|
||||||
|
for (uint64_t i=0; i<this->tags.size(); i++) {
|
||||||
|
ErrorOrVoid result = this->tags.at(i)->serialize(rawData);
|
||||||
|
if (result.isError) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOr<Generic*> Compound::getElementPointer(uint64_t position) {
|
||||||
|
if (position >= this->tags.size()) {
|
||||||
|
return ErrorOr<Generic*>(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorOr<Generic*>(this->tags.at(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Compound::setElementPointerAt(uint64_t position, Generic* pointer) {
|
||||||
|
if (position >= this->tags.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete this->tags[position];
|
||||||
|
this->tags[position] = pointer;
|
||||||
|
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Compound::appendPointer(Generic* pointer) {
|
||||||
|
this->tags.push_back(pointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Compound::deleteElement(uint64_t position) {
|
||||||
|
if (position >= this->tags.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete this->tags[position];
|
||||||
|
this->tags.erase(this->tags.begin()+position);
|
||||||
|
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Compound::length() {
|
||||||
|
return this->tags.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
Int32Array::Int32Array() {
|
||||||
|
this->type = TagType::INT32_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
Int32Array::Int32Array(tiny_utf8::string name, std::vector<int32_t> data) {
|
||||||
|
this->type = TagType::INT32_ARRAY;
|
||||||
|
this->name = name;
|
||||||
|
this->data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Int32Array::Int32Array(tiny_utf8::string name, uint64_t length, int32_t data[]) {
|
||||||
|
this->type = TagType::INT32_ARRAY;
|
||||||
|
this->name = name;
|
||||||
|
this->data = std::vector(data, data+length);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int32Array::serializeWithoutHeader(std::vector<uint8_t>* rawData) {
|
||||||
|
Helper::writeInt32Array(rawData, this->data);
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int32_t> Int32Array::getData() {
|
||||||
|
return this->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOr<int32_t> Int32Array::getValue(uint64_t position) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOr<int32_t>(true, ErrorCodes::OVERRUN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorOr<int32_t>(this->data.at(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Int32Array::setData(std::vector<int32_t> newData) {
|
||||||
|
this->data = newData;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int32Array::setValue(uint64_t position, int32_t value) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OVERRUN);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->data[position] = value;
|
||||||
|
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Int32Array::length() {
|
||||||
|
return this->data.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Int32Array::addElement(int32_t element) {
|
||||||
|
this->data.push_back(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int32Array::removeElement(uint64_t position) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->data.erase(this->data.begin()+position);
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
Int64Array::Int64Array() {
|
||||||
|
this->type = TagType::INT64_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
Int64Array::Int64Array(tiny_utf8::string name, std::vector<int64_t> data) {
|
||||||
|
this->type = TagType::INT64_ARRAY;
|
||||||
|
this->name = name;
|
||||||
|
this->data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Int64Array::Int64Array(tiny_utf8::string name, uint64_t length, int64_t data[]) {
|
||||||
|
this->type = TagType::INT64_ARRAY;
|
||||||
|
this->name = name;
|
||||||
|
this->data = std::vector(data, data+length);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int64Array::serializeWithoutHeader(std::vector<uint8_t>* rawData) {
|
||||||
|
Helper::writeInt64Array(rawData, this->data);
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int64_t> Int64Array::getData() {
|
||||||
|
return this->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOr<int64_t> Int64Array::getValue(uint64_t position) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOr<int64_t>(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorOr<int64_t>(this->data[position]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Int64Array::setData(std::vector<int64_t> newData) {
|
||||||
|
this->data = newData;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int64Array::setValue(uint64_t position, int64_t value) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->data[position] = value;
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Int64Array::length() {
|
||||||
|
return this->data.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Int64Array::addElement(int64_t element) {
|
||||||
|
this->data.push_back(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOrVoid Int64Array::removeElement(uint64_t position) {
|
||||||
|
if (position >= this->data.size()) {
|
||||||
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->data.erase(this->data.begin()+position);
|
||||||
|
return ErrorOrVoid();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool validateRawListContents(uint8_t data[], uint64_t dataSize, uint64_t initialPosition, uint64_t* processedDataSize) {
|
bool validateRawListContents(uint8_t data[], uint64_t dataSize, uint64_t initialPosition, uint64_t* processedDataSize) {
|
||||||
|
|
|
@ -254,8 +254,8 @@ namespace NBT {
|
||||||
ErrorOrVoid serializeWithoutHeader(std::vector<uint8_t>* rawData) override;
|
ErrorOrVoid serializeWithoutHeader(std::vector<uint8_t>* rawData) override;
|
||||||
|
|
||||||
ErrorOr<Generic*> getElementPointer(uint64_t position);
|
ErrorOr<Generic*> getElementPointer(uint64_t position);
|
||||||
ErrorOrVoid setElementPointerAt(uint64_t position, Generic*);
|
ErrorOrVoid setElementPointerAt(uint64_t position, Generic* pointer);
|
||||||
ErrorOrVoid appendPointer(Generic*);
|
void appendPointer(Generic* pointer);
|
||||||
ErrorOrVoid deleteElement(uint64_t position);
|
ErrorOrVoid deleteElement(uint64_t position);
|
||||||
uint64_t length();
|
uint64_t length();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue