#pragma once #include typedef struct queue_node { struct queue_node *prev, *next; uint64_t value; } queue_node_t; typedef struct queue { size_t size; queue_node_t *begin, *end; } queue_t; queue_t *make_queue(); uint64_t queue_back(const queue_t *queue); uint64_t queue_front(const queue_t *queue); void queue_push_back(queue_t *queue, uint64_t val); void queue_push_front(queue_t *queue, uint64_t val); uint64_t queue_pop_back(queue_t *queue); uint64_t queue_pop_front(queue_t *queue); #define QUEUE_BACK(type, queue) ((type *)queue_back(queue)) #define QUEUE_FRONT(type, queue) ((type *)queue_front(queue)) #define QUEUE_PUSH_BACK(queue, val) queue_push_back(queue, (uint64_t)val) #define QUEUE_PUSH_FRONT(queue, val) queue_push_front(queue, (uint64_t)val) #define QUEUE_POP_BACK(type, queue) ((type *)queue_pop_back(queue)) #define QUEUE_POP_FRONT(type, queue) ((type *)queue_pop_front(queue))