diff --git a/include/loot/metadata/plugin_metadata.h b/include/loot/metadata/plugin_metadata.h index edbc206f..14c3dc16 100644 --- a/include/loot/metadata/plugin_metadata.h +++ b/include/loot/metadata/plugin_metadata.h @@ -124,7 +124,7 @@ public: * Get the plugin's Bash Tag suggestions. * @return The plugin's Bash Tag suggestions. */ - LOOT_API std::set GetTags() const; + LOOT_API std::vector GetTags() const; /** * Get the plugin's dirty plugin information. @@ -198,7 +198,7 @@ public: * @param tags * The Bash Tag suggestions to set. */ - LOOT_API void SetTags(const std::set& tags); + LOOT_API void SetTags(const std::vector& tags); /** * Set the plugin's dirty information. @@ -272,7 +272,7 @@ private: std::vector requirements_; std::vector incompatibilities_; std::vector messages_; - std::set tags_; + std::vector tags_; std::set dirtyInfo_; std::set cleanInfo_; std::set locations_; diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index 34da6062..b8660e67 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -155,12 +155,12 @@ PluginMetadata ConditionEvaluator::EvaluateAll(const PluginMetadata& pluginMetad } evaluatedMetadata.SetMessages(messages); - std::set tagSet; + std::vector tags; for (const auto& tag : pluginMetadata.GetTags()) { if (Evaluate(tag.GetCondition())) - tagSet.insert(tag); + tags.push_back(tag); } - evaluatedMetadata.SetTags(tagSet); + evaluatedMetadata.SetTags(tags); if (!evaluatedMetadata.IsRegexPlugin()) { std::set infoSet; diff --git a/src/api/metadata/plugin_metadata.cpp b/src/api/metadata/plugin_metadata.cpp index 1d2a16d4..18b346d4 100644 --- a/src/api/metadata/plugin_metadata.cpp +++ b/src/api/metadata/plugin_metadata.cpp @@ -61,9 +61,7 @@ void PluginMetadata::MergeMetadata(const PluginMetadata& plugin) { requirements_ = mergeVectors(requirements_, plugin.requirements_); 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. - tags_.insert(begin(plugin.tags_), end(plugin.tags_)); + tags_ = mergeVectors(tags_, plugin.tags_); // Messages are in an ordered list, and should be fully merged. messages_.insert( @@ -102,13 +100,7 @@ PluginMetadata PluginMetadata::NewMetadata(const PluginMetadata& plugin) const { inserter(mDiff, begin(mDiff))); p.SetMessages(mDiff); - set tagDiff; - set_difference(begin(tags_), - end(tags_), - begin(plugin.tags_), - end(plugin.tags_), - inserter(tagDiff, begin(tagDiff))); - p.SetTags(tagDiff); + p.SetTags(diffVectors(tags_, plugin.tags_)); set dirtDiff; set_difference(begin(dirtyInfo_), @@ -153,7 +145,7 @@ std::vector PluginMetadata::GetIncompatibilities() const { std::vector PluginMetadata::GetMessages() const { return messages_; } -std::set PluginMetadata::GetTags() const { return tags_; } +std::vector PluginMetadata::GetTags() const { return tags_; } std::set PluginMetadata::GetDirtyInfo() const { return dirtyInfo_; @@ -198,7 +190,7 @@ void PluginMetadata::SetMessages(const std::vector& m) { messages_ = m; } -void PluginMetadata::SetTags(const std::set& t) { tags_ = t; } +void PluginMetadata::SetTags(const std::vector& t) { tags_ = t; } void PluginMetadata::SetDirtyInfo( const std::set& dirtyInfo) { diff --git a/src/api/metadata/yaml/plugin_metadata.h b/src/api/metadata/yaml/plugin_metadata.h index 45f873c9..7c71a23b 100644 --- a/src/api/metadata/yaml/plugin_metadata.h +++ b/src/api/metadata/yaml/plugin_metadata.h @@ -111,7 +111,7 @@ struct convert { if (node["msg"]) rhs.SetMessages(node["msg"].as>()); if (node["tag"]) - rhs.SetTags(node["tag"].as>()); + rhs.SetTags(node["tag"].as>()); if (node["dirty"]) { rhs.SetDirtyInfo( node["dirty"].as>()); diff --git a/src/tests/api/interface/database_interface_test.h b/src/tests/api/interface/database_interface_test.h index 4617bfc8..9e49a66c 100644 --- a/src/tests/api/interface/database_interface_test.h +++ b/src/tests/api/interface/database_interface_test.h @@ -574,17 +574,15 @@ TEST_P(DatabaseInterfaceTest, auto metadata = db_->GetPluginMetadata(blankEsm, true).value(); - std::set expectedTags({ - Tag("Actors.ACBS"), + std::vector expectedTags({ Tag("Actors.ACBS", true, "file(\"" + missingEsp + "\")"), + Tag("Actors.ACBS"), Tag("Actors.AIData"), Tag("C.Water", false), }); EXPECT_EQ(expectedTags, metadata.GetTags()); EXPECT_EQ("file(\"" + missingEsp + "\")", - metadata.GetTags() - .find(Tag("Actors.ACBS", true, "file(\"" + missingEsp + "\")")) - ->GetCondition()); + metadata.GetTags()[0].GetCondition()); } TEST_P( diff --git a/src/tests/api/internals/metadata/condition_evaluator_test.h b/src/tests/api/internals/metadata/condition_evaluator_test.h index 8fb9c1f9..ac01af1c 100644 --- a/src/tests/api/internals/metadata/condition_evaluator_test.h +++ b/src/tests/api/internals/metadata/condition_evaluator_test.h @@ -195,7 +195,7 @@ TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) { EXPECT_EQ(expectedFiles, plugin.GetRequirements()); EXPECT_EQ(expectedFiles, plugin.GetIncompatibilities()); EXPECT_EQ(std::vector({message1}), plugin.GetMessages()); - EXPECT_EQ(std::set({tag1}), plugin.GetTags()); + EXPECT_EQ(std::vector({tag1}), plugin.GetTags()); EXPECT_EQ(std::set({info1}), plugin.GetDirtyInfo()); EXPECT_EQ(std::set({info1}), plugin.GetCleanInfo()); } diff --git a/src/tests/api/internals/metadata/plugin_metadata_test.h b/src/tests/api/internals/metadata/plugin_metadata_test.h index 24c83ab5..1de8b5e8 100644 --- a/src/tests/api/internals/metadata/plugin_metadata_test.h +++ b/src/tests/api/internals/metadata/plugin_metadata_test.h @@ -221,7 +221,7 @@ TEST_P(PluginMetadataTest, mergeMetadataShouldMergeTags) { plugin2.SetTags({tag1, tag2, tag3}); plugin1.MergeMetadata(plugin2); - EXPECT_EQ(std::set({tag1, tag2, tag3}), plugin1.GetTags()); + EXPECT_EQ(std::vector({tag1, tag2, tag3}), plugin1.GetTags()); } TEST_P(PluginMetadataTest, mergeMetadataShouldMergeDirtyInfoData) { @@ -386,7 +386,7 @@ TEST_P(PluginMetadataTest, plugin2.SetTags({tag1, tag3}); PluginMetadata newMetadata = plugin1.NewMetadata(plugin2); - EXPECT_EQ(std::set({tag2}), newMetadata.GetTags()); + EXPECT_EQ(std::vector({tag2}), newMetadata.GetTags()); } TEST_P( @@ -822,7 +822,7 @@ TEST_P(PluginMetadataTest, encodingAsYamlShouldSetTagFieldIfTagsExist) { YAML::Node node; node = plugin; - EXPECT_EQ(plugin.GetTags(), node["tag"].as>()); + EXPECT_EQ(plugin.GetTags(), node["tag"].as>()); } TEST_P(PluginMetadataTest, encodingAsYamlShouldSetDirtyFieldIfDirtyInfoExists) { @@ -886,7 +886,7 @@ TEST_P(PluginMetadataTest, decodingFromYamlShouldStoreAllGivenData) { 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()); + EXPECT_EQ(std::vector({Tag("Relev")}), plugin.GetTags()); EXPECT_EQ(std::set( {PluginCleaningData(5, "utility", {}, 0, 1, 2)}), plugin.GetDirtyInfo());