V0: basic init with given backing up buffer, reject to enqueue if full(no override), support dequeue
#include <limits.h>
typedef struct {
int *buffer;
int head; //index of the next element to read, oldest
int tail; // tail is the index where the next write will go (one past the newest item)
int capacity;
int count;
} ring_buffer_t;
void init(ring_buffer_t *rb, int *backing, int capacity){
rb->buffer = backing;
rb->head=0;
rb->tail=0;
rb->capacity=capacity;
rb->count=0;
}
void enqueue(ring_buffer_t *rb, int val){
if (rb->count == rb->capacity){
// Full, reject
return;
}
// Write at current tail, then advance with wrap-around
rb->buffer[rb->tail] = val;
rb->tail = (rb->tail + 1) % rb->capacity;
rb->count++;
}
int dequeue(ring_buffer_t *rb){
//if empty
if (rb->count == 0){
return INT_MIN;
}
int value = rb->buffer[rb->head];
// needs to wrap around
rb->head = (rb->head + 1) % rb->capacity;
rb->count--;
return value;
}