From 9f4e96fdfa0967fa83444a44c8e6fdbda14b96c3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 3 Dec 2013 12:56:36 +0100 Subject: PaylistTag: use class TagBuilder --- src/tag/Tag.cxx | 20 -------------------- src/tag/Tag.hxx | 12 ------------ src/tag/TagBuilder.cxx | 34 +++++++++++++++++++++++++++------- src/tag/TagBuilder.hxx | 10 ++++++++++ 4 files changed, 37 insertions(+), 39 deletions(-) (limited to 'src/tag') diff --git a/src/tag/Tag.cxx b/src/tag/Tag.cxx index 7d1da63df..43ded308a 100644 --- a/src/tag/Tag.cxx +++ b/src/tag/Tag.cxx @@ -187,23 +187,3 @@ 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 0e48298a7..e404a4f26 100644 --- a/src/tag/Tag.hxx +++ b/src/tag/Tag.hxx @@ -121,18 +121,6 @@ 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. diff --git a/src/tag/TagBuilder.cxx b/src/tag/TagBuilder.cxx index 2d3b49eb5..5c7da2a1a 100644 --- a/src/tag/TagBuilder.cxx +++ b/src/tag/TagBuilder.cxx @@ -108,13 +108,7 @@ TagBuilder::Clear() { time = -1; has_playlist = false; - - tag_pool_lock.lock(); - for (auto i : items) - tag_pool_put_item(i); - tag_pool_lock.unlock(); - - items.clear(); + RemoveAll(); } void @@ -216,3 +210,29 @@ TagBuilder::AddItem(TagType type, const char *value) AddItem(type, value, strlen(value)); } + +void +TagBuilder::RemoveAll() +{ + tag_pool_lock.lock(); + for (auto i : items) + tag_pool_put_item(i); + tag_pool_lock.unlock(); + + items.clear(); +} + +void +TagBuilder::RemoveType(TagType type) +{ + const auto begin = items.begin(), end = items.end(); + + items.erase(std::remove_if(begin, end, + [type](TagItem *item) { + if (item->type != type) + return false; + tag_pool_put_item(item); + return true; + }), + end); +} diff --git a/src/tag/TagBuilder.hxx b/src/tag/TagBuilder.hxx index cd4fa4e57..fe647db08 100644 --- a/src/tag/TagBuilder.hxx +++ b/src/tag/TagBuilder.hxx @@ -147,6 +147,16 @@ public: gcc_nonnull_all void AddItem(TagType type, const char *value); + /** + * Removes all tag items. + */ + void RemoveAll(); + + /** + * Removes all tag items of the specified type. + */ + void RemoveType(TagType type); + private: gcc_nonnull_all void AddItemInternal(TagType type, const char *value, size_t length); -- cgit v1.2.3