// // Created by rick on 30-01-21. // #include #include #include #define calc_pos(buffer, index) ((buffer->object_size) * (index)) typedef struct { int object_size; int count; int read_pos; int write_pos; void *mem; } ring_buffer_t; void *create_buffer(int count, int object_size) { ring_buffer_t *buffer = malloc(sizeof(ring_buffer_t)); if (buffer == NULL) { return NULL; } buffer->object_size = object_size; buffer->count = count; buffer->read_pos = 0; buffer->write_pos = 0; buffer->mem = calloc(object_size, count); if (buffer->mem == NULL) { free(buffer); return NULL; } return buffer; }; void free_buffer(void *buffer) { free(((ring_buffer_t *) buffer)->mem); free(buffer); } void ring_buffer_put(void *buffer, void *item) { ring_buffer_t *ring_buffer = (ring_buffer_t *) buffer; // todo check if this write would overwrite the current reading pos // todo handle the above case memcpy(ring_buffer->mem + calc_pos(ring_buffer, ring_buffer->write_pos), item, ring_buffer->object_size); ring_buffer->write_pos++; }; bool ring_buffer_get(void *buffer, void *target) { ring_buffer_t *ring_buffer = (ring_buffer_t *) buffer; if (ring_buffer->read_pos == ring_buffer->write_pos) { // nothing to read return false; } memcpy(target, ring_buffer->mem + calc_pos(ring_buffer, ring_buffer->read_pos++), ring_buffer->object_size); return true; };