From f1f783877f0f8338a225244faff4e40efe10a4ce Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 21 Jul 2018 18:07:45 +0200 Subject: NBT: rework type system --- src/NBT/Tag.cpp | 194 ++++++++++---------------------------------------------- 1 file changed, 34 insertions(+), 160 deletions(-) (limited to 'src/NBT/Tag.cpp') diff --git a/src/NBT/Tag.cpp b/src/NBT/Tag.cpp index 31f1420..e8c429f 100644 --- a/src/NBT/Tag.cpp +++ b/src/NBT/Tag.cpp @@ -41,176 +41,50 @@ #include "LongArrayTag.hpp" -#include - - namespace MinedMap { namespace NBT { -std::shared_ptr Tag::readTag(Type type, Buffer *buffer) { - switch (type) { - case Type::End: - return std::make_shared(); - - case Type::Byte: - return std::make_shared(buffer); - - case Type::Short: - return std::make_shared(buffer); - - case Type::Int: - return std::make_shared(buffer); - - case Type::Long: - return std::make_shared(buffer); - - case Type::Float: - return std::make_shared(buffer); - - case Type::Double: - return std::make_shared(buffer); - - case Type::ByteArray: - return std::make_shared(buffer); - - case Type::String: - return std::make_shared(buffer); - - case Type::List: - return readList(buffer); - - case Type::Compound: - return std::make_shared(buffer); - - case Type::IntArray: - return std::make_shared(buffer); - - case Type::LongArray: - return std::make_shared(buffer); - - default: - throw std::runtime_error("Tag::readTag: unknown tag type"); - } -} - -std::shared_ptr Tag::readList(Buffer *buffer) { - Type type = static_cast(buffer->get8()); - - switch (type) { - case Type::End: - return std::make_shared>(type, buffer); - - case Type::Byte: - return std::make_shared>(type, buffer); - - case Type::Short: - return std::make_shared>(type, buffer); - - case Type::Int: - return std::make_shared>(type, buffer); - - case Type::Long: - return std::make_shared>(type, buffer); - - case Type::Float: - return std::make_shared>(type, buffer); - - case Type::Double: - return std::make_shared>(type, buffer); +const Tag::MakeType EndTag::Type("End"); +const Tag::MakeType ByteTag::Type("Byte"); +const Tag::MakeType ShortTag::Type("Short"); +const Tag::MakeType IntTag::Type("Int"); +const Tag::MakeType LongTag::Type("Long"); +const Tag::MakeType FloatTag::Type("Float"); +const Tag::MakeType DoubleTag::Type("Double"); +const Tag::MakeType ByteArrayTag::Type("ByteArray"); +const Tag::MakeType StringTag::Type("String"); +const Tag::MakeType ListTag::Type("List"); +const Tag::MakeType CompoundTag::Type("Compound"); +const Tag::MakeType IntArrayTag::Type("IntArray"); +const Tag::MakeType LongArrayTag::Type("LongArray"); + + +const std::vector Tag::types = { + &EndTag::Type, + &ByteTag::Type, + &ShortTag::Type, + &IntTag::Type, + &LongTag::Type, + &FloatTag::Type, + &DoubleTag::Type, + &ByteArrayTag::Type, + &StringTag::Type, + &ListTag::Type, + &CompoundTag::Type, + &IntArrayTag::Type, + &LongArrayTag::Type, +}; - case Type::ByteArray: - return std::make_shared>(type, buffer); - - case Type::String: - return std::make_shared>(type, buffer); - - case Type::List: - return std::make_shared>(type, buffer); - - case Type::Compound: - return std::make_shared>(type, buffer); - - case Type::IntArray: - return std::make_shared>(type, buffer); - - case Type::LongArray: - return std::make_shared>(type, buffer); - - default: - throw std::runtime_error("Tag::readList: unknown tag type"); - } -} std::pair> Tag::readNamedTag(Buffer *buffer) { - Type type = static_cast(buffer->get8()); - if (type == Type::End) - return std::make_pair("", std::shared_ptr(new EndTag())); + const TagType &type = getTypeById(buffer->get8()); + if (type == EndTag::Type) + return std::make_pair("", std::make_shared(buffer)); uint16_t len = buffer->get16(); std::string name(reinterpret_cast(buffer->get(len)), len); - return std::make_pair(name, readTag(type, buffer)); -} - -std::ostream& operator<<(std::ostream& os, Tag::Type type) { - switch (type) { - case Tag::Type::End: - os << "End"; - break; - - case Tag::Type::Byte: - os << "Byte"; - break; - - case Tag::Type::Short: - os << "Short"; - break; - - case Tag::Type::Int: - os << "Int"; - break; - - case Tag::Type::Long: - os << "Long"; - break; - - case Tag::Type::Float: - os << "Float"; - break; - - case Tag::Type::Double: - os << "Double"; - break; - - case Tag::Type::ByteArray: - os << "ByteArray"; - break; - - case Tag::Type::String: - os << "String"; - break; - - case Tag::Type::List: - os << "List"; - break; - - case Tag::Type::Compound: - os << "Compound"; - break; - - case Tag::Type::IntArray: - os << "IntArray"; - break; - - case Tag::Type::LongArray: - os << "LongArray"; - break; - - default: - os.setstate(std::ios_base::failbit); - } - - return os; + return std::make_pair(name, type.read(buffer)); } } -- cgit v1.2.3