#include #include #include #include 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; }