ringbuffer.h 938 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #ifndef _ringbuffer_h
  2. #define _ringbuffer_h
  3. int __mod(int a, int b)
  4. {
  5. int r = a % b;
  6. return r < 0 ? r + b : r;
  7. }
  8. #define ring_buffer_typedef(T, NAME) \
  9. typedef struct { \
  10. int size; \
  11. int start; \
  12. int end; \
  13. T* elems; \
  14. } NAME
  15. #define buffer_init(BUF, S, T) \
  16. BUF.size = S+1; \
  17. BUF.start = 0; \
  18. BUF.end = 0; \
  19. BUF.elems = (T*)calloc(BUF.size, sizeof(T))
  20. #define buffer_destroy(BUF) free(BUF->elems)
  21. #define nex_start_index(BUF) ((BUF->start + 1) % BUF->size)
  22. #define is_buffer_empty(BUF) (BUF->end == BUF->start)
  23. #define buffer_get(BUF, INDEX) (BUF->elems[__mod(BUF->end - INDEX, BUF->size)])
  24. #define bufferWrite(BUF, ELEM) \
  25. BUF->elems[BUF->end] = ELEM; \
  26. BUF->end = (BUF->end + 1) % BUF->size; \
  27. if (is_buffer_empty(BUF)) { \
  28. BUF->start = nex_start_index(BUF); \
  29. }
  30. #define bufferRead(BUF, ELEM) \
  31. ELEM = BUF->elems[BUF->start]; \
  32. BUF->start = nex_start_index(BUF);
  33. #endif