Adds casting helpers
This commit is contained in:
parent
422f428fce
commit
b42899cde7
2 changed files with 216 additions and 6 deletions
186
src/nbt/Tag.cpp
186
src/nbt/Tag.cpp
|
@ -283,4 +283,190 @@ namespace nbt
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ByteTag Tag::asByte() const
|
||||||
|
{
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const ByteTag *TagPtr = dynamic_cast<const ByteTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return ByteTag(0); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteArrayTag Tag::asByteArray() const
|
||||||
|
{
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const ByteArrayTag *TagPtr = dynamic_cast<const ByteArrayTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return ByteArrayTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CompoundTag Tag::asCompound() const
|
||||||
|
{
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const CompoundTag *TagPtr = dynamic_cast<const CompoundTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return CompoundTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DoubleTag Tag::asDouble() const
|
||||||
|
{
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const DoubleTag *TagPtr = dynamic_cast<const DoubleTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return DoubleTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FloatTag Tag::asFloat() const
|
||||||
|
{
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const FloatTag *TagPtr = dynamic_cast<const FloatTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return FloatTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IntArrayTag Tag::asIntArray() const
|
||||||
|
{
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const IntArrayTag *TagPtr = dynamic_cast<const IntArrayTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return IntArrayTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IntTag Tag::asInt() const
|
||||||
|
{
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const IntTag *TagPtr = dynamic_cast<const IntTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return IntTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LongArrayTag Tag::asLongArray() const {
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const LongArrayTag *TagPtr = dynamic_cast<const LongArrayTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return LongArrayTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LongTag Tag::asLong() const {
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const LongTag *TagPtr = dynamic_cast<const LongTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return LongTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ShortTag Tag::asShort() const {
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const ShortTag *TagPtr = dynamic_cast<const ShortTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return ShortTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListTag Tag::asList() const {
|
||||||
|
|
||||||
|
// Use dynamic_cast to safely cast to Tag
|
||||||
|
const ListTag *TagPtr = dynamic_cast<const ListTag *>(this);
|
||||||
|
|
||||||
|
if (TagPtr != nullptr)
|
||||||
|
{
|
||||||
|
// If the cast was successful, return the Tag object
|
||||||
|
return *TagPtr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Handle the case where the cast fails; return a default Tag
|
||||||
|
return ListTag(); // You should handle this appropriately based on your design
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -5,6 +5,18 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include "EndTag.h"
|
||||||
|
#include "ByteTag.h"
|
||||||
|
#include "ByteArrayTag.h"
|
||||||
|
#include "DoubleTag.h"
|
||||||
|
#include "FloatTag.h"
|
||||||
|
#include "CompoundTag.h"
|
||||||
|
#include "IntArrayTag.h"
|
||||||
|
#include "IntTag.h"
|
||||||
|
#include "ListTag.h"
|
||||||
|
#include "LongArrayTag.h"
|
||||||
|
#include "LongTag.h"
|
||||||
|
#include "ShortTag.h"
|
||||||
#include "../utils/ByteLayer.h"
|
#include "../utils/ByteLayer.h"
|
||||||
#include "../utils/StringBuilder.h"
|
#include "../utils/StringBuilder.h"
|
||||||
#include "../utils/StringReader.h"
|
#include "../utils/StringReader.h"
|
||||||
|
@ -52,7 +64,7 @@ namespace nbt
|
||||||
|
|
||||||
static TagType getStringifiedTagType(StringReader &str);
|
static TagType getStringifiedTagType(StringReader &str);
|
||||||
|
|
||||||
void updateParent(Tag* tag)
|
void updateParent(Tag *tag)
|
||||||
{
|
{
|
||||||
if (tag == nullptr)
|
if (tag == nullptr)
|
||||||
{
|
{
|
||||||
|
@ -66,7 +78,7 @@ namespace nbt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag* getParent() const
|
Tag *getParent() const
|
||||||
{
|
{
|
||||||
return _parentTag;
|
return _parentTag;
|
||||||
}
|
}
|
||||||
|
@ -106,19 +118,31 @@ namespace nbt
|
||||||
return getType() == other.getType() && getKey() == other.getKey();
|
return getType() == other.getType() && getKey() == other.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Tag* readNamedTag(ByteLayer &data);
|
static Tag *readNamedTag(ByteLayer &data);
|
||||||
static void writeNamedTag(Tag &tag, ByteLayer &data);
|
static void writeNamedTag(Tag &tag, ByteLayer &data);
|
||||||
static Tag* readStringifiedNamedTag(StringReader &string);
|
static Tag *readStringifiedNamedTag(StringReader &string);
|
||||||
static void writeStringifiedNamedTag(Tag &tag, StringBuilder &builder, int indents);
|
static void writeStringifiedNamedTag(Tag &tag, StringBuilder &builder, int indents);
|
||||||
|
|
||||||
static Tag* makeTagOfType(TagType type);
|
static Tag *makeTagOfType(TagType type);
|
||||||
|
|
||||||
static std::string getCanonicalName(TagType type);
|
static std::string getCanonicalName(TagType type);
|
||||||
bool shouldQuoteName();
|
bool shouldQuoteName();
|
||||||
static bool shouldQuote(const string &value);
|
static bool shouldQuote(const string &value);
|
||||||
|
|
||||||
|
ByteTag asByte() const;
|
||||||
|
ByteArrayTag asByteArray() const;
|
||||||
|
CompoundTag asCompound() const;
|
||||||
|
DoubleTag asDouble() const;
|
||||||
|
FloatTag asFloat() const;
|
||||||
|
IntArrayTag asIntArray() const;
|
||||||
|
IntTag asInt() const;
|
||||||
|
LongArrayTag asLongArray() const;
|
||||||
|
LongTag asLong() const;
|
||||||
|
ShortTag asShort() const;
|
||||||
|
ListTag asList() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Tag* _parentTag;
|
Tag *_parentTag;
|
||||||
TagType _parentTagType = TagType::End;
|
TagType _parentTagType = TagType::End;
|
||||||
std::string _key;
|
std::string _key;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue