diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-01 03:21:57 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-01 03:21:57 +0100 |
commit | fc1fc8fbbc9dd9534f40de348210ea66b6defe42 (patch) | |
tree | 3cfa5fae12050f49df5cc6bc0482d4e5a45711d1 /src/NBT/Tag.cpp | |
parent | a6a2a6281218688de7a74a9cd2a426aad3fe2da2 (diff) | |
download | MinedMap-fc1fc8fbbc9dd9534f40de348210ea66b6defe42.tar MinedMap-fc1fc8fbbc9dd9534f40de348210ea66b6defe42.zip |
Use template argument for list subtype, extract further information from chunks
Diffstat (limited to 'src/NBT/Tag.cpp')
-rw-r--r-- | src/NBT/Tag.cpp | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/NBT/Tag.cpp b/src/NBT/Tag.cpp index a2d57e3..1829dc5 100644 --- a/src/NBT/Tag.cpp +++ b/src/NBT/Tag.cpp @@ -76,7 +76,7 @@ std::shared_ptr<const Tag> Tag::readTag(Type type, Buffer *buffer) { return std::shared_ptr<StringTag>(new StringTag(buffer)); case Type::List: - return std::shared_ptr<ListTag>(new ListTag(buffer)); + return readList(buffer); case Type::Compound: return std::shared_ptr<CompoundTag>(new CompoundTag(buffer)); @@ -85,7 +85,52 @@ std::shared_ptr<const Tag> Tag::readTag(Type type, Buffer *buffer) { return std::shared_ptr<IntArrayTag>(new IntArrayTag(buffer)); default: - throw std::runtime_error("Tag::read: unknown tag type"); + throw std::runtime_error("Tag::readTag: unknown tag type"); + } +} + +std::shared_ptr<const Tag> Tag::readList(Buffer *buffer) { + Type type = static_cast<Type>(buffer->get()); + + switch (type) { + case Type::End: + return std::shared_ptr<Tag>(new ListTag<EndTag>(type, buffer)); + + case Type::Byte: + return std::shared_ptr<Tag>(new ListTag<ByteTag>(type, buffer)); + + case Type::Short: + return std::shared_ptr<Tag>(new ListTag<ShortTag>(type, buffer)); + + case Type::Int: + return std::shared_ptr<Tag>(new ListTag<IntTag>(type, buffer)); + + case Type::Long: + return std::shared_ptr<Tag>(new ListTag<LongTag>(type, buffer)); + + case Type::Float: + return std::shared_ptr<Tag>(new ListTag<FloatTag>(type, buffer)); + + case Type::Double: + return std::shared_ptr<Tag>(new ListTag<DoubleTag>(type, buffer)); + + case Type::ByteArray: + return std::shared_ptr<Tag>(new ListTag<ByteArrayTag>(type, buffer)); + + case Type::String: + return std::shared_ptr<Tag>(new ListTag<StringTag>(type, buffer)); + + case Type::List: + return std::shared_ptr<Tag>(new ListTag<ListTagBase>(type, buffer)); + + case Type::Compound: + return std::shared_ptr<Tag>(new ListTag<CompoundTag>(type, buffer)); + + case Type::IntArray: + return std::shared_ptr<Tag>(new ListTag<IntArrayTag>(type, buffer)); + + default: + throw std::runtime_error("Tag::readList: unknown tag type"); } } |