Replace reference member with a pointer

As recommended by C++ Core Guidelines C.12. This doesn't change the
lifetime requirements of the class, but I've added a comment to
highlight them.
This commit is contained in:
Oliver Hamlet
2022-02-19 14:03:35 +00:00
parent 14479b2289
commit ac7d60cc76
4 changed files with 39 additions and 33 deletions
+1 -1
View File
@@ -215,7 +215,7 @@ void PluginGraph::AddPluginVertices(Game& game,
.GetPluginUserMetadata(plugin->GetName(), true)
.value_or(PluginMetadata(plugin->GetName()));
auto pluginSortingData = PluginSortingData(*plugin,
auto pluginSortingData = PluginSortingData(plugin,
masterlistMetadata,
userMetadata,
loadOrder,
+13 -12
View File
@@ -50,7 +50,7 @@ std::vector<const Plugin*> GetPluginsSubset(
}
PluginSortingData::PluginSortingData(
const Plugin& plugin,
const Plugin* plugin,
const PluginMetadata& masterlistMetadata,
const PluginMetadata& userMetadata,
const std::vector<std::string>& loadOrder,
@@ -70,19 +70,19 @@ PluginSortingData::PluginSortingData(
}
for (size_t i = 0; i < loadOrder.size(); i++) {
if (CompareFilenames(plugin.GetName(), loadOrder.at(i)) == 0) {
if (CompareFilenames(plugin->GetName(), loadOrder.at(i)) == 0) {
loadOrderIndex_ = i;
}
}
if (gameType == GameType::tes3) {
auto masterNames = plugin.GetMasters();
auto masterNames = plugin->GetMasters();
if (masterNames.empty()) {
numOverrideFormIDs = 0;
} else {
auto masters = GetPluginsSubset(loadedPlugins, masterNames);
if (masters.size() == masterNames.size()) {
numOverrideFormIDs = plugin.GetOverlapSize(masters);
numOverrideFormIDs = plugin->GetOverlapSize(masters);
} else {
// Not all masters are loaded, fall back to using the plugin's
// total record count (Morrowind doesn't have groups). This is OK
@@ -93,25 +93,26 @@ PluginSortingData::PluginSortingData(
// order with missing masters with potentially poorer results than
// for it to error out, as masters may be missing for a variety of
// development & testing reasons.
numOverrideFormIDs = plugin.GetRecordAndGroupCount();
numOverrideFormIDs = plugin->GetRecordAndGroupCount();
}
}
} else {
numOverrideFormIDs = plugin.NumOverrideFormIDs();
numOverrideFormIDs = plugin->NumOverrideFormIDs();
}
}
std::string PluginSortingData::GetName() const { return plugin_.GetName(); }
std::string PluginSortingData::GetName() const { return plugin_->GetName(); }
bool PluginSortingData::IsMaster() const {
return plugin_.IsMaster() || (plugin_.IsLightPlugin() &&
!boost::iends_with(plugin_.GetName(), ".esp"));
return plugin_->IsMaster() ||
(plugin_->IsLightPlugin() &&
!boost::iends_with(plugin_->GetName(), ".esp"));
}
bool PluginSortingData::LoadsArchive() const { return plugin_.LoadsArchive(); }
bool PluginSortingData::LoadsArchive() const { return plugin_->LoadsArchive(); }
std::vector<std::string> PluginSortingData::GetMasters() const {
return plugin_.GetMasters();
return plugin_->GetMasters();
}
size_t PluginSortingData::NumOverrideFormIDs() const {
@@ -120,7 +121,7 @@ size_t PluginSortingData::NumOverrideFormIDs() const {
bool PluginSortingData::DoFormIDsOverlap(
const PluginSortingData& plugin) const {
return plugin_.DoFormIDsOverlap(plugin.plugin_);
return plugin_->DoFormIDsOverlap(*plugin.plugin_);
}
std::string PluginSortingData::GetGroup() const { return group_; }
+7 -2
View File
@@ -31,7 +31,12 @@
namespace loot {
class PluginSortingData {
public:
explicit PluginSortingData(const Plugin& plugin,
/**
* This stores a copy of the plugin pointer that is passed to it, so
* PluginSortingData objects must not live longer than the Plugin objects
* that they are constructed from.
*/
explicit PluginSortingData(const Plugin* plugin,
const PluginMetadata& masterlistMetadata,
const PluginMetadata& userMetadata,
const std::vector<std::string>& loadOrder,
@@ -58,7 +63,7 @@ public:
const std::optional<size_t>& GetLoadOrderIndex() const;
private:
const Plugin& plugin_;
const Plugin* plugin_;
std::string group_;
std::unordered_set<std::string> afterGroupPlugins_;
@@ -84,27 +84,27 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) {
ASSERT_NO_THROW(loadInstalledPlugins(game_, false));
auto esp = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
game_.Type(),
game_.GetCache().GetPlugins());
auto esp =
PluginSortingData(dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
game_.Type(),
game_.GetCache().GetPlugins());
EXPECT_FALSE(esp.IsMaster());
auto master = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
game_.Type(),
game_.GetCache().GetPlugins());
auto master =
PluginSortingData(dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
game_.Type(),
game_.GetCache().GetPlugins());
EXPECT_TRUE(master.IsMaster());
if (GetParam() == GameType::fo4 || GetParam() == GameType::tes5se) {
auto lightMaster = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsl)),
dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsl)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
@@ -113,7 +113,7 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) {
EXPECT_TRUE(lightMaster.IsMaster());
auto lightPlugin = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankEslEsp)),
dynamic_cast<const Plugin *>(game_.GetPlugin(blankEslEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
@@ -128,7 +128,7 @@ TEST_P(PluginSortingDataTest,
ASSERT_NO_THROW(loadInstalledPlugins(game_, false));
auto plugin = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankMasterDependentEsm)),
dynamic_cast<const Plugin *>(game_.GetPlugin(blankMasterDependentEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),
@@ -157,7 +157,7 @@ TEST_P(
}
auto plugin = PluginSortingData(
*dynamic_cast<const Plugin *>(game_.GetPlugin(blankMasterDependentEsm)),
dynamic_cast<const Plugin *>(game_.GetPlugin(blankMasterDependentEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder(),