tag/Tag: Merge() returns std::unique_ptr<Tag>

This commit is contained in:
Max Kellermann 2017-12-20 14:59:51 +01:00
parent cb3042ffb2
commit c6a95395b5
4 changed files with 15 additions and 20 deletions

View File

@ -450,13 +450,11 @@ DecoderBridge::SubmitData(InputStream *is,
/* send stream tags */ /* send stream tags */
if (UpdateStreamTag(is)) { if (UpdateStreamTag(is)) {
if (decoder_tag != nullptr) { if (decoder_tag != nullptr)
/* merge with tag from decoder plugin */ /* merge with tag from decoder plugin */
Tag *tag = Tag::Merge(*decoder_tag, cmd = DoSendTag(*Tag::Merge(*decoder_tag,
*stream_tag); *stream_tag));
cmd = DoSendTag(*tag); else
delete tag;
} else
/* send only the stream tag */ /* send only the stream tag */
cmd = DoSendTag(*stream_tag); cmd = DoSendTag(*stream_tag);
@ -559,14 +557,10 @@ DecoderBridge::SubmitTag(InputStream *is, Tag &&tag)
/* send tag to music pipe */ /* send tag to music pipe */
if (stream_tag != nullptr) { if (stream_tag != nullptr)
/* merge with tag from input stream */ /* merge with tag from input stream */
Tag *merged; cmd = DoSendTag(*Tag::Merge(*stream_tag, *decoder_tag));
else
merged = Tag::Merge(*stream_tag, *decoder_tag);
cmd = DoSendTag(*merged);
delete merged;
} else
/* send only the decoder tag */ /* send only the decoder tag */
cmd = DoSendTag(*decoder_tag); cmd = DoSendTag(*decoder_tag);

View File

@ -75,7 +75,7 @@ IcyInputStream::ReadTag()
if (icy_tag == nullptr) if (icy_tag == nullptr)
return new Tag(*input_tag); return new Tag(*input_tag);
return Tag::Merge(*input_tag, *icy_tag); return Tag::Merge(*input_tag, *icy_tag).release();
} }
size_t size_t

View File

@ -55,12 +55,12 @@ Tag::Tag(const Tag &other)
} }
} }
Tag * std::unique_ptr<Tag>
Tag::Merge(const Tag &base, const Tag &add) Tag::Merge(const Tag &base, const Tag &add) noexcept
{ {
TagBuilder builder(add); TagBuilder builder(add);
builder.Complement(base); builder.Complement(base);
return builder.CommitNew().release(); return builder.CommitNew();
} }
Tag * Tag *
@ -72,7 +72,7 @@ Tag::MergeReplace(Tag *base, Tag *add)
if (base == nullptr) if (base == nullptr)
return add; return add;
Tag *tag = Merge(*base, *add); Tag *tag = Merge(*base, *add).release();
delete base; delete base;
delete add; delete add;

View File

@ -26,6 +26,7 @@
#include "Compiler.h" #include "Compiler.h"
#include <algorithm> #include <algorithm>
#include <memory>
/** /**
* The meta information about a song file. It is a MPD specific * The meta information about a song file. It is a MPD specific
@ -116,8 +117,8 @@ struct Tag {
* *
* @return a newly allocated tag * @return a newly allocated tag
*/ */
gcc_malloc gcc_returns_nonnull static std::unique_ptr<Tag> Merge(const Tag &base,
static Tag *Merge(const Tag &base, const Tag &add); const Tag &add) noexcept;
/** /**
* Merges the data from two tags. Any of the two may be nullptr. Both * Merges the data from two tags. Any of the two may be nullptr. Both