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:
Oliver Hamlet
2017-02-09 18:13:55 +00:00
parent 96696e8e83
commit 67bee4944b
4 changed files with 29 additions and 18 deletions
+2 -5
View File
@@ -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;
}
-3
View File
@@ -72,9 +72,6 @@ struct ApiDatabase : public DatabaseInterface {
void DiscardAllUserMetadata();
private:
Game& game_;
Masterlist unevaluatedMasterlist_;
MetadataList unevaluatedUserlist_;
};
}
+23 -10
View File
@@ -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);
}
}
}
+4
View File
@@ -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_;
};
}