SongSave: wrap DetachedSong* in std::unique_ptr

This commit is contained in:
Max Kellermann 2017-11-26 12:18:31 +01:00
parent 28fdf1e9ed
commit 75582d47b9
4 changed files with 9 additions and 15 deletions

View File

@ -76,10 +76,10 @@ song_save(BufferedOutputStream &os, const DetachedSong &song)
os.Format(SONG_END "\n"); os.Format(SONG_END "\n");
} }
DetachedSong * std::unique_ptr<DetachedSong>
song_load(TextFile &file, const char *uri) song_load(TextFile &file, const char *uri)
{ {
DetachedSong *song = new DetachedSong(uri); auto song = std::make_unique<DetachedSong>(uri);
TagBuilder tag; TagBuilder tag;
@ -88,8 +88,6 @@ song_load(TextFile &file, const char *uri)
strcmp(line, SONG_END) != 0) { strcmp(line, SONG_END) != 0) {
char *colon = strchr(line, ':'); char *colon = strchr(line, ':');
if (colon == nullptr || colon == line) { if (colon == nullptr || colon == line) {
delete song;
throw FormatRuntimeError("unknown line in db: %s", line); throw FormatRuntimeError("unknown line in db: %s", line);
} }
@ -116,8 +114,6 @@ song_load(TextFile &file, const char *uri)
song->SetStartTime(SongTime::FromMS(start_ms)); song->SetStartTime(SongTime::FromMS(start_ms));
song->SetEndTime(SongTime::FromMS(end_ms)); song->SetEndTime(SongTime::FromMS(end_ms));
} else { } else {
delete song;
throw FormatRuntimeError("unknown line in db: %s", line); throw FormatRuntimeError("unknown line in db: %s", line);
} }
} }

View File

@ -20,6 +20,8 @@
#ifndef MPD_SONG_SAVE_HXX #ifndef MPD_SONG_SAVE_HXX
#define MPD_SONG_SAVE_HXX #define MPD_SONG_SAVE_HXX
#include <memory>
#define SONG_BEGIN "song_begin: " #define SONG_BEGIN "song_begin: "
struct Song; struct Song;
@ -39,7 +41,7 @@ song_save(BufferedOutputStream &os, const DetachedSong &song);
* *
* Throws #std::runtime_error on error. * Throws #std::runtime_error on error.
*/ */
DetachedSong * std::unique_ptr<DetachedSong>
song_load(TextFile &file, const char *uri); song_load(TextFile &file, const char *uri);
#endif #endif

View File

@ -160,11 +160,10 @@ directory_load(TextFile &file, Directory &directory)
if (directory.FindSong(name) != nullptr) if (directory.FindSong(name) != nullptr)
throw FormatRuntimeError("Duplicate song '%s'", name); throw FormatRuntimeError("Duplicate song '%s'", name);
DetachedSong *song = song_load(file, name); auto song = song_load(file, name);
directory.AddSong(Song::NewFrom(std::move(*song), directory.AddSong(Song::NewFrom(std::move(*song),
directory)); directory));
delete song;
} else if ((p = StringAfterPrefix(line, PLAYLIST_META_BEGIN))) { } else if ((p = StringAfterPrefix(line, PLAYLIST_META_BEGIN))) {
const char *name = p; const char *name = p;
playlist_metadata_load(file, directory.playlists, name); playlist_metadata_load(file, directory.playlists, name);

View File

@ -89,7 +89,7 @@ queue_load_song(TextFile &file, const SongLoader &loader,
return; return;
} }
DetachedSong *song; std::unique_ptr<DetachedSong> song;
if ((p = StringAfterPrefix(line, SONG_BEGIN))) { if ((p = StringAfterPrefix(line, SONG_BEGIN))) {
const char *uri = p; const char *uri = p;
@ -111,14 +111,11 @@ queue_load_song(TextFile &file, const SongLoader &loader,
const char *uri = endptr + 1; const char *uri = endptr + 1;
song = new DetachedSong(uri); song = std::make_unique<DetachedSong>(uri);
} }
if (!playlist_check_translate_song(*song, nullptr, loader)) { if (playlist_check_translate_song(*song, nullptr, loader))
delete song;
return; return;
}
queue.Append(std::move(*song), priority); queue.Append(std::move(*song), priority);
delete song;
} }