RingBuffer.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "core/RingBuffer.h"
  2. #include <assert.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "core/Utility.h"
  6. void coreDestroyRingBuffer(CoreRingBuffer* r) {
  7. coreClearRingBuffer(r);
  8. r->dataSize = 0;
  9. r->capacity = 0;
  10. coreFree(r->data);
  11. r->data = nullptr;
  12. }
  13. static void* getPointer(CoreRingBuffer* r, size_t index) {
  14. return (char*)r->data + r->dataSize * index;
  15. }
  16. CoreRingBuffer* coreRingBufferAddPointer(CoreRingBuffer* r, const void* data) {
  17. if(r->length >= r->capacity) {
  18. return nullptr;
  19. } else if(r->data == nullptr) {
  20. r->data = coreAllocate(r->capacity * r->dataSize);
  21. }
  22. memcpy(getPointer(r, r->writeIndex), data, r->dataSize);
  23. r->writeIndex = (r->writeIndex + 1) % r->capacity;
  24. r->length++;
  25. return r;
  26. }
  27. void* coreRingBufferGetVoidPointer(CoreRingBuffer* r, size_t index) {
  28. return getPointer(r, (index + r->readIndex) % r->capacity);
  29. }
  30. const void* coreRingBufferGetVoidPointerC(const CoreRingBuffer* r,
  31. size_t index) {
  32. return (char*)r->data +
  33. r->dataSize * ((index + r->readIndex) % r->capacity);
  34. }
  35. void coreClearRingBuffer(CoreRingBuffer* r) {
  36. r->writeIndex = 0;
  37. r->readIndex = 0;
  38. r->length = 0;
  39. }
  40. void coreRingBufferRemove(CoreRingBuffer* r) {
  41. assert(r->length > 0);
  42. r->length--;
  43. r->readIndex = (r->readIndex + 1) % r->capacity;
  44. }
  45. size_t coreToStringRingBuffer(CoreRingBuffer* r, char* buffer, size_t n,
  46. CoreToString c) {
  47. size_t w = 0;
  48. coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, "["));
  49. size_t end = r->length;
  50. if(end > 0) {
  51. end--;
  52. for(size_t i = 0; i < end; i++) {
  53. coreStringAdd(&w, &buffer, &n,
  54. c(coreRingBufferGetVoidPointer(r, i), buffer, n));
  55. coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, ", "));
  56. }
  57. coreStringAdd(&w, &buffer, &n,
  58. c(coreRingBufferGetVoidPointer(r, end), buffer, n));
  59. }
  60. coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, "]"));
  61. return w;
  62. }
  63. void coreSwapRingBuffer(CoreRingBuffer* a, CoreRingBuffer* b) {
  64. CoreRingBuffer tmp = *a;
  65. *a = *b;
  66. *b = tmp;
  67. }