From 2bfc38358b2b7912c5690441d1d2612811e54075 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sun, 7 Jun 2020 14:36:18 +0100 Subject: [PATCH] Make PluginMetadata::GetRequirements() return a std::vector The collection is only ever iterated over, and the uniqueness and ordering don't matter. --- include/loot/metadata/plugin_metadata.h | 6 +++--- src/api/metadata/condition_evaluator.cpp | 8 ++++---- src/api/metadata/plugin_metadata.cpp | 15 ++++----------- src/api/metadata/yaml/plugin_metadata.h | 2 +- src/api/sorting/plugin_sorting_data.cpp | 4 ++-- src/api/sorting/plugin_sorting_data.h | 8 ++++---- src/tests/api/interface/database_interface_test.h | 4 ++-- .../internals/metadata/condition_evaluator_test.h | 2 +- .../api/internals/metadata/plugin_metadata_test.h | 8 ++++---- 9 files changed, 25 insertions(+), 32 deletions(-) diff --git a/include/loot/metadata/plugin_metadata.h b/include/loot/metadata/plugin_metadata.h index 82200009..a44c2289 100644 --- a/include/loot/metadata/plugin_metadata.h +++ b/include/loot/metadata/plugin_metadata.h @@ -106,7 +106,7 @@ public: * Get the files that the plugin requires to be installed. * @return The files that the plugin requires to be installed. */ - LOOT_API std::set GetRequirements() const; + LOOT_API std::vector GetRequirements() const; /** * Get the files that the plugin is incompatible with. @@ -177,7 +177,7 @@ public: * @param requirements * The files to set. */ - LOOT_API void SetRequirements(const std::set& requirements); + LOOT_API void SetRequirements(const std::vector& requirements); /** * Set the files that the plugin must load after. @@ -269,7 +269,7 @@ private: std::string name_; std::optional group_; std::vector loadAfter_; - std::set requirements_; + std::vector requirements_; std::set incompatibilities_; std::vector messages_; std::set tags_; diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index fa88c328..de3f7697 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -134,14 +134,14 @@ PluginMetadata ConditionEvaluator::EvaluateAll(const PluginMetadata& pluginMetad } evaluatedMetadata.SetLoadAfterFiles(files); - std::set fileSet; - fileSet.clear(); + files.clear(); for (const auto& file : pluginMetadata.GetRequirements()) { if (Evaluate(file.GetCondition())) - fileSet.insert(file); + files.push_back(file); } - evaluatedMetadata.SetRequirements(fileSet); + evaluatedMetadata.SetRequirements(files); + std::set fileSet; fileSet.clear(); for (const auto& file : pluginMetadata.GetIncompatibilities()) { if (Evaluate(file.GetCondition())) diff --git a/src/api/metadata/plugin_metadata.cpp b/src/api/metadata/plugin_metadata.cpp index f98f8fb6..9ed50eba 100644 --- a/src/api/metadata/plugin_metadata.cpp +++ b/src/api/metadata/plugin_metadata.cpp @@ -58,7 +58,7 @@ void PluginMetadata::MergeMetadata(const PluginMetadata& plugin) { } loadAfter_ = mergeVectors(loadAfter_, plugin.loadAfter_); - requirements_.insert(begin(plugin.requirements_), end(plugin.requirements_)); + requirements_ = mergeVectors(requirements_, plugin.requirements_); incompatibilities_.insert(begin(plugin.incompatibilities_), end(plugin.incompatibilities_)); @@ -88,16 +88,9 @@ PluginMetadata PluginMetadata::NewMetadata(const PluginMetadata& plugin) const { // Compare this plugin against the given plugin. p.SetLoadAfterFiles(diffVectors(loadAfter_, plugin.loadAfter_)); + p.SetRequirements(diffVectors(requirements_, plugin.requirements_)); set filesDiff; - filesDiff.clear(); - set_difference(begin(requirements_), - end(requirements_), - begin(plugin.requirements_), - end(plugin.requirements_), - inserter(filesDiff, begin(filesDiff))); - p.SetRequirements(filesDiff); - filesDiff.clear(); set_difference(begin(incompatibilities_), end(incompatibilities_), @@ -161,7 +154,7 @@ std::vector PluginMetadata::GetLoadAfterFiles() const { return loadAfter_; } -std::set PluginMetadata::GetRequirements() const { return requirements_; } +std::vector PluginMetadata::GetRequirements() const { return requirements_; } std::set PluginMetadata::GetIncompatibilities() const { return incompatibilities_; @@ -202,7 +195,7 @@ void PluginMetadata::SetLoadAfterFiles(const std::vector& l) { loadAfter_ = l; } -void PluginMetadata::SetRequirements(const std::set& r) { +void PluginMetadata::SetRequirements(const std::vector& r) { requirements_ = r; } diff --git a/src/api/metadata/yaml/plugin_metadata.h b/src/api/metadata/yaml/plugin_metadata.h index a5c486b6..71f73786 100644 --- a/src/api/metadata/yaml/plugin_metadata.h +++ b/src/api/metadata/yaml/plugin_metadata.h @@ -105,7 +105,7 @@ struct convert { if (node["after"]) rhs.SetLoadAfterFiles(node["after"].as>()); if (node["req"]) - rhs.SetRequirements(node["req"].as>()); + rhs.SetRequirements(node["req"].as>()); if (node["inc"]) rhs.SetIncompatibilities(node["inc"].as>()); if (node["msg"]) diff --git a/src/api/sorting/plugin_sorting_data.cpp b/src/api/sorting/plugin_sorting_data.cpp index 2bda785b..9e45bf62 100644 --- a/src/api/sorting/plugin_sorting_data.cpp +++ b/src/api/sorting/plugin_sorting_data.cpp @@ -142,11 +142,11 @@ const std::vector& PluginSortingData::GetUserLoadAfterFiles() const { return userLoadAfter_; } -const std::set& PluginSortingData::GetMasterlistRequirements() const { +const std::vector& PluginSortingData::GetMasterlistRequirements() const { return masterlistReq_; } -const std::set& PluginSortingData::GetUserRequirements() const { +const std::vector& PluginSortingData::GetUserRequirements() const { return userReq_; } const std::optional& PluginSortingData::GetLoadOrderIndex() const { diff --git a/src/api/sorting/plugin_sorting_data.h b/src/api/sorting/plugin_sorting_data.h index 599196a7..f70db48e 100644 --- a/src/api/sorting/plugin_sorting_data.h +++ b/src/api/sorting/plugin_sorting_data.h @@ -52,8 +52,8 @@ public: const std::vector& GetMasterlistLoadAfterFiles() const; const std::vector& GetUserLoadAfterFiles() const; - const std::set& GetMasterlistRequirements() const; - const std::set& GetUserRequirements() const; + const std::vector& GetMasterlistRequirements() const; + const std::vector& GetUserRequirements() const; const std::optional& GetLoadOrderIndex() const; @@ -64,8 +64,8 @@ private: std::vector masterlistLoadAfter_; std::vector userLoadAfter_; - std::set masterlistReq_; - std::set userReq_; + std::vector masterlistReq_; + std::vector userReq_; std::optional loadOrderIndex_; size_t numOverrideFormIDs; diff --git a/src/tests/api/interface/database_interface_test.h b/src/tests/api/interface/database_interface_test.h index 124a61d6..4617bfc8 100644 --- a/src/tests/api/interface/database_interface_test.h +++ b/src/tests/api/interface/database_interface_test.h @@ -657,7 +657,7 @@ TEST_P( ASSERT_NO_THROW(db_->LoadLists(masterlistPath, userlistPath_)); PluginMetadata newMetadata(blankDifferentEsp); - newMetadata.SetRequirements(std::set({File(masterFile)})); + newMetadata.SetRequirements(std::vector({File(masterFile)})); db_->SetPluginUserMetadata(newMetadata); @@ -677,7 +677,7 @@ TEST_P(DatabaseInterfaceTest, ASSERT_NO_THROW(db_->LoadLists(masterlistPath, userlistPath_)); PluginMetadata newMetadata(blankEsm); - newMetadata.SetRequirements(std::set({File(masterFile)})); + newMetadata.SetRequirements(std::vector({File(masterFile)})); db_->SetPluginUserMetadata(newMetadata); diff --git a/src/tests/api/internals/metadata/condition_evaluator_test.h b/src/tests/api/internals/metadata/condition_evaluator_test.h index 8f336661..8dbf0de8 100644 --- a/src/tests/api/internals/metadata/condition_evaluator_test.h +++ b/src/tests/api/internals/metadata/condition_evaluator_test.h @@ -193,7 +193,7 @@ TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) { std::set expectedFileSet({file1}); EXPECT_EQ("group1", plugin.GetGroup().value()); EXPECT_EQ(expectedFiles, plugin.GetLoadAfterFiles()); - EXPECT_EQ(expectedFileSet, plugin.GetRequirements()); + EXPECT_EQ(expectedFiles, plugin.GetRequirements()); EXPECT_EQ(expectedFileSet, plugin.GetIncompatibilities()); EXPECT_EQ(std::vector({message1}), plugin.GetMessages()); EXPECT_EQ(std::set({tag1}), plugin.GetTags()); diff --git a/src/tests/api/internals/metadata/plugin_metadata_test.h b/src/tests/api/internals/metadata/plugin_metadata_test.h index c5af3142..7b4b7161 100644 --- a/src/tests/api/internals/metadata/plugin_metadata_test.h +++ b/src/tests/api/internals/metadata/plugin_metadata_test.h @@ -182,7 +182,7 @@ TEST_P(PluginMetadataTest, mergeMetadataShouldMergeRequirementData) { plugin2.SetRequirements({file1, file2}); plugin1.MergeMetadata(plugin2); - EXPECT_EQ(std::set({file1, file2}), plugin1.GetRequirements()); + EXPECT_EQ(std::vector({file1, file2}), plugin1.GetRequirements()); } TEST_P(PluginMetadataTest, mergeMetadataShouldMergeIncompatibilityData) { @@ -340,7 +340,7 @@ TEST_P( plugin2.SetRequirements({file1, file3}); PluginMetadata newMetadata = plugin1.NewMetadata(plugin2); - EXPECT_EQ(std::set({file2}), newMetadata.GetRequirements()); + EXPECT_EQ(std::vector({file2}), newMetadata.GetRequirements()); } TEST_P( @@ -794,7 +794,7 @@ TEST_P(PluginMetadataTest, encodingAsYamlShouldSetReqFieldIfRequirementsExist) { YAML::Node node; node = plugin; - EXPECT_EQ(plugin.GetRequirements(), node["req"].as>()); + EXPECT_EQ(plugin.GetRequirements(), node["req"].as>()); } TEST_P(PluginMetadataTest, @@ -882,7 +882,7 @@ TEST_P(PluginMetadataTest, decodingFromYamlShouldStoreAllGivenData) { EXPECT_EQ("Blank.esp", plugin.GetName()); EXPECT_EQ(std::vector({File("Blank.esm")}), plugin.GetLoadAfterFiles()); - EXPECT_EQ(std::set({File("Blank.esm")}), plugin.GetRequirements()); + EXPECT_EQ(std::vector({File("Blank.esm")}), plugin.GetRequirements()); EXPECT_EQ(std::set({File("Blank.esm")}), plugin.GetIncompatibilities()); EXPECT_EQ(std::vector({Message(MessageType::say, "content")}), plugin.GetMessages());