#ifndef INCLUDED_C_POOLALLOCATOR_H #define INCLUDED_C_POOLALLOCATOR_H #ifndef INCLUDED_C_ALLOCATOR_H #include #endif /*INCLUDED_C_ALLOCATOR_H*/ #ifndef INCLUDED_C_POOL_H #include #endif /*INCLUDED_C_POOL_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ typedef struct { c_Pool_t* pool; }c_PoolAllocator_t; /* ------------------------------------------------------------------------------------------------------------------ */ /* */ C_STATIC_FORCE_INLINE void c_PoolAllocator_Init(c_PoolAllocator_t* self, c_Pool_t* pool) { self->pool = pool; } C_STATIC_FORCE_INLINE void c_PoolAllocator_Destroy(c_PoolAllocator_t* self) { c_Pool_Destroy(self->pool); } /* ------------------------------------------------------------------------------------------------------------------ */ /* */ C_STATIC_FORCE_INLINE C_ALLOCATOR_ALLOC_FN(c_PoolAllocator_Alloc) { C_UNUSED(nBytes); c_PoolAllocator_t* self = (c_PoolAllocator_t*)ud; if (!self || !self->pool) return NULL; return c_Pool_Alloc(self->pool); } C_STATIC_FORCE_INLINE C_ALLOCATOR_REALLOC_FN(c_PoolAllocator_Realloc) { c_PoolAllocator_t* self = (c_PoolAllocator_t*)ud; if (!self || !self->pool) return NULL; assert(nNewSize==self->pool->objSize); if (!ptr) { return c_Pool_Alloc(self->pool); } return ptr; } C_STATIC_FORCE_INLINE C_ALLOCATOR_FREE_FN(c_PoolAllocator_Free) { c_PoolAllocator_t* self = (c_PoolAllocator_t*)ud; if (!self || !self->pool) return; c_Pool_Free(self->pool, ptr); } C_STATIC_FORCE_INLINE C_ALLOCATOR_DTOR_FN(c_PoolAllocator_Dtor) { c_PoolAllocator_t* self = (c_PoolAllocator_t*)ud; if (!self || !self->pool) return; c_Pool_Destroy(self->pool); } /* ------------------------------------------------------------------------------------------------------------------ */ /* */ C_STATIC_FORCE_INLINE c_Allocator_t c_PoolAllocator_Build(c_PoolAllocator_t* self, c_Pool_t* pool) { c_Allocator_t allocator; self->pool = pool; allocator.ud = self; allocator.alloc = c_PoolAllocator_Alloc; allocator.realloc = c_PoolAllocator_Realloc; allocator.free = c_PoolAllocator_Free; allocator.calloc = 0; allocator.dtor = c_PoolAllocator_Dtor; return allocator; } #endif /*INCLUDED_C_POOLALLOCATOR_H*/