From 6d08e761c8203ac8810e1f49c8ac4fd188c9d9ac Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 20 Jan 2021 20:55:39 +0100 Subject: [PATCH] db/simple/ExportedSong: new class --- src/db/plugins/simple/Directory.cxx | 4 +-- src/db/plugins/simple/ExportedSong.hxx | 35 +++++++++++++++++++ .../plugins/simple/SimpleDatabasePlugin.cxx | 10 +++--- .../plugins/simple/SimpleDatabasePlugin.hxx | 4 +-- src/db/plugins/simple/Song.cxx | 5 +-- src/db/plugins/simple/Song.hxx | 4 +-- 6 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 src/db/plugins/simple/ExportedSong.hxx diff --git a/src/db/plugins/simple/Directory.cxx b/src/db/plugins/simple/Directory.cxx index 1b34655bd..1465922eb 100644 --- a/src/db/plugins/simple/Directory.cxx +++ b/src/db/plugins/simple/Directory.cxx @@ -18,11 +18,11 @@ */ #include "Directory.hxx" +#include "ExportedSong.hxx" #include "SongSort.hxx" #include "Song.hxx" #include "Mount.hxx" #include "db/LightDirectory.hxx" -#include "song/LightSong.hxx" #include "db/Uri.hxx" #include "db/DatabaseLock.hxx" #include "db/Interface.hxx" @@ -234,7 +234,7 @@ Directory::Walk(bool recursive, const SongFilter *filter, if (visit_song) { for (auto &song : songs){ - const LightSong song2 = song.Export(); + const auto song2 = song.Export(); if (filter == nullptr || filter->Match(song2)) visit_song(song2); } diff --git a/src/db/plugins/simple/ExportedSong.hxx b/src/db/plugins/simple/ExportedSong.hxx new file mode 100644 index 000000000..6f2f8bd84 --- /dev/null +++ b/src/db/plugins/simple/ExportedSong.hxx @@ -0,0 +1,35 @@ +/* + * Copyright 2003-2021 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_DB_SIMPLE_EXPORTED_SONG_HXX +#define MPD_DB_SIMPLE_EXPORTED_SONG_HXX + +#include "song/LightSong.hxx" + +/** + * The return type for Song::Export(). In addition to implementing + * #LightSong, it hold allocations necessary to represent the #Song as + * a #LightSong, e.g. a merged #Tag. + */ +class ExportedSong : public LightSong { +public: + using LightSong::LightSong; +}; + +#endif diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.cxx b/src/db/plugins/simple/SimpleDatabasePlugin.cxx index af01d4b45..1e126f3da 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.cxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.cxx @@ -238,20 +238,20 @@ SimpleDatabase::GetSong(std::string_view uri) const throw DatabaseError(DatabaseErrorCode::NOT_FOUND, "No such song"); - light_song.Construct(song->Export()); + exported_song.Construct(song->Export()); #ifndef NDEBUG ++borrowed_song_count; #endif - return &light_song.Get(); + return &exported_song.Get(); } void SimpleDatabase::ReturnSong([[maybe_unused]] const LightSong *song) const noexcept { assert(song != nullptr); - assert(song == prefixed_light_song || song == &light_song.Get()); + assert(song == prefixed_light_song || song == &exported_song.Get()); if (prefixed_light_song != nullptr) { delete prefixed_light_song; @@ -262,7 +262,7 @@ SimpleDatabase::ReturnSong([[maybe_unused]] const LightSong *song) const noexcep --borrowed_song_count; #endif - light_song.Destruct(); + exported_song.Destruct(); } } @@ -316,7 +316,7 @@ SimpleDatabase::Visit(const DatabaseSelection &selection, if (visit_song) { Song *song = r.directory->FindSong(r.rest); if (song != nullptr) { - const LightSong song2 = song->Export(); + const auto song2 = song->Export(); if (selection.Match(song2)) visit_song(song2); diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx index a2245faa1..4fe68014e 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx @@ -20,10 +20,10 @@ #ifndef MPD_SIMPLE_DATABASE_PLUGIN_HXX #define MPD_SIMPLE_DATABASE_PLUGIN_HXX +#include "ExportedSong.hxx" #include "db/Interface.hxx" #include "db/Ptr.hxx" #include "fs/AllocatedPath.hxx" -#include "song/LightSong.hxx" #include "util/Manual.hxx" #include "util/Compiler.h" #include "config.h" @@ -63,7 +63,7 @@ class SimpleDatabase : public Database { /** * A buffer for GetSong(). */ - mutable Manual light_song; + mutable Manual exported_song; #ifndef NDEBUG mutable unsigned borrowed_song_count; diff --git a/src/db/plugins/simple/Song.cxx b/src/db/plugins/simple/Song.cxx index 03ec19f50..519a1a3d7 100644 --- a/src/db/plugins/simple/Song.cxx +++ b/src/db/plugins/simple/Song.cxx @@ -18,6 +18,7 @@ */ #include "Song.hxx" +#include "ExportedSong.hxx" #include "Directory.hxx" #include "tag/Tag.hxx" #include "song/DetachedSong.hxx" @@ -53,10 +54,10 @@ Song::GetURI() const noexcept } } -LightSong +ExportedSong Song::Export() const noexcept { - LightSong dest(filename.c_str(), tag); + ExportedSong dest(filename.c_str(), tag); if (!parent.IsRoot()) dest.directory = parent.GetPath(); if (!target.empty()) diff --git a/src/db/plugins/simple/Song.hxx b/src/db/plugins/simple/Song.hxx index 8750a91b3..eb425dc5c 100644 --- a/src/db/plugins/simple/Song.hxx +++ b/src/db/plugins/simple/Song.hxx @@ -32,8 +32,8 @@ #include struct StringView; -struct LightSong; struct Directory; +class ExportedSong; class DetachedSong; class Storage; class ArchiveFile; @@ -153,7 +153,7 @@ struct Song { std::string GetURI() const noexcept; gcc_pure - LightSong Export() const noexcept; + ExportedSong Export() const noexcept; }; typedef boost::intrusive::list