Queue, OutputsPage: merge the Deleter structs into one
[ncmpc-debian.git] / src / Queue.hxx
1 /* ncmpc (Ncurses MPD Client)
2  * (c) 2004-2020 The Music Player Daemon Project
3  * Project homepage: http://musicpd.org
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19
20 #ifndef QUEUE_HXX
21 #define QUEUE_HXX
22
23 #include "util/Compiler.h"
24 #include "Deleter.hxx"
25
26 #include <mpd/client.h>
27
28 #include <vector>
29 #include <memory>
30
31 #include <assert.h>
32
33 struct MpdQueue {
34         /* queue version number (obtained from mpd_status) */
35         unsigned version = 0;
36
37         using Vector = std::vector<std::unique_ptr<struct mpd_song, LibmpdclientDeleter>>;
38
39         /* the list */
40         Vector items;
41
42         using size_type = Vector::size_type;
43
44         size_type size() const {
45                 return items.size();
46         }
47
48         bool empty() const {
49                 return items.empty();
50         }
51
52         /** remove and free all songs in the playlist */
53         void clear();
54
55         const struct mpd_song &operator[](size_type i) const {
56                 assert(i < size());
57
58                 return *items[i];
59         }
60
61         struct mpd_song &operator[](size_type i) {
62                 assert(i < size());
63
64                 return *items[i];
65         }
66
67         gcc_pure
68         const struct mpd_song *GetChecked(int i) const;
69
70         void push_back(const struct mpd_song &song) {
71                 items.emplace_back(mpd_song_dup(&song));
72         }
73
74         void Replace(size_type i, const struct mpd_song &song) {
75                 items[i].reset(mpd_song_dup(&song));
76         }
77
78         void RemoveIndex(size_type i) {
79                 items.erase(std::next(items.begin(), i));
80         }
81
82         void Move(unsigned dest, unsigned src);
83
84         /**
85          * Find a song by its reference.  This method compares
86          * #mpd_song references, so this method makes only sense for
87          * songs references which were obtained from this container.
88          *
89          * @return the song position
90          */
91         gcc_pure
92         size_type FindByReference(const struct mpd_song &song) const;
93
94         /**
95          * Find a song by its id.
96          *
97          * @return the song position
98          */
99         gcc_pure
100         int FindById(unsigned id) const;
101
102         /**
103          * Find a song by its URI.
104          *
105          * @return the song position
106          */
107         gcc_pure
108         int FindByUri(const char *uri) const;
109
110         /**
111          * Like FindByUri(), but return the song id, not the song position
112          *
113          * @return the song id
114          */
115         gcc_pure
116         int FindIdByUri(const char *uri) const {
117                 int i = FindByUri(uri);
118                 if (i >= 0)
119                         i = mpd_song_get_id(items[i].get());
120                 return i;
121         }
122
123         gcc_pure
124         bool ContainsUri(const char *uri) const {
125                 return FindByUri(uri) >= 0;
126         }
127 };
128
129 #endif