#ifndef CORE_RINGBUFFER_H #define CORE_RINGBUFFER_H #include "core/Types.h" typedef struct { size_t writeIndex; size_t readIndex; size_t length; size_t capacity; size_t dataSize; void* data; } CoreRingBuffer; #define CORE_RING_BUFFER(capacity, dataSize) \ ((CoreRingBuffer){0, 0, 0, capacity, dataSize, nullptr}) void coreDestroyRingBuffer(CoreRingBuffer* r); CoreRingBuffer* coreRingBufferAddPointer(CoreRingBuffer* r, const void* data); #define coreRingBufferAdd(l, type, ...) \ coreRingBufferAddPointer(l, &(type){__VA_ARGS__}) void* coreRingBufferGetVoidPointer(CoreRingBuffer* r, size_t index); #define coreRingBufferGetPointer(r, index, type) \ ((type*)coreRingBufferGetVoidPointer(r, index)) #define coreRingBufferGet(r, index, type) \ (*coreRingBufferGetPointer(r, index, type)) const void* coreRingBufferGetVoidPointerC(const CoreRingBuffer* r, size_t index); #define coreRingBufferGetPointerC(r, index, type) \ ((const type*)coreRingBufferGetVoidPointerC(r, index)) #define coreRingBufferGetC(r, index, type) \ (*coreRingBufferGetPointerC(r, index, type)) void coreClearRingBuffer(CoreRingBuffer* r); void coreRingBufferRemove(CoreRingBuffer* r); size_t coreToStringRingBuffer(CoreRingBuffer* r, char* buffer, size_t n, CoreToString c); void coreSwapRingBuffer(CoreRingBuffer* a, CoreRingBuffer* b); #endif