some buffer allocator progress
This commit is contained in:
+9
-7
@@ -41,15 +41,17 @@ typedef struct buffer_allocator {
|
|||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
} buffer_allocator_t;
|
} buffer_allocator_t;
|
||||||
|
|
||||||
#define buffer_allocator_stack_create(CAPACITY) \
|
#define buffer_allocator_create(CAPACITY) \
|
||||||
((buffer_allocator_t){ \
|
((buffer_allocator_t){ \
|
||||||
.size = 0, .capacity = CAPACITY, .data = (uint8_t[CAPACITY]){}})
|
.size = 0, .capacity = CAPACITY, .data = (uint8_t[CAPACITY]){}})
|
||||||
|
|
||||||
buffer_allocator_t *buffer_allocator_heap_create(allocator_t alloc, size_t capacity);
|
allocator_t buffer_allocator_interface(buffer_allocator_t *this);
|
||||||
void buffer_allocator_heap_destroy(allocator_t alloc, buffer_allocator_t *this);
|
void *buffer_allocator_alloc(buffer_allocator_t *this, size_t bytes);
|
||||||
// TODO: maybe use the macro magic to use the standard allcocator as the default
|
// Very simple resize. Does not free any memory, nor does it keep track of the
|
||||||
// one? or make users define a STANDARD_ALLOCATOR value? need to think about the
|
// previously allocated size of the old_pointer, just copies over as few bytes
|
||||||
// consequenses
|
// as it can with the information it has to a new allocation.
|
||||||
|
void *buffer_allocator_resize(buffer_allocator_t *this, void *old_ptr, size_t bytes);
|
||||||
|
void buffer_allocator_reset(buffer_allocator_t *this);
|
||||||
|
|
||||||
#ifdef ALLOCATOR_IMPLEMENTATION
|
#ifdef ALLOCATOR_IMPLEMENTATION
|
||||||
|
|
||||||
|
|||||||
+31
-7
@@ -1,22 +1,43 @@
|
|||||||
#include "allocator.h"
|
#include "allocator.h"
|
||||||
|
|
||||||
// TODO
|
void *buffer_allocator_alloc(buffer_allocator_t *this, size_t bytes) {
|
||||||
|
size_t new_size = this->size + bytes;
|
||||||
|
if (new_size > this->capacity) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
void *ptr = &this->data[this->size]
|
||||||
|
this->size = new_size;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *buffer_allocator_resize(buffer_allocator_t *this, void *old_ptr, size_t bytes) {
|
||||||
|
// TODO: check if the pointer is even in the buffer?
|
||||||
|
void *new_ptr = buffer_allocator_alloc(this, bytes);
|
||||||
|
if (new_ptr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
// TODO: copy over data
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer_allocator_reset(buffer_allocator_t *this) {
|
||||||
|
this->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void *buffer_alloc(void *this, size_t bytes, const char *file, int line) {
|
static void *buffer_alloc(void *this, size_t bytes, const char *file, int line) {
|
||||||
(void)this;
|
|
||||||
(void)bytes;
|
|
||||||
(void)file;
|
(void)file;
|
||||||
(void)line;
|
(void)line;
|
||||||
return 0;
|
return buffer_allocator_alloc((buffer_allocator_t *)this, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *buffer_resize(void *this, void *old_ptr, size_t bytes, const char *file, int line) {
|
static void *buffer_resize(void *this, void *old_ptr, size_t bytes, const char *file, int line) {
|
||||||
(void)this;
|
|
||||||
(void)old_ptr;
|
(void)old_ptr;
|
||||||
(void)bytes;
|
|
||||||
(void)file;
|
(void)file;
|
||||||
(void)line;
|
(void)line;
|
||||||
return 0;
|
|
||||||
|
// TODO: do the concrete implementation first!
|
||||||
|
void *new_ptr = buffer_allocator_alloc((buffer_allocator_t *)this, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void buffer_free(void *this, void *ptr, const char *file, int line) {
|
static void buffer_free(void *this, void *ptr, const char *file, int line) {
|
||||||
(void)this;
|
(void)this;
|
||||||
(void)ptr;
|
(void)ptr;
|
||||||
@@ -29,3 +50,6 @@ static const allocator_vtbl_t buffer_vtbl = {
|
|||||||
.resize = buffer_resize,
|
.resize = buffer_resize,
|
||||||
.free = buffer_free,
|
.free = buffer_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
allocator_t buffer_allocator_interface(buffer_allocator_t *this) {
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user