#include "core/RingBuffer.h" #include #include #include #include "core/Utility.h" void coreDestroyRingBuffer(CoreRingBuffer* r) { coreClearRingBuffer(r); r->dataSize = 0; r->capacity = 0; coreFree(r->data); r->data = nullptr; } static void* getPointer(CoreRingBuffer* r, size_t index) { return (char*)r->data + r->dataSize * index; } CoreRingBuffer* coreRingBufferAddPointer(CoreRingBuffer* r, const void* data) { if(r->length >= r->capacity) { return nullptr; } else if(r->data == nullptr) { r->data = coreAllocate(r->capacity * r->dataSize); } memcpy(getPointer(r, r->writeIndex), data, r->dataSize); r->writeIndex = (r->writeIndex + 1) % r->capacity; r->length++; return r; } void* coreRingBufferGetVoidPointer(CoreRingBuffer* r, size_t index) { return getPointer(r, (index + r->readIndex) % r->capacity); } const void* coreRingBufferGetVoidPointerC(const CoreRingBuffer* r, size_t index) { return (char*)r->data + r->dataSize * ((index + r->readIndex) % r->capacity); } void coreClearRingBuffer(CoreRingBuffer* r) { r->writeIndex = 0; r->readIndex = 0; r->length = 0; } void coreRingBufferRemove(CoreRingBuffer* r) { assert(r->length > 0); r->length--; r->readIndex = (r->readIndex + 1) % r->capacity; } size_t coreToStringRingBuffer(CoreRingBuffer* r, char* buffer, size_t n, CoreToString c) { size_t w = 0; coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, "[")); size_t end = r->length; if(end > 0) { end--; for(size_t i = 0; i < end; i++) { coreStringAdd(&w, &buffer, &n, c(coreRingBufferGetVoidPointer(r, i), buffer, n)); coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, ", ")); } coreStringAdd(&w, &buffer, &n, c(coreRingBufferGetVoidPointer(r, end), buffer, n)); } coreStringAddI(&w, &buffer, &n, snprintf(buffer, n, "]")); return w; } void coreSwapRingBuffer(CoreRingBuffer* a, CoreRingBuffer* b) { CoreRingBuffer tmp = *a; *a = *b; *b = tmp; }