libsaria: Implement a find_item() for lists
This function takes a function pointer argument that should return "true" if the current item is the item we're looking for and "false" otherwise. Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
parent
8b56659b1c
commit
bd8cdee041
|
@ -20,6 +20,7 @@ namespace libsaria
|
|||
ListItem();
|
||||
ListItem(T, List<T> *);
|
||||
~ListItem();
|
||||
T &get_value();
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
@ -38,6 +39,7 @@ namespace libsaria
|
|||
unsigned int size();
|
||||
|
||||
void for_each_item(void (*)(T &, void *), void *);
|
||||
ListItem<T> *find_item(bool (*)(T &, void *), void *);
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -66,6 +66,11 @@ static void sort_tracks(libsaria::Track &track, void *data)
|
|||
sort->tracks.push_back(&track);
|
||||
}
|
||||
|
||||
static bool check_trackid(libsaria::Track &track, void *data)
|
||||
{
|
||||
return track.get_id() == *(unsigned int *)data;
|
||||
}
|
||||
|
||||
void pop_path(libsaria::library::Path *path)
|
||||
{
|
||||
list<libsaria::library::Path>::iterator it;
|
||||
|
@ -158,7 +163,7 @@ namespace libsaria
|
|||
Track *library::lookup(unsigned int libid, unsigned int trackid)
|
||||
{
|
||||
list<Path>::iterator p_it;
|
||||
list<Track>::iterator t_it;
|
||||
ListItem<Track> *track;
|
||||
|
||||
for (p_it = path_list.begin(); p_it != path_list.end(); p_it++) {
|
||||
if (p_it->id == libid)
|
||||
|
@ -167,13 +172,10 @@ namespace libsaria
|
|||
if (p_it == path_list.end())
|
||||
return NULL;
|
||||
|
||||
for (t_it = p_it->tracks.begin(); t_it != p_it->tracks.end(); t_it++) {
|
||||
if (t_it->get_id() == trackid)
|
||||
break;
|
||||
}
|
||||
if (t_it == p_it->tracks.end())
|
||||
track = p_it->_tracks.find_item(check_trackid, &trackid);
|
||||
if (track == NULL)
|
||||
return NULL;
|
||||
return &(*t_it);
|
||||
return &track->get_value();
|
||||
}
|
||||
|
||||
Playlist *library::get_playlist()
|
||||
|
|
|
@ -73,13 +73,24 @@ namespace libsaria
|
|||
void List<T>::for_each_item(void (*func)(T &, void *), void *data)
|
||||
{
|
||||
ListItem<T> *item = head.next;
|
||||
|
||||
while (item != &head) {
|
||||
func(item->value, data);
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
ListItem<T> *List<T>::find_item(bool (*func)(T &, void *), void *data)
|
||||
{
|
||||
ListItem<T> *item = head.next;
|
||||
while (item != &head) {
|
||||
if (func(item->value, data))
|
||||
return item;
|
||||
item = item->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif /* LIBSARIA_LIST_CPP */
|
||||
|
|
|
@ -27,6 +27,12 @@ namespace libsaria
|
|||
{
|
||||
}
|
||||
|
||||
template <class T>
|
||||
T &ListItem<T>::get_value()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif /* LIBSARIA_NODE_CPP */
|
||||
|
|
Loading…
Reference in New Issue