libsaria: Create iterators for lists

Not really C++ iterators, but close enough.  I can get the first and
last values values to use in for loops, I also made a next() function
for list items.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-06-30 11:18:51 -04:00
parent 743caa85e6
commit e2242359d4
3 changed files with 27 additions and 9 deletions

View File

@ -21,6 +21,7 @@ namespace libsaria
ListItem(T, List<T> *);
~ListItem();
T &get_value();
ListItem<T> *get_next();
};
template <class T>
@ -38,6 +39,9 @@ namespace libsaria
void erase(ListItem<T> *);
unsigned int size();
ListItem<T> *first();
ListItem<T> *last();
void for_each_item(void (*)(T &, void *), void *);
ListItem<T> *find_item(bool (*)(T &, void *), void *);
};

View File

@ -69,24 +69,32 @@ namespace libsaria
return count;
}
template <class T>
ListItem<T> *List<T>::first()
{
return head.next;
}
template <class T>
ListItem<T> *List<T>::last()
{
return &head;
}
template <class T>
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;
}
for (ListItem<T> *it = first(); it != last(); it = it->get_next())
func(it->value, data);
}
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))
ListItem<T> *it;
for (it = first(); it != last; it = it->get_next()) {
if (func(it->value, data))
return item;
item = item->next;
}
return NULL;
}

View File

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