pianod2
multisource multiuser scriptable networked music player
retainedlist.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <vector>
12 #include <type_traits>
13 
14 #include "musictypes.h"
15 #include "retainer.h"
16 
20 class ThingieList : public std::vector<MusicThingie *> {
21  using list_type = std::vector<MusicThingie *>;
22 
23 public:
24  ~ThingieList();
25  ThingieList() = default;
26  ThingieList (const ThingieList &list);
27  ThingieList (ThingieList &&list);
28  ThingieList &operator= (const ThingieList &list);
30 
31  // Get rid of forms we will not use
32  template <class... Args>
33  iterator emplace (const_iterator pos, Args &&...args) = delete;
34  template <class... Args>
35  void emplace_back (Args &&...args) = delete;
36  iterator insert (const_iterator pos, std::initializer_list<MusicThingie *>) = delete;
37 
39  void clear (void);
40  iterator erase (const_iterator target);
41  iterator erase (const_iterator first, const_iterator last);
42  iterator insert (const_iterator where, MusicThingie *const &add);
43  iterator insert (const_iterator where, MusicThingie *&&add);
44  template <class InputIterator>
45  iterator insert (const_iterator where, InputIterator first, InputIterator last) {
46  difference_type offset = where - cbegin();
47  for (const_iterator insloc = where; first != last; insloc++, first++) {
48  insert (insloc, *first);
49  }
50  return begin() + offset;
51  }
52 
53  void push_back (MusicThingie *add);
54  template <typename InsertionType>
55  void push_back (const Retainer<InsertionType> &add) {
56  push_back (add.get());
57  }
58 
59  void push_front (MusicThingie *add);
60  template <typename InsertionType>
61  inline void push_front (const Retainer<InsertionType> &add) {
62  push_front (add.get());
63  }
64 
65  void pop_back (void);
66  void pop_front (void);
67  void resize (size_type) = delete;
68  // Added stuff
69  void join (const ThingieList &from);
70  void join (ThingieList &&from);
71  void limitTo (MusicThingie::Type type);
72  bool purge (const Media::Source *const source);
73 };
74 
79 template <typename ActualType, class ValueType = typename std::remove_pointer<ActualType>::type>
80 class RetainedList : public ThingieList {
81  static_assert (std::is_pointer<ActualType>::value, "First template parameter must be pointer type");
82  static_assert (std::is_base_of<MusicThingie, ValueType>::value, "Can only store MusicThingie and descendents.");
84 
85 public:
86  using music_type = ValueType;
87  using ThingieList::size_type;
88  using ThingieList::empty;
89  using ThingieList::size;
90  using ThingieList::reserve;
91 
93  inline RetainedList() = default;
94 
96  inline RetainedList (const this_type &list) : ThingieList (*static_cast<const ThingieList *> (&list)) {
97  }
98 
100  inline RetainedList (this_type &&list) : ThingieList (std::move (*static_cast<ThingieList *> (&list))){};
101 
103  inline this_type &operator= (const this_type &list) {
104  ThingieList::operator= (*static_cast<const ThingieList *> (&list));
105  return *this;
106  }
107 
109  inline this_type &operator= (this_type &&list) {
110  ThingieList::operator= (std::move (*static_cast<ThingieList *> (&list)));
111  return *this;
112  }
113 
115  template <typename FromPointerType,
116  class FromValueType = typename std::remove_pointer<FromPointerType>::type,
119  : ThingieList (*static_cast<const ThingieList *> (&list)) {
120  }
121 
123  template <typename FromPointerType,
124  class FromValueType = typename std::remove_pointer<FromPointerType>::type,
127  : ThingieList (std::move (*static_cast<ThingieList *> (&list))){};
128 
130  template <typename FromPointerType,
131  class FromValueType = typename std::remove_pointer<FromPointerType>::type,
134  ThingieList::operator= (*static_cast<const ThingieList *> (&list));
135  return *this;
136  }
137 
139  template <typename FromPointerType,
140  class FromValueType = typename std::remove_pointer<FromPointerType>::type,
143  ThingieList::operator= (std::move (*static_cast<ThingieList *> (&list)));
144  return *this;
145  }
146 
148  class iterator : public ThingieList::iterator {
149  public:
150  inline ActualType operator*() const noexcept {
151  return static_cast<ActualType> (ThingieList::iterator::operator*());
152  }
153  };
154  class const_iterator : public ThingieList::const_iterator {
155  public:
156  using ThingieList::const_iterator::const_iterator;
157  inline const_iterator (const iterator &from)
158  : ThingieList::const_iterator (*static_cast<const ThingieList::iterator *> (&from)){};
159 
160  inline ActualType operator*() const noexcept {
161  return static_cast<const ActualType> (ThingieList::const_iterator::operator*());
162  }
163  };
164  class reverse_iterator : public ThingieList::reverse_iterator {
165  public:
166  inline ActualType operator*() const noexcept {
167  return static_cast<ActualType> (ThingieList::reverse_iterator::operator*());
168  }
169  };
170  class const_reverse_iterator : public ThingieList::const_reverse_iterator {
171  public:
172  inline ActualType operator*() const noexcept {
173  return static_cast<const ActualType> (ThingieList::const_reverse_iterator::operator*());
174  }
175  };
176 
178  inline iterator begin() noexcept {
179  ThingieList::iterator temp = ThingieList::begin();
180  return *static_cast<iterator *> (&temp);
181  }
182  inline const_iterator begin() const noexcept {
183  ThingieList::const_iterator temp = ThingieList::begin();
184  return *static_cast<const_iterator *> (&temp);
185  }
186  inline const_iterator cbegin() const noexcept {
187  ThingieList::const_iterator temp = ThingieList::cbegin();
188  return *static_cast<const_iterator *> (&temp);
189  }
190  inline iterator end() noexcept {
191  ThingieList::iterator temp = ThingieList::end();
192  return *static_cast<iterator *> (&temp);
193  }
194  inline const_iterator end() const noexcept {
195  ThingieList::const_iterator temp = ThingieList::end();
196  return *static_cast<const_iterator *> (&temp);
197  }
198  inline const_iterator cend() const noexcept {
199  ThingieList::const_iterator temp = ThingieList::cend();
200  return *static_cast<const_iterator *> (&temp);
201  }
202 
203  inline reverse_iterator rbegin() noexcept {
204  ThingieList::reverse_iterator temp = ThingieList::rbegin();
205  return *static_cast<reverse_iterator *> (&temp);
206  }
207  inline const_reverse_iterator rbegin() const noexcept {
208  ThingieList::const_reverse_iterator temp = ThingieList::rbegin();
209  return *static_cast<const_reverse_iterator *> (&temp);
210  }
211  inline const_reverse_iterator crbegin() const noexcept {
212  ThingieList::const_reverse_iterator temp = ThingieList::crbegin();
213  return *static_cast<const_reverse_iterator *> (&temp);
214  }
215  inline reverse_iterator rend() noexcept {
216  ThingieList::reverse_iterator temp = ThingieList::rend();
217  return *static_cast<reverse_iterator *> (&temp);
218  }
219  inline const_reverse_iterator rend() const noexcept {
220  ThingieList::const_reverse_iterator temp = ThingieList::rend();
221  return *static_cast<const_reverse_iterator *> (&temp);
222  }
223  inline const_reverse_iterator crend() const noexcept {
224  ThingieList::const_reverse_iterator temp = ThingieList::crend();
225  return *static_cast<const_reverse_iterator *> (&temp);
226  }
227 
229  inline ActualType operator[] (size_type item) {
230  return static_cast<ActualType> (ThingieList::operator[] (item));
231  }
232  inline ActualType const &operator[] (size_type item) const {
233  MusicThingie *const *temp = &ThingieList::operator[] (item);
234  return *reinterpret_cast<ActualType const *> (temp);
235  }
236  inline ActualType &front() {
237  MusicThingie **temp = &ThingieList::front();
238  return *reinterpret_cast<ActualType *> (temp);
239  }
240  inline const ActualType &front() const {
241  MusicThingie *const *temp = &ThingieList::front();
242  return *reinterpret_cast<ActualType const *> (temp);
243  }
244  inline ActualType &back() {
245  MusicThingie **temp = &ThingieList::back();
246  return *reinterpret_cast<ActualType *> (temp);
247  }
248  inline const ActualType &back() const {
249  MusicThingie *const *temp = &ThingieList::back();
250  return *reinterpret_cast<ActualType const *> (temp);
251  }
252 
253  // Correct returned iterator type.
254  inline iterator erase (const_iterator target) {
255  ThingieList::iterator temp = ThingieList::erase (target);
256  return *static_cast<iterator *> (&temp);
257  }
259  ThingieList::iterator temp = ThingieList::erase (first, last);
260  return *static_cast<iterator *> (&temp);
261  }
262 
263  // Override push_* functions, using our type as the parameter to prevent unwanted cruft getting in.
264  inline void push_back (ActualType add) {
266  }
267  template <typename InsertionType>
268  inline void push_back (const Retainer<InsertionType> &add) {
269  push_back (add.get());
270  }
271  inline void push_front (ActualType add) {
273  }
274  template <typename InsertionType>
275  inline void push_front (const Retainer<InsertionType> &add) {
276  push_front (add.get());
277  }
278 
279  iterator insert (const_iterator where, const ActualType add) {
280  ThingieList::iterator temp = ThingieList::insert (where, add);
281  return *static_cast<iterator *> (&temp);
282  }
283 
284  template <class InputIterator>
285  iterator insert (const_iterator where, InputIterator first, InputIterator last) {
286  for (const_iterator insloc = where; first != last; insloc++, first++) {
287  insert (insloc, *first);
288  }
289  return begin() + (where - cbegin());
290  }
291 
292  inline void join (const this_type &from) {
293  ThingieList::join (*static_cast<const ThingieList *> (&from));
294  }
295  inline void join (this_type &&from) {
296  ThingieList::join (std::move (*static_cast<ThingieList *> (&from)));
297  }
298 };
299 
304 template <typename ToValueType, typename FromListType>
305 constexpr const RetainedList<ToValueType> &retained_list_cast (FromListType &from) {
306  static_assert (
307  std::is_base_of<typename FromListType::music_type, typename std::remove_pointer<ToValueType>::type>::value,
308  "List element types are not related.");
309  return *reinterpret_cast<RetainedList<ToValueType> *> (&from);
310 }
311 
315 template <typename ToValueType, typename FromListType>
316 constexpr const RetainedList<ToValueType> &retained_list_cast (const FromListType &from) {
317  static_assert (
318  std::is_base_of<typename FromListType::music_type, typename std::remove_pointer<ToValueType>::type>::value,
319  "List element types are not related.");
320  return *reinterpret_cast<const RetainedList<ToValueType> *> (&from);
321 }
322 
324 class PlaylistList : public RetainedList<PianodPlaylist *> {};
325 
328 class SongList : public RetainedList<PianodSong *> {
329 public:
331  void mixedMerge (const SongList &adds);
332 };
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
A container for lists of playlists.
Definition: retainedlist.h:324
Definition: retainedlist.h:154
const_iterator(const iterator &from)
Definition: retainedlist.h:157
ActualType operator*() const noexcept
Definition: retainedlist.h:160
Definition: retainedlist.h:170
ActualType operator*() const noexcept
Definition: retainedlist.h:172
Iterators: bastardize ThingieList's iterator's dereference operators to return known type.
Definition: retainedlist.h:148
ActualType operator*() const noexcept
Definition: retainedlist.h:150
Definition: retainedlist.h:164
ActualType operator*() const noexcept
Definition: retainedlist.h:166
Container class for storing reference-counted music thingies.
Definition: retainedlist.h:80
const_reverse_iterator crbegin() const noexcept
Definition: retainedlist.h:211
ActualType & back()
Definition: retainedlist.h:244
ActualType & front()
Definition: retainedlist.h:236
iterator insert(const_iterator where, const ActualType add)
Definition: retainedlist.h:279
void push_front(const Retainer< InsertionType > &add)
Definition: retainedlist.h:275
RetainedList(const this_type &list)
Copy construct from list of same type.
Definition: retainedlist.h:96
const_iterator cbegin() const noexcept
Definition: retainedlist.h:186
iterator insert(const_iterator where, InputIterator first, InputIterator last)
Definition: retainedlist.h:285
const_reverse_iterator rend() const noexcept
Definition: retainedlist.h:219
iterator erase(const_iterator first, const_iterator last)
Definition: retainedlist.h:258
RetainedList(this_type &&list)
Move construct from a list of the same type.
Definition: retainedlist.h:100
this_type & operator=(const this_type &list)
Copy assign from a list of the same type.
Definition: retainedlist.h:103
iterator erase(const_iterator target)
Definition: retainedlist.h:254
const_reverse_iterator crend() const noexcept
Definition: retainedlist.h:223
ActualType operator[](size_type item)
Member accessors: return data as known type, instead of ThingieList.
Definition: retainedlist.h:229
const_iterator begin() const noexcept
Definition: retainedlist.h:182
RetainedList(RetainedList< FromPointerType > &&list)
Move construct from another RetainedList whose value type is a subclass of our value type.
Definition: retainedlist.h:126
RetainedList(const RetainedList< FromPointerType > &list)
Copy construct from another RetainedList whose value type is a subclass of our value type.
Definition: retainedlist.h:118
reverse_iterator rbegin() noexcept
Definition: retainedlist.h:203
void push_back(const Retainer< InsertionType > &add)
Definition: retainedlist.h:268
const ActualType & front() const
Definition: retainedlist.h:240
const_iterator cend() const noexcept
Definition: retainedlist.h:198
reverse_iterator rend() noexcept
Definition: retainedlist.h:215
ValueType music_type
Definition: retainedlist.h:86
iterator end() noexcept
Definition: retainedlist.h:190
void join(const this_type &from)
Definition: retainedlist.h:292
void push_front(ActualType add)
Definition: retainedlist.h:271
void join(this_type &&from)
Definition: retainedlist.h:295
const ActualType & back() const
Definition: retainedlist.h:248
const_iterator end() const noexcept
Definition: retainedlist.h:194
RetainedList()=default
Default constructor.
iterator begin() noexcept
Iterators: Return our iterators with correct dereference operator instead of the ThingieList ones.
Definition: retainedlist.h:178
void push_back(ActualType add)
Definition: retainedlist.h:264
const_reverse_iterator rbegin() const noexcept
Definition: retainedlist.h:207
Smart containers to help manage reference counting the MusicThingies.
Definition: retainer.h:13
value_type * get() const
Get the pointer itself.
Definition: retainer.h:128
A container for holding songs.
Definition: retainedlist.h:328
void mixedMerge(const SongList &adds)
Randomly merge a songlist into another.
Definition: retainedlist.cpp:154
Base class for storing lists of thingies, which need to be reference counted accurately.
Definition: retainedlist.h:20
void push_back(const Retainer< InsertionType > &add)
Definition: retainedlist.h:55
iterator insert(const_iterator where, MusicThingie *&&add)
void push_back(MusicThingie *add)
Definition: retainedlist.cpp:89
void push_front(const Retainer< InsertionType > &add)
Definition: retainedlist.h:61
void clear(void)
Replace all the usual methods with ones that manage object retention.
Definition: retainedlist.cpp:58
iterator insert(const_iterator where, InputIterator first, InputIterator last)
Definition: retainedlist.h:45
std::vector< MusicThingie * > list_type
Definition: retainedlist.h:21
~ThingieList()
Release items when being destroyed.
Definition: retainedlist.cpp:17
bool purge(const Media::Source *const source)
Purge any items from a particular source from the list.
Definition: retainedlist.cpp:126
void limitTo(MusicThingie::Type type)
Purge anything that isn't a certain type.
Definition: retainedlist.cpp:140
void pop_back(void)
Definition: retainedlist.cpp:98
void resize(size_type)=delete
void join(const ThingieList &from)
Append another thingielist to this one.
Definition: retainedlist.cpp:111
void push_front(MusicThingie *add)
Definition: retainedlist.cpp:94
void emplace_back(Args &&...args)=delete
ThingieList & operator=(const ThingieList &list)
Copy assign into the list.
Definition: retainedlist.cpp:40
iterator insert(const_iterator pos, std::initializer_list< MusicThingie * >)=delete
iterator emplace(const_iterator pos, Args &&...args)=delete
void pop_front(void)
Definition: retainedlist.cpp:104
ThingieList()=default
iterator erase(const_iterator target)
Definition: retainedlist.cpp:64
Playlist / Artist / Album / Song data types.
uint32_t value
Definition: audiooutput.cpp:68
constexpr const RetainedList< ToValueType > & retained_list_cast(FromListType &from)
static typecast for thingie lists: Typecasts a list of a given type to a list of a derived type.
Definition: retainedlist.h:305
Smart pointers for music thingie types.