46 lines
1.2 KiB
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;
|
|
|
|
} |