mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-02 16:38:41 +00:00
Avoid duplication of mod metadata in memory (#12562)
Co-authored-by: sfan5 <sfan5@live.de>
This commit is contained in:
parent
03428d9825
commit
f4a01f3a5d
37 changed files with 527 additions and 272 deletions
|
@ -220,26 +220,34 @@ std::vector<ModSpec> flattenMods(const std::map<std::string, ModSpec> &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;
|
||||
}
|
||||
|
|
|
@ -110,18 +110,26 @@ std::map<std::string, ModSpec> getModsInPath(const std::string &path,
|
|||
std::vector<ModSpec> flattenMods(const std::map<std::string, ModSpec> &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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue