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:
parent
e2242359d4
commit
e0074525f3
|
@ -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();
|
||||
|
|
|
@ -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--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue