b355cd9c15276125a8a14135b55bfe2589d408c9
[ncmpc-debian.git] / src / Queue.cxx
1 /* ncmpc (Ncurses MPD Client)
2  * (c) 2004-2018 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 #include "Queue.hxx"
21
22 #include <string.h>
23
24 void
25 MpdQueue::clear()
26 {
27         version = 0;
28
29         for (unsigned i = 0; i < list->len; ++i) {
30                 auto *song = &(*this)[i];
31                 mpd_song_free(song);
32         }
33
34         g_ptr_array_set_size(list, 0);
35 }
36
37 MpdQueue::~MpdQueue()
38 {
39         if (list != nullptr) {
40                 clear();
41                 g_ptr_array_free(list, true);
42         }
43 }
44
45 const struct mpd_song *
46 MpdQueue::GetChecked(int idx) const
47 {
48         if (idx < 0 || (guint)idx >= size())
49                 return nullptr;
50
51         return &(*this)[idx];
52 }
53
54 void
55 MpdQueue::Move(unsigned dest, unsigned src)
56 {
57         assert(src < size());
58         assert(dest < size());
59         assert(src != dest);
60
61         auto &song = (*this)[src];
62
63         if (src < dest) {
64                 memmove(&list->pdata[src],
65                         &list->pdata[src + 1],
66                         sizeof(list->pdata[0]) * (dest - src));
67                 list->pdata[dest] = &song;
68         } else {
69                 memmove(&list->pdata[dest + 1],
70                         &list->pdata[dest],
71                         sizeof(list->pdata[0]) * (src - dest));
72                 list->pdata[dest] = &song;
73         }
74 }
75
76 int
77 MpdQueue::Find(const struct mpd_song &song) const
78 {
79         for (guint i = 0; i < size(); ++i) {
80                 if (&(*this)[i] == &song)
81                         return (gint)i;
82         }
83
84         return -1;
85 }
86
87 int
88 MpdQueue::FindId(unsigned id) const
89 {
90         for (guint i = 0; i < size(); ++i) {
91                 const auto &song = (*this)[i];
92                 if (mpd_song_get_id(&song) == id)
93                         return (gint)i;
94         }
95
96         return -1;
97 }
98
99 int
100 MpdQueue::FindUri(const char *filename) const
101 {
102         for (guint i = 0; i < size(); ++i) {
103                 const auto &song = (*this)[i];
104                 if (strcmp(mpd_song_get_uri(&song), filename) == 0)
105                         return (gint)i;
106         }
107
108         return -1;
109 }