Blame src-nuklear/nuklear_table.c

Ivan Mahonin b53a5c
#include "nuklear.h"
Ivan Mahonin b53a5c
#include "nuklear_internal.h"
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
/* ===============================================================
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 *                              TABLE
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_LIB struct nk_table*
Ivan Mahonin b53a5c
nk_create_table(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_page_element *elem;
Ivan Mahonin b53a5c
    elem = nk_create_page_element(ctx);
Ivan Mahonin b53a5c
    if (!elem) return 0;
Ivan Mahonin b53a5c
    nk_zero_struct(*elem);
Ivan Mahonin b53a5c
    return &elem->data.tbl;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_free_table(struct nk_context *ctx, struct nk_table *tbl)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    union nk_page_data *pd = NK_CONTAINER_OF(tbl, union nk_page_data, tbl);
Ivan Mahonin b53a5c
    struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data);
Ivan Mahonin b53a5c
    nk_free_page_element(ctx, pe);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_push_table(struct nk_window *win, struct nk_table *tbl)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!win->tables) {
Ivan Mahonin b53a5c
        win->tables = tbl;
Ivan Mahonin b53a5c
        tbl->next = 0;
Ivan Mahonin b53a5c
        tbl->prev = 0;
Ivan Mahonin b53a5c
        tbl->size = 0;
Ivan Mahonin b53a5c
        win->table_count = 1;
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    win->tables->prev = tbl;
Ivan Mahonin b53a5c
    tbl->next = win->tables;
Ivan Mahonin b53a5c
    tbl->prev = 0;
Ivan Mahonin b53a5c
    tbl->size = 0;
Ivan Mahonin b53a5c
    win->tables = tbl;
Ivan Mahonin b53a5c
    win->table_count++;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_remove_table(struct nk_window *win, struct nk_table *tbl)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (win->tables == tbl)
Ivan Mahonin b53a5c
        win->tables = tbl->next;
Ivan Mahonin b53a5c
    if (tbl->next)
Ivan Mahonin b53a5c
        tbl->next->prev = tbl->prev;
Ivan Mahonin b53a5c
    if (tbl->prev)
Ivan Mahonin b53a5c
        tbl->prev->next = tbl->next;
Ivan Mahonin b53a5c
    tbl->next = 0;
Ivan Mahonin b53a5c
    tbl->prev = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB nk_uint*
Ivan Mahonin b53a5c
nk_add_value(struct nk_context *ctx, struct nk_window *win,
Ivan Mahonin b53a5c
            nk_hash name, nk_uint value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(win);
Ivan Mahonin b53a5c
    if (!win || !ctx) return 0;
Ivan Mahonin b53a5c
    if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) {
Ivan Mahonin b53a5c
        struct nk_table *tbl = nk_create_table(ctx);
Ivan Mahonin b53a5c
        NK_ASSERT(tbl);
Ivan Mahonin b53a5c
        if (!tbl) return 0;
Ivan Mahonin b53a5c
        nk_push_table(win, tbl);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    win->tables->seq = win->seq;
Ivan Mahonin b53a5c
    win->tables->keys[win->tables->size] = name;
Ivan Mahonin b53a5c
    win->tables->values[win->tables->size] = value;
Ivan Mahonin b53a5c
    return &win->tables->values[win->tables->size++];
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB nk_uint*
Ivan Mahonin b53a5c
nk_find_value(struct nk_window *win, nk_hash name)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_table *iter = win->tables;
Ivan Mahonin b53a5c
    while (iter) {
Ivan Mahonin b53a5c
        unsigned int i = 0;
Ivan Mahonin b53a5c
        unsigned int size = iter->size;
Ivan Mahonin b53a5c
        for (i = 0; i < size; ++i) {
Ivan Mahonin b53a5c
            if (iter->keys[i] == name) {
Ivan Mahonin b53a5c
                iter->seq = win->seq;
Ivan Mahonin b53a5c
                return &iter->values[i];
Ivan Mahonin b53a5c
            }
Ivan Mahonin b53a5c
        } size = NK_VALUE_PAGE_CAPACITY;
Ivan Mahonin b53a5c
        iter = iter->next;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c