60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
|
#ifndef UTIL_FIFO_C
|
||
|
#define UTIL_FIFO_C
|
||
|
|
||
|
#define FIFO_INITIAL_SIZE 128
|
||
|
#define FIFO_QUEUE_EMPTY -1
|
||
|
|
||
|
#include <stddef.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include "../memory.c"
|
||
|
|
||
|
typedef struct fifo_struct {
|
||
|
int num_elems;
|
||
|
int max_elems;
|
||
|
uint8_t* head;
|
||
|
uint8_t* curr_elem;
|
||
|
} fifo;
|
||
|
|
||
|
fifo* fifo_new() {
|
||
|
fifo* ret = alloc(sizeof(fifo));
|
||
|
void* head = alloc(sizeof(uint8_t) * FIFO_INITIAL_SIZE);
|
||
|
ret->num_elems = 0;
|
||
|
ret->max_elems = FIFO_INITIAL_SIZE;
|
||
|
ret->head = head;
|
||
|
ret->curr_elem = head;
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
void fifo_optimize(fifo* queue) {
|
||
|
if (queue->head == queue->curr_elem) {
|
||
|
// resize, not implemented yet (blocked by reallocarray)
|
||
|
} else {
|
||
|
// move all items to the beginning of the list
|
||
|
for(int i = 0; i < queue->num_elems; i++) {
|
||
|
queue->head[i] = queue->curr_elem[i];
|
||
|
}
|
||
|
queue->curr_elem = queue->head;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void fifo_enqueue(fifo* queue, uint8_t value) {
|
||
|
if (queue->num_elems == queue->max_elems) {
|
||
|
fifo_optimize(queue);
|
||
|
}
|
||
|
queue->curr_elem[queue->num_elems] = value;
|
||
|
queue->num_elems++;
|
||
|
}
|
||
|
|
||
|
int16_t fifo_dequeue(fifo* queue) {
|
||
|
if (queue->num_elems <= 0) {
|
||
|
return FIFO_QUEUE_EMPTY;
|
||
|
}
|
||
|
uint8_t ret = queue->curr_elem[0];
|
||
|
queue->curr_elem++;
|
||
|
queue->num_elems--;
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#endif //UTIL_FIFO_C
|