88 lines
1.8 KiB
C
88 lines
1.8 KiB
C
#include <queue.h>
|
|
#include <errcode.h>
|
|
#include <utils.h>
|
|
#include <kmalloc.h>
|
|
|
|
queue_t *make_queue()
|
|
{
|
|
queue_t *ret = kmalloc(sizeof(queue_t));
|
|
*ret = (queue_t){
|
|
.size = 0,
|
|
.begin = kmalloc(sizeof(queue_node_t)),
|
|
.end = kmalloc(sizeof(queue_node_t)),
|
|
};
|
|
*ret->begin = *ret->end = (queue_node_t){
|
|
.prev = (queue_node_t *)ret->begin,
|
|
.next = (queue_node_t *)ret->end,
|
|
.value = 0,
|
|
};
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint64_t queue_back(const queue_t *queue)
|
|
{
|
|
if (!queue->size)
|
|
panic(ERR_OUT_OF_BOUND);
|
|
return queue->end->prev->value;
|
|
}
|
|
|
|
uint64_t queue_front(const queue_t *queue)
|
|
{
|
|
if (!queue->size)
|
|
panic(ERR_OUT_OF_BOUND);
|
|
return queue->begin->next->value;
|
|
}
|
|
|
|
void queue_push_back(queue_t *queue, uint64_t val)
|
|
{
|
|
queue->end->value = val;
|
|
queue->end->next = kmalloc(sizeof(queue_node_t));
|
|
*queue->end->next = (queue_node_t){
|
|
.prev = queue->end,
|
|
.next = queue->end->next,
|
|
.value = 0,
|
|
};
|
|
queue->end = queue->end->next;
|
|
++queue->size;
|
|
}
|
|
|
|
void queue_push_front(queue_t *queue, uint64_t val)
|
|
{
|
|
queue->begin->value = val;
|
|
queue->begin->prev = kmalloc(sizeof(queue_node_t));
|
|
*queue->begin->prev = (queue_node_t){
|
|
.prev = queue->begin->prev,
|
|
.next = queue->begin,
|
|
.value = 0,
|
|
};
|
|
queue->begin = queue->begin->prev;
|
|
++queue->size;
|
|
}
|
|
|
|
uint64_t queue_pop_back(queue_t *queue)
|
|
{
|
|
if (!queue->size)
|
|
panic(ERR_OUT_OF_BOUND);
|
|
|
|
uint64_t ret = queue->end->prev->value;
|
|
queue->end->prev = queue->end->prev->prev;
|
|
queue->end->prev->next = queue->end;
|
|
|
|
--queue->size;
|
|
return ret;
|
|
}
|
|
|
|
uint64_t queue_pop_front(queue_t *queue)
|
|
{
|
|
if (!queue->size)
|
|
panic(ERR_OUT_OF_BOUND);
|
|
|
|
uint64_t ret = queue->begin->next->value;
|
|
queue->begin->next = queue->begin->next->next;
|
|
queue->begin->next->prev = queue->begin;
|
|
|
|
--queue->size;
|
|
return ret;
|
|
}
|