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