Skip to content

Instantly share code, notes, and snippets.

@sammko
Created July 17, 2018 08:29
Show Gist options
  • Save sammko/a3f2e1958f5b2685f26602df379877b8 to your computer and use it in GitHub Desktop.
Save sammko/a3f2e1958f5b2685f26602df379877b8 to your computer and use it in GitHub Desktop.
Fixed size ring buffer queue in C
#include <stdlib.h>
typedef int rbq_val_t;
struct rbq_t {
rbq_val_t *buffer;
size_t capacity, size;
size_t p;
};
void init_rbq(struct rbq_t *Q, size_t capacity) {
Q->buffer = calloc(capacity, sizeof(rbq_val_t));
Q->capacity = capacity;
Q->p = 0;
Q->size = 0;
}
void free_rbq(struct rbq_t *Q) {
free(Q->buffer);
Q->capacity = 0;
Q->size = 0;
Q->p = 0;
Q->buffer = NULL;
}
void append(struct rbq_t *Q, rbq_val_t v) {
Q->buffer[(Q->p + Q->size++) % Q->capacity] = v;
}
rbq_val_t pop(struct rbq_t *Q) {
return Q->buffer[(Q->p + --Q->size)];
}
void append_left(struct rbq_t *Q, rbq_val_t v) {
Q->p = (Q->p + Q->capacity - 1) % Q->capacity;
Q->size++;
Q->buffer[Q->p] = v;
}
rbq_val_t pop_left(struct rbq_t *Q) {
size_t pp = Q->p;
Q->p = (Q->p + 1) % Q->capacity;
Q->size--;
return Q->buffer[pp];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment