Queue: use std::vector instead of GPtrArray
[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 <algorithm>
23
24 #include <string.h>
25
26 void
27 MpdQueue::clear()
28 {
29         version = 0;
30 }
31
32 const struct mpd_song *
33 MpdQueue::GetChecked(int idx) const
34 {
35         if (idx < 0 || (size_type)idx >= size())
36                 return nullptr;
37
38         return &(*this)[idx];
39 }
40
41 void
42 MpdQueue::Move(unsigned dest, unsigned src)
43 {
44         assert(src < size());
45         assert(dest < size());
46         assert(src != dest);
47
48         auto song = std::move(items[src]);
49
50         if (src < dest) {
51                 std::move(std::next(items.begin(), src + 1),
52                           std::next(items.begin(), dest + 1),
53                           std::next(items.begin(), src));
54         } else {
55                 std::move(std::next(items.begin(), dest),
56                                    std::next(items.begin(), src),
57                                    std::next(items.begin(), dest + 1));
58         }
59
60         assert(!items[dest]);
61         items[dest] = std::move(song);
62 }
63
64 int
65 MpdQueue::Find(const struct mpd_song &song) const
66 {
67         for (size_type i = 0; i < size(); ++i)
68                 if (&(*this)[i] == &song)
69                         return i;
70
71         return -1;
72 }
73
74 int
75 MpdQueue::FindId(unsigned id) const
76 {
77         for (size_type i = 0; i < size(); ++i) {
78                 const auto &song = (*this)[i];
79                 if (mpd_song_get_id(&song) == id)
80                         return i;
81         }
82
83         return -1;
84 }
85
86 int
87 MpdQueue::FindUri(const char *filename) const
88 {
89         for (size_type i = 0; i < size(); ++i) {
90                 const auto &song = (*this)[i];
91                 if (strcmp(mpd_song_get_uri(&song), filename) == 0)
92                         return i;
93         }
94
95         return -1;
96 }