mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Improve API's metadata list caching
Don't create two copies of the lists on load, instead internally copy their data when calling EvalAllConditions for the first time.
This commit is contained in:
@@ -64,17 +64,15 @@ void ApiDatabase::LoadLists(const std::string& masterlistPath,
|
||||
}
|
||||
|
||||
game_.GetMasterlist() = temp;
|
||||
unevaluatedMasterlist_ = temp;
|
||||
game_.GetUserlist() = userTemp;
|
||||
unevaluatedUserlist_ = userTemp;
|
||||
}
|
||||
|
||||
void ApiDatabase::EvalLists() {
|
||||
// Clear caches before evaluating conditions.
|
||||
game_.ClearCachedConditions();
|
||||
|
||||
Masterlist temp = unevaluatedMasterlist_;
|
||||
MetadataList userTemp = unevaluatedUserlist_;
|
||||
Masterlist temp = game_.GetMasterlist();
|
||||
MetadataList userTemp = game_.GetUserlist();
|
||||
|
||||
// Refresh active plugins before evaluating conditions.
|
||||
temp.EvalAllConditions(game_);
|
||||
@@ -107,7 +105,6 @@ bool ApiDatabase::UpdateMasterlist(const std::string& masterlistPath,
|
||||
Masterlist masterlist;
|
||||
if (masterlist.Update(masterlistPath, remoteURL, remoteBranch)) {
|
||||
game_.GetMasterlist() = masterlist;
|
||||
unevaluatedMasterlist_ = masterlist;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,9 +72,6 @@ struct ApiDatabase : public DatabaseInterface {
|
||||
void DiscardAllUserMetadata();
|
||||
private:
|
||||
Game& game_;
|
||||
|
||||
Masterlist unevaluatedMasterlist_;
|
||||
MetadataList unevaluatedUserlist_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+23
-10
@@ -154,20 +154,33 @@ void MetadataList::AppendMessage(const Message& message) {
|
||||
|
||||
void MetadataList::EvalAllConditions(Game& game) {
|
||||
ConditionEvaluator evaluator(&game);
|
||||
std::unordered_set<PluginMetadata> replacementSet;
|
||||
for (auto &plugin : plugins_) {
|
||||
replacementSet.insert(evaluator.evaluateAll(plugin));
|
||||
|
||||
if (unevaluatedPlugins_.empty())
|
||||
unevaluatedPlugins_.swap(plugins_);
|
||||
else
|
||||
plugins_.clear();
|
||||
|
||||
for (const auto& plugin : unevaluatedPlugins_) {
|
||||
plugins_.insert(evaluator.evaluateAll(plugin));
|
||||
}
|
||||
plugins_ = replacementSet;
|
||||
for (auto &plugin : regexPlugins_) {
|
||||
|
||||
if (unevaluatedRegexPlugins_.empty())
|
||||
unevaluatedRegexPlugins_ = regexPlugins_;
|
||||
else
|
||||
regexPlugins_ = unevaluatedRegexPlugins_;
|
||||
|
||||
for (auto& plugin : regexPlugins_) {
|
||||
plugin = evaluator.evaluateAll(plugin);
|
||||
}
|
||||
|
||||
for (auto it = std::begin(messages_); it != std::end(messages_);) {
|
||||
if (!evaluator.evaluate(it->GetCondition()))
|
||||
it = messages_.erase(it);
|
||||
else
|
||||
++it;
|
||||
if (unevaluatedMessages_.empty())
|
||||
unevaluatedMessages_.swap(messages_);
|
||||
else
|
||||
messages_.clear();
|
||||
|
||||
for (const auto& message : unevaluatedMessages_) {
|
||||
if (evaluator.evaluate(message.GetCondition()))
|
||||
messages_.push_back(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,10 @@ protected:
|
||||
std::unordered_set<PluginMetadata> plugins_;
|
||||
std::list<PluginMetadata> regexPlugins_;
|
||||
std::vector<Message> messages_;
|
||||
|
||||
std::unordered_set<PluginMetadata> unevaluatedPlugins_;
|
||||
std::list<PluginMetadata> unevaluatedRegexPlugins_;
|
||||
std::vector<Message> unevaluatedMessages_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user