Queue: FindByReference() cannot fail
[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 MpdQueue::size_type
66 MpdQueue::FindByReference(const struct mpd_song &song) const
67 {
68         for (size_type i = 0;; ++i) {
69                 assert(i < size());
70
71                 if (&(*this)[i] == &song)
72                         return i;
73         }
74 }
75
76 int
77 MpdQueue::FindById(unsigned id) const
78 {
79         for (size_type i = 0; i < size(); ++i) {
80                 const auto &song = (*this)[i];
81                 if (mpd_song_get_id(&song) == id)
82                         return i;
83         }
84
85         return -1;
86 }
87
88 int
89 MpdQueue::FindByUri(const char *filename) const
90 {
91         for (size_type i = 0; i < size(); ++i) {
92                 const auto &song = (*this)[i];
93                 if (strcmp(mpd_song_get_uri(&song), filename) == 0)
94                         return i;
95         }
96
97         return -1;
98 }