From f4a01f3a5dc0d8fe2f4f6d804d790da91d1bc30c Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Mon, 26 Sep 2022 17:03:43 -0400 Subject: Avoid duplication of mod metadata in memory (#12562) Co-authored-by: sfan5 --- src/content/mods.cpp | 36 ++++++++++++++++++++++-------------- src/content/mods.h | 16 ++++++++++++---- 2 files changed, 34 insertions(+), 18 deletions(-) (limited to 'src/content') diff --git a/src/content/mods.cpp b/src/content/mods.cpp index cec6fc2cd..ef268055f 100644 --- a/src/content/mods.cpp +++ b/src/content/mods.cpp @@ -220,26 +220,34 @@ std::vector flattenMods(const std::map &mods) ModMetadata::ModMetadata(const std::string &mod_name, ModMetadataDatabase *database): m_mod_name(mod_name), m_database(database) { - m_database->getModEntries(m_mod_name, &m_stringvars); } void ModMetadata::clear() { - for (const auto &pair : m_stringvars) { - m_database->removeModEntry(m_mod_name, pair.first); - } - Metadata::clear(); + m_database->removeModEntries(m_mod_name); +} + +bool ModMetadata::contains(const std::string &name) const +{ + return m_database->hasModEntry(m_mod_name, name); } bool ModMetadata::setString(const std::string &name, const std::string &var) { - if (Metadata::setString(name, var)) { - if (var.empty()) { - m_database->removeModEntry(m_mod_name, name); - } else { - m_database->setModEntry(m_mod_name, name, var); - } - return true; - } - return false; + if (var.empty()) + return m_database->removeModEntry(m_mod_name, name); + else + return m_database->setModEntry(m_mod_name, name, var); +} + +const StringMap &ModMetadata::getStrings(StringMap *place) const +{ + place->clear(); + m_database->getModEntries(m_mod_name, place); + return *place; +} + +const std::string *ModMetadata::getStringRaw(const std::string &name, std::string *place) const +{ + return m_database->getModEntry(m_mod_name, name, place) ? place : nullptr; } diff --git a/src/content/mods.h b/src/content/mods.h index 5ed5b8171..0b0e26b50 100644 --- a/src/content/mods.h +++ b/src/content/mods.h @@ -110,18 +110,26 @@ std::map getModsInPath(const std::string &path, std::vector flattenMods(const std::map &mods); -class ModMetadata : public Metadata +class ModMetadata : public IMetadata { public: ModMetadata() = delete; ModMetadata(const std::string &mod_name, ModMetadataDatabase *database); ~ModMetadata() = default; - virtual void clear(); - const std::string &getModName() const { return m_mod_name; } - virtual bool setString(const std::string &name, const std::string &var); + void clear() override; + + bool contains(const std::string &name) const override; + + bool setString(const std::string &name, const std::string &var) override; + + const StringMap &getStrings(StringMap *place) const override; + +protected: + const std::string *getStringRaw(const std::string &name, + std::string *place) const override; private: std::string m_mod_name; -- cgit v1.2.3