diff --git a/include/loot/metadata/plugin_metadata.h b/include/loot/metadata/plugin_metadata.h index a44c2289..edbc206f 100644 --- a/include/loot/metadata/plugin_metadata.h +++ b/include/loot/metadata/plugin_metadata.h @@ -112,7 +112,7 @@ public: * Get the files that the plugin is incompatible with. * @return The files that the plugin is incompatible with. */ - LOOT_API std::set GetIncompatibilities() const; + LOOT_API std::vector GetIncompatibilities() const; /** * Get the plugin's messages. @@ -184,7 +184,7 @@ public: * @param incompatibilities * The files to set. */ - LOOT_API void SetIncompatibilities(const std::set& incompatibilities); + LOOT_API void SetIncompatibilities(const std::vector& incompatibilities); /** * Set the plugin's messages. @@ -270,7 +270,7 @@ private: std::optional group_; std::vector loadAfter_; std::vector requirements_; - std::set incompatibilities_; + std::vector incompatibilities_; std::vector messages_; std::set tags_; std::set dirtyInfo_; diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index de3f7697..34da6062 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -141,13 +141,12 @@ PluginMetadata ConditionEvaluator::EvaluateAll(const PluginMetadata& pluginMetad } evaluatedMetadata.SetRequirements(files); - std::set fileSet; - fileSet.clear(); + files.clear(); for (const auto& file : pluginMetadata.GetIncompatibilities()) { if (Evaluate(file.GetCondition())) - fileSet.insert(file); + files.push_back(file); } - evaluatedMetadata.SetIncompatibilities(fileSet); + evaluatedMetadata.SetIncompatibilities(files); std::vector messages; for (const auto& message : pluginMetadata.GetMessages()) { diff --git a/src/api/metadata/plugin_metadata.cpp b/src/api/metadata/plugin_metadata.cpp index 9ed50eba..1d2a16d4 100644 --- a/src/api/metadata/plugin_metadata.cpp +++ b/src/api/metadata/plugin_metadata.cpp @@ -59,8 +59,7 @@ void PluginMetadata::MergeMetadata(const PluginMetadata& plugin) { loadAfter_ = mergeVectors(loadAfter_, plugin.loadAfter_); requirements_ = mergeVectors(requirements_, plugin.requirements_); - incompatibilities_.insert(begin(plugin.incompatibilities_), - end(plugin.incompatibilities_)); + incompatibilities_ = mergeVectors(incompatibilities_, plugin.incompatibilities_); // Merge Bash Tags too. Conditions are ignored during comparison, but // if a tag is added and removed, both instances will be in the set. @@ -89,15 +88,7 @@ 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(incompatibilities_), - end(incompatibilities_), - begin(plugin.incompatibilities_), - end(plugin.incompatibilities_), - inserter(filesDiff, begin(filesDiff))); - p.SetIncompatibilities(filesDiff); + p.SetIncompatibilities(diffVectors(incompatibilities_, plugin.incompatibilities_)); vector msgs1 = plugin.GetMessages(); vector msgs2 = messages_; @@ -156,7 +147,7 @@ std::vector PluginMetadata::GetLoadAfterFiles() const { std::vector PluginMetadata::GetRequirements() const { return requirements_; } -std::set PluginMetadata::GetIncompatibilities() const { +std::vector PluginMetadata::GetIncompatibilities() const { return incompatibilities_; } @@ -199,7 +190,7 @@ void PluginMetadata::SetRequirements(const std::vector& r) { requirements_ = r; } -void PluginMetadata::SetIncompatibilities(const std::set& i) { +void PluginMetadata::SetIncompatibilities(const std::vector& i) { incompatibilities_ = i; } diff --git a/src/api/metadata/yaml/plugin_metadata.h b/src/api/metadata/yaml/plugin_metadata.h index 71f73786..45f873c9 100644 --- a/src/api/metadata/yaml/plugin_metadata.h +++ b/src/api/metadata/yaml/plugin_metadata.h @@ -107,7 +107,7 @@ struct convert { if (node["req"]) rhs.SetRequirements(node["req"].as>()); if (node["inc"]) - rhs.SetIncompatibilities(node["inc"].as>()); + rhs.SetIncompatibilities(node["inc"].as>()); if (node["msg"]) rhs.SetMessages(node["msg"].as>()); if (node["tag"]) diff --git a/src/tests/api/internals/metadata/condition_evaluator_test.h b/src/tests/api/internals/metadata/condition_evaluator_test.h index 8dbf0de8..8fb9c1f9 100644 --- a/src/tests/api/internals/metadata/condition_evaluator_test.h +++ b/src/tests/api/internals/metadata/condition_evaluator_test.h @@ -190,11 +190,10 @@ TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) { EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin)); std::vector expectedFiles({file1}); - std::set expectedFileSet({file1}); EXPECT_EQ("group1", plugin.GetGroup().value()); EXPECT_EQ(expectedFiles, plugin.GetLoadAfterFiles()); EXPECT_EQ(expectedFiles, plugin.GetRequirements()); - EXPECT_EQ(expectedFileSet, plugin.GetIncompatibilities()); + EXPECT_EQ(expectedFiles, plugin.GetIncompatibilities()); EXPECT_EQ(std::vector({message1}), plugin.GetMessages()); EXPECT_EQ(std::set({tag1}), plugin.GetTags()); EXPECT_EQ(std::set({info1}), plugin.GetDirtyInfo()); diff --git a/src/tests/api/internals/metadata/plugin_metadata_test.h b/src/tests/api/internals/metadata/plugin_metadata_test.h index 7b4b7161..24c83ab5 100644 --- a/src/tests/api/internals/metadata/plugin_metadata_test.h +++ b/src/tests/api/internals/metadata/plugin_metadata_test.h @@ -195,7 +195,7 @@ TEST_P(PluginMetadataTest, mergeMetadataShouldMergeIncompatibilityData) { plugin2.SetIncompatibilities({file1, file2}); plugin1.MergeMetadata(plugin2); - EXPECT_EQ(std::set({file1, file2}), plugin1.GetIncompatibilities()); + EXPECT_EQ(std::vector({file1, file2}), plugin1.GetIncompatibilities()); } TEST_P(PluginMetadataTest, mergeMetadataShouldMergeMessages) { @@ -356,7 +356,7 @@ TEST_P( plugin2.SetIncompatibilities({file1, file3}); PluginMetadata newMetadata = plugin1.NewMetadata(plugin2); - EXPECT_EQ(std::set({file2}), newMetadata.GetIncompatibilities()); + EXPECT_EQ(std::vector({file2}), newMetadata.GetIncompatibilities()); } TEST_P(PluginMetadataTest, @@ -804,7 +804,7 @@ TEST_P(PluginMetadataTest, YAML::Node node; node = plugin; - EXPECT_EQ(plugin.GetIncompatibilities(), node["inc"].as>()); + EXPECT_EQ(plugin.GetIncompatibilities(), node["inc"].as>()); } TEST_P(PluginMetadataTest, encodingAsYamlShouldSetMsgFieldIfMessagesExist) { @@ -883,7 +883,7 @@ TEST_P(PluginMetadataTest, decodingFromYamlShouldStoreAllGivenData) { EXPECT_EQ("Blank.esp", plugin.GetName()); EXPECT_EQ(std::vector({File("Blank.esm")}), plugin.GetLoadAfterFiles()); EXPECT_EQ(std::vector({File("Blank.esm")}), plugin.GetRequirements()); - EXPECT_EQ(std::set({File("Blank.esm")}), plugin.GetIncompatibilities()); + EXPECT_EQ(std::vector({File("Blank.esm")}), plugin.GetIncompatibilities()); EXPECT_EQ(std::vector({Message(MessageType::say, "content")}), plugin.GetMessages()); EXPECT_EQ(std::set({Tag("Relev")}), plugin.GetTags()); diff --git a/src/tests/api/internals/metadata_list_test.h b/src/tests/api/internals/metadata_list_test.h index 04a57465..0ac5fb9b 100644 --- a/src/tests/api/internals/metadata_list_test.h +++ b/src/tests/api/internals/metadata_list_test.h @@ -297,7 +297,7 @@ TEST_P( File(blankEsm), }), plugin.GetLoadAfterFiles()); - EXPECT_EQ(std::set({ + EXPECT_EQ(std::vector({ File(blankEsp), }), plugin.GetIncompatibilities());