aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tag/Tag.cxx20
-rw-r--r--src/tag/Tag.hxx12
2 files changed, 32 insertions, 0 deletions
diff --git a/src/tag/Tag.cxx b/src/tag/Tag.cxx
index 6bf070429..0fb7ea93b 100644
--- a/src/tag/Tag.cxx
+++ b/src/tag/Tag.cxx
@@ -223,3 +223,23 @@ Tag::AddItem(TagType type, const char *value)
{
AddItem(type, value, strlen(value));
}
+
+void
+Tag::RemoveType(TagType type)
+{
+ auto dest = items, src = items, end = items + num_items;
+
+ tag_pool_lock.lock();
+ while (src != end) {
+ TagItem *item = *src++;
+ if (item->type == type)
+ /* remove it */
+ tag_pool_put_item(item);
+ else
+ /* keep it */
+ *dest++ = item;
+ }
+ tag_pool_lock.unlock();
+
+ num_items = dest - items;
+}
diff --git a/src/tag/Tag.hxx b/src/tag/Tag.hxx
index e404a4f26..0e48298a7 100644
--- a/src/tag/Tag.hxx
+++ b/src/tag/Tag.hxx
@@ -122,6 +122,18 @@ struct Tag {
void AddItem(TagType type, const char *value);
/**
+ * Removes all tag items.
+ */
+ void RemoveAll() {
+ num_items = 0;
+ }
+
+ /**
+ * Removes all tag items of the specified type.
+ */
+ void RemoveType(TagType type);
+
+ /**
* Merges the data from two tags. If both tags share data for the
* same TagType, only data from "add" is used.
*