|
|
b53a5c |
#include "nuklear.h"
|
|
|
b53a5c |
#include "nuklear_internal.h"
|
|
|
b53a5c |
|
|
|
b53a5c |
/* ===============================================================
|
|
|
b53a5c |
*
|
|
|
b53a5c |
* POOL
|
|
|
b53a5c |
*
|
|
|
b53a5c |
* ===============================================================*/
|
|
|
b53a5c |
NK_LIB void
|
|
|
b53a5c |
nk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc,
|
|
|
b53a5c |
unsigned int capacity)
|
|
|
b53a5c |
{
|
|
|
b53a5c |
NK_ASSERT(capacity >= 1);
|
|
|
b53a5c |
nk_zero(pool, sizeof(*pool));
|
|
|
b53a5c |
pool->alloc = *alloc;
|
|
|
b53a5c |
pool->capacity = capacity;
|
|
|
b53a5c |
pool->type = NK_BUFFER_DYNAMIC;
|
|
|
b53a5c |
pool->pages = 0;
|
|
|
b53a5c |
}
|
|
|
b53a5c |
NK_LIB void
|
|
|
b53a5c |
nk_pool_free(struct nk_pool *pool)
|
|
|
b53a5c |
{
|
|
|
b53a5c |
struct nk_page *iter;
|
|
|
b53a5c |
if (!pool) return;
|
|
|
b53a5c |
iter = pool->pages;
|
|
|
b53a5c |
if (pool->type == NK_BUFFER_FIXED) return;
|
|
|
b53a5c |
while (iter) {
|
|
|
b53a5c |
struct nk_page *next = iter->next;
|
|
|
b53a5c |
pool->alloc.free(pool->alloc.userdata, iter);
|
|
|
b53a5c |
iter = next;
|
|
|
b53a5c |
}
|
|
|
b53a5c |
}
|
|
|
b53a5c |
NK_LIB void
|
|
|
b53a5c |
nk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size)
|
|
|
b53a5c |
{
|
|
|
b53a5c |
nk_zero(pool, sizeof(*pool));
|
|
|
b53a5c |
NK_ASSERT(size >= sizeof(struct nk_page));
|
|
|
b53a5c |
if (size < sizeof(struct nk_page)) return;
|
|
|
b53a5c |
/* first nk_page_element is embedded in nk_page, additional elements follow in adjacent space */
|
|
|
b53a5c |
pool->capacity = (unsigned)(1 + (size - sizeof(struct nk_page)) / sizeof(struct nk_page_element));
|
|
|
b53a5c |
pool->pages = (struct nk_page*)memory;
|
|
|
b53a5c |
pool->type = NK_BUFFER_FIXED;
|
|
|
b53a5c |
pool->size = size;
|
|
|
b53a5c |
}
|
|
|
b53a5c |
NK_LIB struct nk_page_element*
|
|
|
b53a5c |
nk_pool_alloc(struct nk_pool *pool)
|
|
|
b53a5c |
{
|
|
|
b53a5c |
if (!pool->pages || pool->pages->size >= pool->capacity) {
|
|
|
b53a5c |
/* allocate new page */
|
|
|
b53a5c |
struct nk_page *page;
|
|
|
b53a5c |
if (pool->type == NK_BUFFER_FIXED) {
|
|
|
b53a5c |
NK_ASSERT(pool->pages);
|
|
|
b53a5c |
if (!pool->pages) return 0;
|
|
|
b53a5c |
NK_ASSERT(pool->pages->size < pool->capacity);
|
|
|
b53a5c |
return 0;
|
|
|
b53a5c |
} else {
|
|
|
b53a5c |
nk_size size = sizeof(struct nk_page);
|
|
|
b53a5c |
size += (pool->capacity - 1) * sizeof(struct nk_page_element);
|
|
|
b53a5c |
page = (struct nk_page*)pool->alloc.alloc(pool->alloc.userdata,0, size);
|
|
|
b53a5c |
page->next = pool->pages;
|
|
|
b53a5c |
pool->pages = page;
|
|
|
b53a5c |
page->size = 0;
|
|
|
b53a5c |
}
|
|
|
b53a5c |
} return &pool->pages->win[pool->pages->size++];
|
|
|
b53a5c |
}
|
|
|
b53a5c |
|