aoc-2021/src/queue.c

46 lines
1.2 KiB
C

#include "string.h"
#include "queue.h"
static size_t next_element(size_t index, size_t max_len) {
return (index + 1) % max_len;
}
queue_ret_t queue_init(queue_t * queue, void * data, size_t max_data_size, size_t element_size) {
queue->data = data;
queue->max_data_size = max_data_size;
queue->element_size = element_size;
queue->queued_elements = 0;
queue->pop_ndx = 0;
queue->push_ndx = 0;
return QUEUE_OK;
}
queue_ret_t queue_push(queue_t * queue, void * element) {
if (queue->queued_elements >= queue->max_data_size) {
return QUEUE_FULL;
}
memcpy(queue->data + (queue->push_ndx*queue->element_size), element, queue->element_size);
queue->push_ndx = next_element(queue->push_ndx, queue->max_data_size);
queue->queued_elements++;
return QUEUE_OK;
}
queue_ret_t queue_pop(queue_t * queue, void * store_to) {
if (queue->queued_elements == 0) {
return QUEUE_EMPTY;
}
memcpy(store_to, queue->data + (queue->pop_ndx*queue->element_size), queue->element_size);
queue->pop_ndx = next_element(queue->pop_ndx, queue->max_data_size);
queue->queued_elements--;
return QUEUE_OK;
}