diff --git a/include/loot/game_interface.h b/include/loot/game_interface.h index 4d2859e7..89a49d9b 100644 --- a/include/loot/game_interface.h +++ b/include/loot/game_interface.h @@ -81,11 +81,10 @@ public: * @brief Get data for a loaded plugin. * @param pluginName * The filename of the plugin to get data for. - * @returns If the plugin has been loaded, an optional containing a pointer to - * an implementation of PluginInterface for that plugin, otherwise an - * optional containing no value. + * @returns A shared pointer to a const PluginInterface implementation. The + * pointer is null if the given plugin has not been loaded. */ - virtual std::optional> GetPlugin( + virtual std::shared_ptr GetPlugin( const std::string& pluginName) const = 0; /** diff --git a/src/api/game/game.cpp b/src/api/game/game.cpp index 4f53efe4..359fb3f7 100644 --- a/src/api/game/game.cpp +++ b/src/api/game/game.cpp @@ -194,7 +194,7 @@ void Game::LoadPlugins(const std::vector& plugins, } } -std::optional> Game::GetPlugin( +std::shared_ptr Game::GetPlugin( const std::string& pluginName) const { return cache_->GetPlugin(pluginName); } @@ -231,7 +231,7 @@ bool Game::IsPluginActive(const std::string& pluginName) const { auto plugin = cache_->GetPlugin(pluginName); if (plugin) { - return plugin.value()->IsActive(); + return plugin->IsActive(); } return loadOrderHandler_->IsPluginActive(pluginName); diff --git a/src/api/game/game.h b/src/api/game/game.h index 098e887a..27cea10d 100644 --- a/src/api/game/game.h +++ b/src/api/game/game.h @@ -58,8 +58,7 @@ public: void LoadPlugins(const std::vector& plugins, bool loadHeadersOnly); - std::optional> - GetPlugin( + std::shared_ptr GetPlugin( const std::string& pluginName) const; std::set> GetLoadedPlugins() const; diff --git a/src/api/game/game_cache.cpp b/src/api/game/game_cache.cpp index df5e8ec1..80c7dc86 100644 --- a/src/api/game/game_cache.cpp +++ b/src/api/game/game_cache.cpp @@ -97,13 +97,13 @@ std::set> GameCache::GetPlugins() const { return output; } -std::optional> GameCache::GetPlugin( +std::shared_ptr GameCache::GetPlugin( const std::string& pluginName) const { auto it = plugins_.find(to_lower(pluginName)); if (it != end(plugins_)) return it->second; - return std::nullopt; + return nullptr; } void GameCache::AddPlugin(const Plugin&& plugin) { diff --git a/src/api/game/game_cache.h b/src/api/game/game_cache.h index 8b392121..3df21ecf 100644 --- a/src/api/game/game_cache.h +++ b/src/api/game/game_cache.h @@ -47,8 +47,7 @@ public: void CacheCrc(const std::string& file, uint32_t crc); std::set> GetPlugins() const; - std::optional> GetPlugin( - const std::string& pluginName) const; + std::shared_ptr GetPlugin(const std::string& pluginName) const; void AddPlugin(const Plugin&& plugin); std::set GetArchivePaths() const; diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index 8354e091..f43a05c1 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -415,7 +415,7 @@ Version ConditionEvaluator::getVersion(const std::string& filePath) const { auto plugin = gameCache_->GetPlugin(filePath); if (plugin) { - return Version(plugin.value()->GetVersion().value_or("")); + return Version(plugin->GetVersion().value_or("")); } // The file wasn't in the plugin cache, load it as a plugin @@ -451,7 +451,7 @@ uint32_t ConditionEvaluator::getCrc(const std::string & file) const { // Get the CRC from the game plugin cache if possible. auto plugin = gameCache_->GetPlugin(file); if (plugin) { - crc = plugin.value()->GetCRC().value_or(0); + crc = plugin->GetCRC().value_or(0); } // Otherwise calculate it from the file. diff --git a/src/tests/api/interface/game_interface_test.h b/src/tests/api/interface/game_interface_test.h index 4a157313..2f372dd3 100644 --- a/src/tests/api/interface/game_interface_test.h +++ b/src/tests/api/interface/game_interface_test.h @@ -99,7 +99,7 @@ TEST_P( // Check that one plugin's header has been read. ASSERT_NO_THROW(handle_->GetPlugin(masterFile)); - auto plugin = handle_->GetPlugin(masterFile).value(); + auto plugin = handle_->GetPlugin(masterFile); EXPECT_EQ("5.0", plugin->GetVersion().value()); // Check that only the header has been read. @@ -113,7 +113,7 @@ TEST_P(GameInterfaceTest, // Check that one plugin's header has been read. ASSERT_NO_THROW(handle_->GetPlugin(masterFile)); - auto plugin = handle_->GetPlugin(masterFile).value(); + auto plugin = handle_->GetPlugin(masterFile); EXPECT_EQ("5.0", plugin->GetVersion().value()); // Check that not only the header has been read. @@ -125,7 +125,7 @@ TEST_P(GameInterfaceTest, loadPluginsWithANonAsciiPluginShouldLoadIt) { EXPECT_EQ(1, handle_->GetLoadedPlugins().size()); // Check that one plugin's header has been read. - auto plugin = handle_->GetPlugin(nonAsciiEsm).value(); + auto plugin = handle_->GetPlugin(nonAsciiEsm); EXPECT_EQ("5.0", plugin->GetVersion().value()); // Check that not only the header has been read. diff --git a/src/tests/api/internals/game/game_cache_test.h b/src/tests/api/internals/game/game_cache_test.h index c7904079..3ef24e9e 100644 --- a/src/tests/api/internals/game/game_cache_test.h +++ b/src/tests/api/internals/game/game_cache_test.h @@ -92,7 +92,7 @@ TEST_P(GameCacheTest, addingAPluginThatDoesNotExistShouldSucceed) { game_.GetLoadOrderHandler(), game_.DataPath() / blankEsm, true)); - EXPECT_EQ(blankEsm, cache_.GetPlugin(blankEsm).value()->GetName()); + EXPECT_EQ(blankEsm, cache_.GetPlugin(blankEsm)->GetName()); } TEST_P(GameCacheTest, @@ -102,17 +102,17 @@ TEST_P(GameCacheTest, game_.GetLoadOrderHandler(), game_.DataPath() / blankEsm, true)); - EXPECT_FALSE(cache_.GetPlugin(blankEsm).value()->GetCRC()); + EXPECT_FALSE(cache_.GetPlugin(blankEsm)->GetCRC()); cache_.AddPlugin(Plugin(game_.Type(), std::make_shared(GameCache()), game_.GetLoadOrderHandler(), game_.DataPath() / blankEsm, false)); - EXPECT_EQ(blankEsmCrc, cache_.GetPlugin(blankEsm).value()->GetCRC().value()); + EXPECT_EQ(blankEsmCrc, cache_.GetPlugin(blankEsm)->GetCRC().value()); } -TEST_P(GameCacheTest, gettingAPluginThatIsNotCachedShouldReturnAnEmptyOptional) { +TEST_P(GameCacheTest, gettingAPluginThatIsNotCachedShouldReturnANullPointer) { EXPECT_FALSE(cache_.GetPlugin(blankEsm)); } @@ -122,7 +122,7 @@ TEST_P(GameCacheTest, gettingAPluginShouldBeCaseInsensitive) { game_.GetLoadOrderHandler(), game_.DataPath() / blankEsm, true)); - EXPECT_EQ(blankEsm, cache_.GetPlugin(blankEsm).value()->GetName()); + EXPECT_EQ(blankEsm, cache_.GetPlugin(blankEsm)->GetName()); } TEST_P(GameCacheTest, diff --git a/src/tests/api/internals/game/game_test.h b/src/tests/api/internals/game/game_test.h index 25e308d6..7931f9b2 100644 --- a/src/tests/api/internals/game/game_test.h +++ b/src/tests/api/internals/game/game_test.h @@ -108,7 +108,7 @@ TEST_P( // Check that one plugin's header has been read. ASSERT_NO_THROW(game.GetPlugin(masterFile)); - auto plugin = game.GetPlugin(masterFile).value(); + auto plugin = game.GetPlugin(masterFile); EXPECT_EQ("5.0", plugin->GetVersion().value()); // Check that only the header has been read. @@ -149,7 +149,7 @@ TEST_P(GameTest, // Check that one plugin's header has been read. ASSERT_NO_THROW(game.GetPlugin(blankEsm)); - auto plugin = game.GetPlugin(blankEsm).value(); + auto plugin = game.GetPlugin(blankEsm); EXPECT_EQ("5.0", plugin->GetVersion().value()); // Check that not only the header has been read. diff --git a/src/tests/api/internals/sorting/plugin_sorter_test.h b/src/tests/api/internals/sorting/plugin_sorter_test.h index 949cf958..56c0a639 100644 --- a/src/tests/api/internals/sorting/plugin_sorter_test.h +++ b/src/tests/api/internals/sorting/plugin_sorter_test.h @@ -146,27 +146,27 @@ TEST_P(PluginSorterTest, ASSERT_NO_THROW(loadInstalledPlugins(game_, false)); auto esp = PluginSortingData( - *dynamic_cast(game_.GetPlugin(blankEsp).value().get()), + *dynamic_cast(game_.GetPlugin(blankEsp).get()), PluginMetadata(), PluginMetadata()); EXPECT_FALSE(esp.IsMaster()); auto master = PluginSortingData( - *dynamic_cast(game_.GetPlugin(blankEsm).value().get()), + *dynamic_cast(game_.GetPlugin(blankEsm).get()), PluginMetadata(), PluginMetadata()); EXPECT_TRUE(master.IsMaster()); if (GetParam() == GameType::fo4 || GetParam() == GameType::tes5se) { auto lightMaster = PluginSortingData( - *dynamic_cast(game_.GetPlugin(blankEsl).value().get()), + *dynamic_cast(game_.GetPlugin(blankEsl).get()), PluginMetadata(), PluginMetadata()); EXPECT_TRUE(lightMaster.IsMaster()); auto lightMasterEsp = PluginSortingData(*dynamic_cast( - game_.GetPlugin(blankEslEsp).value().get()), + game_.GetPlugin(blankEslEsp).get()), PluginMetadata(), PluginMetadata()); EXPECT_FALSE(lightMasterEsp.IsMaster());