Blame src-nuklear/nuklear_pool.c

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