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:
Bryan Schumaker 2012-06-16 14:22:40 -04:00
parent 8b56659b1c
commit bd8cdee041
4 changed files with 29 additions and 8 deletions

View File

@ -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 *);
};
};

View File

@ -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()

View File

@ -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 */

View File

@ -27,6 +27,12 @@ namespace libsaria
{
}
template <class T>
T &ListItem<T>::get_value()
{
return value;
}
}
#endif /* LIBSARIA_NODE_CPP */