summaryrefslogtreecommitdiffstats
path: root/src/NBT/CompoundTag.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/NBT/CompoundTag.hpp')
-rw-r--r--src/NBT/CompoundTag.hpp24
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...);
}
};