From be80f5a24429bb62f6e48895498773590da1481d Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sat, 25 Mar 2017 07:54:20 +0000 Subject: [PATCH] Store a GameCache in Game, don't inherit from it --- src/api/api_database.cpp | 4 ++-- src/api/game/game.cpp | 17 +++++++++++------ src/api/game/game.h | 5 ++++- src/api/metadata/condition_evaluator.cpp | 4 ++-- src/api/plugin/plugin_sorter.cpp | 2 +- src/tests/api/internals/game/game_test.h | 4 ++-- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/api/api_database.cpp b/src/api/api_database.cpp index d3e49a56..525549ca 100644 --- a/src/api/api_database.cpp +++ b/src/api/api_database.cpp @@ -69,7 +69,7 @@ void ApiDatabase::LoadLists(const std::string& masterlistPath, void ApiDatabase::EvalLists() { // Clear caches before evaluating conditions. - game_.ClearCachedConditions(); + game_.GetCache()->ClearCachedConditions(); Masterlist temp = masterlist_; MetadataList userTemp = userlist_; @@ -146,7 +146,7 @@ std::vector ApiDatabase::GetGeneralMessages(bool evaluateConditions) co if (evaluateConditions) { // Evaluate conditions from scratch. - game_.ClearCachedConditions(); + game_.GetCache()->ClearCachedConditions(); ConditionEvaluator evaluator(&game_); for (auto it = std::begin(masterlistMessages); it != std::end(masterlistMessages);) { if (!evaluator.evaluate(it->GetCondition())) diff --git a/src/api/game/game.cpp b/src/api/game/game.cpp index 8ef201c1..fa7ec488 100644 --- a/src/api/game/game.cpp +++ b/src/api/game/game.cpp @@ -63,7 +63,8 @@ Game::Game(const GameType gameType, const boost::filesystem::path& localDataPath) : type_(gameType), gamePath_(gamePath), - localDataPath_(localDataPath) { + localDataPath_(localDataPath), + cache_(std::make_shared()) { BOOST_LOG_TRIVIAL(info) << "Initialising load order data for game of type " << (int)type_ << " at: " << gamePath_; loadOrderHandler_.Init(type_, gamePath_, localDataPath_); @@ -86,6 +87,10 @@ std::string Game::GetArchiveFileExtension() const { return ".bsa"; } +std::shared_ptr Game::GetCache() { + return cache_; +} + std::shared_ptr Game::GetDatabase() { return database_; } @@ -136,7 +141,7 @@ void Game::LoadPlugins(const std::vector& plugins, bool loadHeaders } // Clear the existing plugin cache. - ClearCachedPlugins(); + cache_->ClearCachedPlugins(); // Load the plugins. BOOST_LOG_TRIVIAL(trace) << "Starting plugin loading."; @@ -147,9 +152,9 @@ void Game::LoadPlugins(const std::vector& plugins, bool loadHeaders for (auto pluginName : pluginGroup) { BOOST_LOG_TRIVIAL(trace) << "Loading " << pluginName; if (boost::iequals(pluginName, masterFile_)) - AddPlugin(Plugin(*this, pluginName, true)); + cache_->AddPlugin(Plugin(*this, pluginName, true)); else - AddPlugin(Plugin(*this, pluginName, loadHeadersOnly)); + cache_->AddPlugin(Plugin(*this, pluginName, loadHeadersOnly)); } })); } @@ -162,12 +167,12 @@ void Game::LoadPlugins(const std::vector& plugins, bool loadHeaders } std::shared_ptr Game::GetPlugin(const std::string& pluginName) const { - return std::static_pointer_cast(GameCache::GetPlugin(pluginName)); + return std::static_pointer_cast(cache_->GetPlugin(pluginName)); } std::set> Game::GetLoadedPlugins() const { std::set> interfacePointers; - for (auto& plugin : GameCache::GetPlugins()) { + for (auto& plugin : cache_->GetPlugins()) { interfacePointers.insert(std::static_pointer_cast(plugin)); } diff --git a/src/api/game/game.h b/src/api/game/game.h index 7c9a84a0..727e2d0d 100644 --- a/src/api/game/game.h +++ b/src/api/game/game.h @@ -34,7 +34,7 @@ #include "loot/game_interface.h" namespace loot { -class Game : public GameInterface, public GameCache { +class Game : public GameInterface { public: Game(const GameType gameType, const boost::filesystem::path& gamePath = "", @@ -47,6 +47,8 @@ public: boost::filesystem::path DataPath() const; std::string GetArchiveFileExtension() const; + std::shared_ptr GetCache(); + // Game Interface Methods // //////////////////////////// @@ -70,6 +72,7 @@ public: void SetLoadOrder(const std::vector& loadOrder); private: + std::shared_ptr cache_; std::shared_ptr database_; const GameType type_; diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index 5bff4f83..e947b78f 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -49,13 +49,13 @@ bool ConditionEvaluator::evaluate(const std::string& condition) { BOOST_LOG_TRIVIAL(trace) << "Evaluating condition: " << condition; - auto cachedValue = game_->GetCachedCondition(condition); + auto cachedValue = game_->GetCache()->GetCachedCondition(condition); if (cachedValue.second) return cachedValue.first; bool result = parseCondition(condition); - game_->CacheCondition(condition, result); + game_->GetCache()->CacheCondition(condition, result); return result; } diff --git a/src/api/plugin/plugin_sorter.cpp b/src/api/plugin/plugin_sorter.cpp index 1d9b01d1..169d7f0f 100644 --- a/src/api/plugin/plugin_sorter.cpp +++ b/src/api/plugin/plugin_sorter.cpp @@ -212,7 +212,7 @@ void PluginSorter::AddPluginVertices(Game& game) { // Using a set of plugin names followed by finding the matching key // in the unordered map, as it's probably faster than copying the // full plugin objects then sorting them. - for (const auto &plugin : game.GetPlugins()) { + for (const auto &plugin : game.GetCache()->GetPlugins()) { BOOST_LOG_TRIVIAL(trace) << "Getting and evaluating metadata for plugin " << plugin->GetName(); auto metadata = game.GetDatabase()->GetPluginMetadata(plugin->GetName(), true, true); diff --git a/src/tests/api/internals/game/game_test.h b/src/tests/api/internals/game/game_test.h index 00701825..5652c1ed 100644 --- a/src/tests/api/internals/game/game_test.h +++ b/src/tests/api/internals/game/game_test.h @@ -103,7 +103,7 @@ TEST_P(GameTest, loadPluginsWithHeadersOnlyTrueShouldLoadTheHeadersOfAllInstalle Game game = Game(GetParam(), dataPath.parent_path(), localPath); EXPECT_NO_THROW(loadInstalledPlugins(game, true)); - EXPECT_EQ(11, game.GetPlugins().size()); + EXPECT_EQ(11, game.GetCache()->GetPlugins().size()); // Check that one plugin's header has been read. ASSERT_NO_THROW(game.GetPlugin(masterFile)); @@ -118,7 +118,7 @@ TEST_P(GameTest, loadPluginsWithHeadersOnlyFalseShouldFullyLoadAllInstalledPlugi Game game = Game(GetParam(), dataPath.parent_path(), localPath); EXPECT_NO_THROW(loadInstalledPlugins(game, false)); - EXPECT_EQ(11, game.GetPlugins().size()); + EXPECT_EQ(11, game.GetCache()->GetPlugins().size()); // Check that one plugin's header has been read. ASSERT_NO_THROW(game.GetPlugin(blankEsm));