#include #include "buffer.h" #define NNWT_BUFFER_SIZE KB(1) #define NNWT_BUFFER_GROW ((size_t)al_grow_step) void nn_buffer_init(struct nn_buffer *buffer) { buffer->size = 0; buffer->alloc = 0; buffer->data = NULL; } void nn_buffer_ensure_space(struct nn_buffer *buffer, size_t size) { al_assert(size > 0); if (size > buffer->alloc) { buffer->alloc = (size <= NNWT_BUFFER_SIZE) ? NNWT_BUFFER_SIZE : (size + NNWT_BUFFER_GROW) & ~NNWT_BUFFER_GROW; buffer->data = (u8 *)al_realloc(buffer->data, buffer->alloc); } } void nn_buffer_shrink_to_size(struct nn_buffer *buffer) { buffer->alloc = 0; nn_buffer_ensure_space(buffer, buffer->size); } void nn_buffer_write(struct nn_buffer *buffer, void *data, size_t index, size_t size) { al_assert(buffer->size <= buffer->alloc); size_t reach = index + size; if (reach > buffer->size) { nn_buffer_ensure_space(buffer, reach); buffer->size = reach; } al_memcpy(&buffer->data[index], data, size); } void nn_buffer_append(struct nn_buffer *buffer, void *data, size_t size) { nn_buffer_write(buffer, data, buffer->size, size); } u8 *nn_buffer_get_ptr(struct nn_buffer *buffer, size_t index) { return buffer->data + index; } void nn_buffer_read(struct nn_buffer *buffer, void *ptr, size_t index, size_t size) { al_assert(index + size <= buffer->size); al_memcpy(ptr, &buffer->data[index], size); } void nn_buffer_free(struct nn_buffer *buffer) { if (buffer->alloc) al_free(buffer->data); }