diff --git a/src/api/api_database.cpp b/src/api/api_database.cpp index 75d57b80..bf481738 100644 --- a/src/api/api_database.cpp +++ b/src/api/api_database.cpp @@ -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; } diff --git a/src/api/api_database.h b/src/api/api_database.h index bc9bc01e..a56514a5 100644 --- a/src/api/api_database.h +++ b/src/api/api_database.h @@ -72,9 +72,6 @@ struct ApiDatabase : public DatabaseInterface { void DiscardAllUserMetadata(); private: Game& game_; - - Masterlist unevaluatedMasterlist_; - MetadataList unevaluatedUserlist_; }; } diff --git a/src/api/metadata_list.cpp b/src/api/metadata_list.cpp index 7faa68fb..8f324e15 100644 --- a/src/api/metadata_list.cpp +++ b/src/api/metadata_list.cpp @@ -154,20 +154,33 @@ void MetadataList::AppendMessage(const Message& message) { void MetadataList::EvalAllConditions(Game& game) { ConditionEvaluator evaluator(&game); - std::unordered_set 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); } } } diff --git a/src/api/metadata_list.h b/src/api/metadata_list.h index f2714e8e..1ccecfe6 100644 --- a/src/api/metadata_list.h +++ b/src/api/metadata_list.h @@ -64,6 +64,10 @@ protected: std::unordered_set plugins_; std::list regexPlugins_; std::vector messages_; + + std::unordered_set unevaluatedPlugins_; + std::list unevaluatedRegexPlugins_; + std::vector unevaluatedMessages_; }; }