typedef void* QUEUE_DATA;
typedef struct QUEUE_NODE
{
struct QUEUE_NODE *nextNode;
QUEUE_DATA data;
} QUEUE_NODE;
typedef struct
{
QUEUE_ELEM *firstNode, *lastNode;
int count;
} QUEUE;
void queue_clear(QUEUE *self)
{
QUEUE_NODE *node = self->firstNode;
while (node)
{
QUEUE_NODE *next_node = node->next;
sys_free(node);
node = next_node;
}
}
QUEUE *queue_create()
{
return sys_malloc(sizeof(QUEUE));
}
void queue_destroy(QUEUE *self)
{
queue_clear(self);
sys_free(self);
}
BOOL queue_empty(QUEUE *self)
{
return self->count == 0;
}
QUEUE_DATA queue_front(QUEUE *self)
{
if (queue_empty(self))
return 0;
return self->firstNode->data;
}
QUEUE_DATA queue_pop(QUEUE *self)
{
if (queue_empty(self))
return 0;
QUEUE_DATA tmp_data = self->firstNode->data;
QUEUE_NODE *popped_node = self->firstNode;
self->firstNode = self->firstNode->nextNode;
sys_free(popped_node);
self->count--;
return tmp_data;
}
void queue_push(QUEUE *self, QUEUE_DATA data)
{
QUEUE_NODE *node = sys_malloc(sizeof(QUEUE_NODE));
if (self->lastNode)
self->lastNode->nextNode = node;
else
self->firstNode = node;
self->lastNode = node;
self->count++;
}