43 lines
938 B
C
43 lines
938 B
C
#ifndef _ringbuffer_h
|
|
#define _ringbuffer_h
|
|
|
|
int __mod(int a, int b)
|
|
{
|
|
int r = a % b;
|
|
return r < 0 ? r + b : r;
|
|
}
|
|
|
|
#define ring_buffer_typedef(T, NAME) \
|
|
typedef struct { \
|
|
int size; \
|
|
int start; \
|
|
int end; \
|
|
T* elems; \
|
|
} NAME
|
|
|
|
#define buffer_init(BUF, S, T) \
|
|
BUF.size = S+1; \
|
|
BUF.start = 0; \
|
|
BUF.end = 0; \
|
|
BUF.elems = (T*)calloc(BUF.size, sizeof(T))
|
|
|
|
|
|
#define buffer_destroy(BUF) free(BUF->elems)
|
|
#define nex_start_index(BUF) ((BUF->start + 1) % BUF->size)
|
|
#define is_buffer_empty(BUF) (BUF->end == BUF->start)
|
|
#define buffer_get(BUF, INDEX) (BUF->elems[__mod(BUF->end - INDEX, BUF->size)])
|
|
|
|
#define bufferWrite(BUF, ELEM) \
|
|
BUF->elems[BUF->end] = ELEM; \
|
|
BUF->end = (BUF->end + 1) % BUF->size; \
|
|
if (is_buffer_empty(BUF)) { \
|
|
BUF->start = nex_start_index(BUF); \
|
|
}
|
|
|
|
#define bufferRead(BUF, ELEM) \
|
|
ELEM = BUF->elems[BUF->start]; \
|
|
BUF->start = nex_start_index(BUF);
|
|
|
|
#endif
|
|
|