#include "int_ring_buf.h" #include struct int_ring_buf { size_t capacity; size_t start; size_t size; int data[0]; }; int_ring_buf irb_create(size_t capacity) { int_ring_buf result = malloc(sizeof(struct int_ring_buf) + capacity * sizeof(int)); if (!result) return NULL; result->capacity = capacity; result->start = 0; result->size = 0; return result; } void irb_destroy(int_ring_buf irb) { free(irb); } size_t irb_capacity(int_ring_buf irb) { return irb->capacity; } size_t irb_size(int_ring_buf irb) { return irb->size; } bool irb_is_empty(int_ring_buf irb) { return irb->size == 0; } bool irb_is_full(int_ring_buf irb) { return irb->size = irb->capacity; } void irb_enqueue(int_ring_buf irb, int element) { size_t index = (irb->start + irb->size) % irb->capacity; irb->data[index] = element; ++irb->size; } int irb_dequeue(int_ring_buf irb) { int result = irb->data[irb->start]; irb->start = (irb->start + 1) % irb->capacity; --irb->size; return result; }