TagBuilder: add method Commit(Tag&)

For callers that already have a Tag instance.
This commit is contained in:
Max Kellermann 2013-09-05 19:23:06 +02:00
parent 84533b6cad
commit a24589d46e
2 changed files with 21 additions and 8 deletions

View File

@ -43,27 +43,34 @@ TagBuilder::Clear()
items.clear();
}
Tag *
TagBuilder::Commit()
void
TagBuilder::Commit(Tag &tag)
{
Tag *tag = new Tag();
tag->time = time;
tag->has_playlist = has_playlist;
tag.Clear();
tag.time = time;
tag.has_playlist = has_playlist;
/* move all TagItem pointers to the new Tag object without
touching the TagPool reference counters; the
vector::clear() call is important to detach them from this
object */
const unsigned n_items = items.size();
tag->num_items = n_items;
tag->items = g_new(TagItem *, n_items);
std::copy_n(items.begin(), n_items, tag->items);
tag.num_items = n_items;
tag.items = g_new(TagItem *, n_items);
std::copy_n(items.begin(), n_items, tag.items);
items.clear();
/* now ensure that this object is fresh (will not delete any
items because we've already moved them out) */
Clear();
}
Tag *
TagBuilder::Commit()
{
Tag *tag = new Tag();
Commit(*tag);
return tag;
}

View File

@ -83,6 +83,12 @@ public:
void Clear();
/**
* Move this object to the given #Tag instance. This object
* is empty afterwards.
*/
void Commit(Tag &tag);
/**
* Create a new #Tag instance from data in this object. The
* returned object is owned by the caller. This object is