#include ListAlloc* ListAlloc_Init(ListAlloc* this) { this->prev = NULL; this->next = NULL; return this; } void* ListAlloc_Alloc(ListAlloc* this, u32 size) { ListAlloc* ptr; ListAlloc* next; ptr = SystemArena_MallocDebug(size + sizeof(ListAlloc), "../listalloc.c", 40); if (!ptr) return NULL; next = this->next; if (next) next->next = ptr; ptr->prev = next; ptr->next = NULL; this->next = ptr; if (!this->prev) this->prev = ptr; return (u8*)ptr + sizeof(ListAlloc); } void ListAlloc_Free(ListAlloc* this, void* data) { ListAlloc* ptr; ptr = &((ListAlloc*)data)[-1]; if (ptr->prev) ptr->prev->next = ptr->next; if (ptr->next) ptr->next->prev = ptr->prev; if (this->prev == ptr) this->prev = ptr->next; if (this->next == ptr) this->next = ptr->prev; SystemArena_FreeDebug(ptr, "../listalloc.c", 72); } void ListAlloc_FreeAll(ListAlloc* this) { ListAlloc* iter; iter = this->prev; while (iter) { ListAlloc_Free(this, (u8*)iter + sizeof(ListAlloc)); iter = this->prev; } }