aboutsummaryrefslogtreecommitdiffstats
path: root/src/tag
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-12-02 12:46:48 +0100
committerMax Kellermann <max@duempel.org>2013-12-02 12:46:48 +0100
commit20ebacf489333933ce752d66ffb6068434a846f5 (patch)
tree2cc9b1e04e44bd247c8af8ae6e234373a15a0917 /src/tag
parentc6ef0e88879d2cd203a74cfda2a574e949486877 (diff)
downloadmpd-20ebacf489333933ce752d66ffb6068434a846f5.tar.gz
mpd-20ebacf489333933ce752d66ffb6068434a846f5.tar.xz
mpd-20ebacf489333933ce752d66ffb6068434a846f5.zip
Tag: add methods RemoveAll(), RemoveType()
Diffstat (limited to 'src/tag')
-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.
*