libsaria: Convert the idle queue to use the new list class

- The erase() function returns the previous item
- Implement a push_front() function
- Implement a pop_front() function

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-06-30 11:59:32 -04:00
parent e2242359d4
commit e0074525f3
4 changed files with 60 additions and 40 deletions

View File

@ -11,17 +11,17 @@ namespace libsaria
class ListItem {
friend class List<T>;
private:
ListItem *prev;
ListItem *next;
ListItem *prev_item;
ListItem *next_item;
List<T> *list;
T value;
public:
ListItem();
ListItem(T, List<T> *);
ListItem(T, List<T> *, ListItem<T> *, ListItem<T> *);
~ListItem();
T &get_value();
ListItem<T> *get_next();
ListItem<T> *next();
};
template <class T>
@ -35,8 +35,11 @@ namespace libsaria
List(const List<T> &);
~List();
ListItem<T> *push_front(T);
ListItem<T> *push_back(T);
void erase(ListItem<T> *);
T pop_front();
ListItem<T> *erase(ListItem<T> *);
unsigned int size();
ListItem<T> *first();

View File

@ -1,12 +1,10 @@
// Copyright (c) 2011 Bryan Schumaker.
#include <libsaria/idle.h>
#include <libsaria/list.h>
#include <libsaria/print.h>
#include <list>
using namespace std;
static bool enabled = false;
static list<IdleTask *> idle_queue;
static libsaria::List<IdleTask *> idle_queue;
static float queued = 0.0;
static float serviced = 0.0;
@ -36,8 +34,7 @@ namespace libsaria
IdleTask *task;
if (size() == 0)
return;
task = idle_queue.front();
idle_queue.pop_front();
task = idle_queue.pop_front();
do_task(task);
if (size() == 0) {
queued = 0.0;
@ -67,12 +64,10 @@ namespace libsaria
void idle::cancel_all(void *data)
{
list<IdleTask *>::iterator it;
for (it = idle_queue.begin(); it != idle_queue.end(); it++) {
if ((*it)->should_cancel(data)) {
ListItem<IdleTask *> *it;
for (it = idle_queue.first(); it != idle_queue.last(); it = it->next()) {
if (it->get_value()->should_cancel(data))
it = idle_queue.erase(it);
it--;
}
}
}

View File

@ -32,35 +32,52 @@ namespace libsaria
List<T>::~List()
{
while (count > 0)
erase(head.next);
erase(head.next_item);
}
template <class T>
ListItem<T> *List<T>::push_back(T item)
ListItem<T> *List<T>::push_front(T item)
{
ListItem<T> *node = new ListItem<T>(item, this);
ListItem<T> *last = head.prev;
last->next = node;
node->prev = last;
node->next = &head;
head.prev = node;
ListItem<T> *node;
node = new ListItem<T>(item, this, &head, first());
count++;
return node;
}
template <class T>
void List<T>::erase(ListItem<T> *node)
ListItem<T> *List<T>::push_back(T item)
{
ListItem<T> *prev = node->prev;
ListItem<T> *next = node->next;
ListItem<T> *node;
node = new ListItem<T>(item, this, head.prev_item, &head);
count++;
return node;
}
prev->next = next;
next->prev = prev;
template <class T>
T List<T>::pop_front()
{
T item;
if (count == 0)
item = head.value;
else {
item = first()->value;
erase(first());
}
return item;
}
template <class T>
ListItem<T> *List<T>::erase(ListItem<T> *node)
{
ListItem<T> *prev = node->prev_item;
ListItem<T> *next = node->next_item;
prev->next_item = next;
next->prev_item = prev;
count--;
delete node;
return prev;
}
template <class T>
@ -72,7 +89,7 @@ namespace libsaria
template <class T>
ListItem<T> *List<T>::first()
{
return head.next;
return head.next_item;
}
template <class T>
@ -84,7 +101,7 @@ namespace libsaria
template <class T>
void List<T>::for_each_item(void (*func)(T &, void *), void *data)
{
for (ListItem<T> *it = first(); it != last(); it = it->get_next())
for (ListItem<T> *it = first(); it != last(); it = it->next())
func(it->value, data);
}
@ -92,9 +109,9 @@ namespace libsaria
ListItem<T> *List<T>::find_item(bool (*func)(T &, void *), void *data)
{
ListItem<T> *it;
for (it = first(); it != last; it = it->get_next()) {
for (it = first(); it != last(); it = it->next()) {
if (func(it->value, data))
return item;
return it;
}
return NULL;
}

View File

@ -11,15 +11,20 @@ namespace libsaria
template <class T>
ListItem<T>::ListItem()
{
prev = this;
next = this;
prev_item = this;
next_item = this;
}
template <class T>
ListItem<T>::ListItem(T val, List<T> *lst)
ListItem<T>::ListItem(T val, List<T> *lst, ListItem<T> *a, ListItem<T> *b)
{
list = lst;
value = val;
a->next_item = this;
prev_item = a;
next_item = b;
b->prev_item = this;
}
template <class T>
@ -34,9 +39,9 @@ namespace libsaria
}
template <class T>
ListItem<T> *ListItem<T>::get_next()
ListItem<T> *ListItem<T>::next()
{
return next;
return next_item;
}
}