File: Queue.hxx

package info (click to toggle)
ncmpc 0.33-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 1,976 kB
  • sloc: cpp: 10,895; python: 133; makefile: 39; ruby: 28; sh: 11
file content (134 lines) | stat: -rw-r--r-- 2,964 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* ncmpc (Ncurses MPD Client)
 * (c) 2004-2018 The Music Player Daemon Project
 * Project homepage: http://musicpd.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef QUEUE_HXX
#define QUEUE_HXX

#include "util/Compiler.h"

#include <mpd/client.h>

#include <vector>
#include <memory>

#include <assert.h>

struct SongDeleter {
	void operator()(struct mpd_song *song) const {
		mpd_song_free(song);
	}
};

struct MpdQueue {
	/* queue version number (obtained from mpd_status) */
	unsigned version = 0;

	using Vector = std::vector<std::unique_ptr<struct mpd_song, SongDeleter>>;

	/* the list */
	Vector items;

	using size_type = Vector::size_type;

	size_type size() const {
		return items.size();
	}

	bool empty() const {
		return items.empty();
	}

	/** remove and free all songs in the playlist */
	void clear();

	const struct mpd_song &operator[](size_type i) const {
		assert(i < size());

		return *items[i];
	}

	struct mpd_song &operator[](size_type i) {
		assert(i < size());

		return *items[i];
	}

	gcc_pure
	const struct mpd_song *GetChecked(int i) const;

	void push_back(const struct mpd_song &song) {
		items.emplace_back(mpd_song_dup(&song));
	}

	void Replace(size_type i, const struct mpd_song &song) {
		items[i].reset(mpd_song_dup(&song));
	}

	void RemoveIndex(size_type i) {
		items.erase(std::next(items.begin(), i));
	}

	void Move(unsigned dest, unsigned src);

	/**
	 * Find a song by its reference.  This method compares
	 * #mpd_song references, so this method makes only sense for
	 * songs references which were obtained from this container.
	 *
	 * @return the song position
	 */
	gcc_pure
	size_type FindByReference(const struct mpd_song &song) const;

	/**
	 * Find a song by its id.
	 *
	 * @return the song position
	 */
	gcc_pure
	int FindById(unsigned id) const;

	/**
	 * Find a song by its URI.
	 *
	 * @return the song position
	 */
	gcc_pure
	int FindByUri(const char *uri) const;

	/**
	 * Like FindByUri(), but return the song id, not the song position
	 *
	 * @return the song id
	 */
	gcc_pure
	int FindIdByUri(const char *uri) const {
		int i = FindByUri(uri);
		if (i >= 0)
			i = mpd_song_get_id(items[i].get());
		return i;
	}

	gcc_pure
	bool ContainsUri(const char *uri) const {
		return FindByUri(uri) >= 0;
	}
};

#endif