58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
//
|
|
// Created by rick on 30-01-21.
|
|
//
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <myke/libc/ringqueue.h>
|
|
|
|
#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;
|
|
};
|