diff options
Diffstat (limited to 'src/NBT/CompoundTag.hpp')
-rw-r--r-- | src/NBT/CompoundTag.hpp | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/NBT/CompoundTag.hpp b/src/NBT/CompoundTag.hpp index 18de1c6..28efc41 100644 --- a/src/NBT/CompoundTag.hpp +++ b/src/NBT/CompoundTag.hpp @@ -35,19 +35,17 @@ namespace MinedMap { namespace NBT { -class CompoundTag : public Tag { +class CompoundTag : public Tag, public std::unordered_map<std::string, std::shared_ptr<const Tag>> { private: friend class Tag; - std::unordered_map<std::string, std::shared_ptr<const Tag>> values; - CompoundTag(Buffer *buffer) { while (true) { std::pair<std::string, std::shared_ptr<const Tag>> v = Tag::readNamedTag(buffer); if (v.second->getType() == Type::End) break; - values.insert(std::move(v)); + insert(std::move(v)); } } @@ -56,20 +54,18 @@ public: return Type::Compound; } - const std::unordered_map<std::string, std::shared_ptr<const Tag>> & getValues() const { - return values; - } - - const std::shared_ptr<const Tag> & get(const std::string &key) const { - return values.at(key); + template<typename T> + std::shared_ptr<const T> get(const std::string &key) const { + return std::dynamic_pointer_cast<const T>(at(key)); } - template<typename... Args> const std::shared_ptr<const Tag> & get(const std::string &key, const Args &...args) const { - std::shared_ptr<const CompoundTag> tag = std::dynamic_pointer_cast<const CompoundTag>(get(key)); + template<typename T, typename... Args> + std::shared_ptr<const T> get(const std::string &key, const Args &...args) const { + std::shared_ptr<const CompoundTag> tag = get<CompoundTag>(key); if (!tag) - return std::shared_ptr<Tag>(nullptr); + return std::shared_ptr<const T>(); - tag->get(args...); + return tag->get<T>(args...); } }; |