//////////////
// List Tag //
//////////////
// Code omitted
void NBT::Tag::List::ClearMismatchedTypes(){
for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end();){
if ((*i)->GetType() != Type)
i = Value.erase(i);
else
++i;
}
}
// Code omitted
bool NBT::Tag::List::Load(std::istream &Stream, bool LoadExtra){
// Code omitted
int8_t ID = ReadByte(Stream);
if (!Stream.good() || ID < 0 || ID > 10)
return false;
SetTagType(ID);
int32_t Length = ReadInt(Stream);
if (!Stream.good())
return false;
std::vector<std::shared_ptr<NBT::Tag::Base> > NewValue;
for (int32_t i = 0; i < Length; i++){
std::shared_ptr<NBT::Tag::Base> NewTag;
switch (ID){
case NBT::TagID::Byte:{
NewTag.reset(new NBT::Tag::Byte("", 0));
break;
}
case NBT::TagID::Short:{
NewTag.reset(new NBT::Tag::Short("", 0));
break;
}
case NBT::TagID::Int:{
NewTag.reset(new NBT::Tag::Int("", 0));
break;
}
case NBT::TagID::Long:{
NewTag.reset(new NBT::Tag::Long("", 0));
break;
}
case NBT::TagID::Float:{
NewTag.reset(new NBT::Tag::Float("", 0));
break;
}
case NBT::TagID::Double:{
NewTag.reset(new NBT::Tag::Double("", 0));
break;
}
case NBT::TagID::ByteArray:{
NewTag.reset(new NBT::Tag::ByteArray("", std::vector<int8_t>()));
break;
}
case NBT::TagID::String:{
NewTag.reset(new NBT::Tag::String("", ""));
break;
}
case NBT::TagID::List:{
NewTag.reset(new NBT::Tag::List("", std::vector<std::shared_ptr<NBT::Tag::Base> >()));
break;
}
case NBT::TagID::Compound:{
NewTag.reset(new NBT::Tag::Compound("", std::map<std::string, std::shared_ptr<NBT::Tag::Base> >()));
break;
}
default:
break;
}
if (NewTag.get() == NULL){
NewValue.clear();
return false;
}
if (!NewTag->Load(Stream, false) || !Stream.good()){
NewTag.reset();
NewValue.clear();
return false;
}
std::cout << "Pointer: " << NewTag.get() << '\n';
NewValue.push_back(NewTag);
}
if (!Stream.good()){
NewValue.clear();
return false;
}
SetValue(NewValue);
std::cout << Value.size() << " entries\n";
std::cout << "Pointers:\n";
for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end(); i++)
std::cout << i->get() << '\n';
std::cout << "}\n";
return true;
}
// Code omitted
void NBT::Tag::List::SetTagType(int8_t NewType){
Type = NewType;
ClearMismatchedTypes();
}
void NBT::Tag::List::SetValue(std::vector<std::shared_ptr<NBT::Tag::Base> > &NewValue){
Value.clear();
for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = NewValue.begin(); i != NewValue.end(); i++)
Value.push_back(*i);
if (Value.size() > 0)
SetTagType(Value.front()->GetType());
else
SetTagType(-1);
}
// Code omitted
//////////////////
// Compound Tag //
//////////////////
// Code omitted
bool NBT::Tag::Compound::Load(std::istream &Stream, bool LoadExtra){
// Code omitted
std::map<std::string, std::shared_ptr<NBT::Tag::Base> > NewValue;
while (true){
std::shared_ptr<NBT::Tag::Base> NewTag;
int8_t ID = ReadByte(Stream);
if (!Stream.good() || ID < 0 || ID > 10){
NewValue.clear();
return false;
}
if (ID == 0)
break;
switch (ID){
case NBT::TagID::Byte:{
NewTag.reset(new NBT::Tag::Byte("", 0));
break;
}
case NBT::TagID::Short:{
NewTag.reset(new NBT::Tag::Short("", 0));
break;
}
case NBT::TagID::Int:{
NewTag.reset(new NBT::Tag::Int("", 0));
break;
}
case NBT::TagID::Long:{
NewTag.reset(new NBT::Tag::Long("", 0));
break;
}
case NBT::TagID::Float:{
NewTag.reset(new NBT::Tag::Float("", 0));
break;
}
case NBT::TagID::Double:{
NewTag.reset(new NBT::Tag::Double("", 0));
break;
}
case NBT::TagID::ByteArray:{
NewTag.reset(new NBT::Tag::ByteArray("", std::vector<int8_t>()));
break;
}
case NBT::TagID::String:{
NewTag.reset(new NBT::Tag::String("", ""));
break;
}
case NBT::TagID::List:{
NewTag.reset(new NBT::Tag::List("", std::vector<std::shared_ptr<NBT::Tag::Base> >()));
break;
}
case NBT::TagID::Compound:{
NewTag.reset(new NBT::Tag::Compound("", std::map<std::string, std::shared_ptr<NBT::Tag::Base> >()));
break;
}
default:
break;
}
if (NewTag.get() == NULL){
NewValue.clear();
return false;
}
if (!NewTag->Load(Stream, true) || !Stream.good()){
NewTag.reset();
NewValue.clear();
return false;
}
std::cout << "Pointer: " << NewTag.get() << '\n';
NewValue.insert(std::pair<std::string, std::shared_ptr<NBT::Tag::Base> >(NewTag->GetName(), NewTag));
}
if (!Stream.good()){
NewValue.clear();
return false;
}
SetValue(NewValue);
std::cout << Value.size() << " entries\n";
std::cout << "Pointers:\n";
for (std::map<std::string, std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end(); i++)
std::cout << i->second.get() << '\n';
std::cout << "}\n";
return true;
}
// Code omitted
void NBT::Tag::Compound::SetValue(std::map<std::string, std::shared_ptr<NBT::Tag::Base> > &NewValue){
Value.clear();
Value = NewValue;
}
// Code omitted