Queue.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #define IMPORT_CORE
  2. #include "core/Queue.h"
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "core/ToString.h"
  7. #include "core/Utility.h"
  8. void initQueue(Queue* r, size_t capacity, size_t dataSize) {
  9. *r = ((Queue){0, 0, 0, capacity, dataSize, nullptr});
  10. }
  11. void destroyQueue(Queue* r) {
  12. cFree(r->data);
  13. *r = (Queue){0};
  14. }
  15. static void* getPointer(const Queue* r, size_t index) {
  16. return (char*)r->data + r->dataSize * index;
  17. }
  18. void pushQueueData(Queue* r, const void* data) {
  19. if(r->length >= r->capacity) {
  20. return;
  21. } else if(r->data == nullptr) {
  22. r->data = cAllocate(r->capacity * r->dataSize);
  23. }
  24. memcpy(getPointer(r, r->writeIndex), data, r->dataSize);
  25. r->writeIndex = (r->writeIndex + 1) % r->capacity;
  26. r->length++;
  27. }
  28. void* getQueueIndex(const Queue* r, size_t index) {
  29. return getPointer(r, (index + r->readIndex) % r->capacity);
  30. }
  31. void clearQueue(Queue* r) {
  32. r->writeIndex = 0;
  33. r->readIndex = 0;
  34. r->length = 0;
  35. }
  36. void popQueueData(Queue* r) {
  37. assert(r->length > 0);
  38. r->length--;
  39. r->readIndex = (r->readIndex + 1) % r->capacity;
  40. }