nexmon – Rev 1

Subversion Repositories:
Rev:
#include <isl_hmap_map_basic_set.h>

struct isl_map_basic_set_pair {
        isl_map         *key;
        isl_basic_set   *val;
};

__isl_give isl_hmap_map_basic_set *isl_hmap_map_basic_set_alloc(isl_ctx *ctx,
        int min_size)
{
        return (isl_hmap_map_basic_set *) isl_hash_table_alloc(ctx, min_size);
}

static int free_pair(void **entry, void *user)
{
        struct isl_map_basic_set_pair *pair = *entry;
        isl_map_free(pair->key);
        isl_basic_set_free(pair->val);
        free(pair);
        *entry = NULL;
        return 0;
}

void isl_hmap_map_basic_set_free(isl_ctx *ctx,
        __isl_take isl_hmap_map_basic_set *hmap)
{
        if (!hmap)
                return;
        isl_hash_table_foreach(ctx, &hmap->table, &free_pair, NULL);
        isl_hash_table_free(ctx, &hmap->table);
}

static int has_key(const void *entry, const void *key)
{
        const struct isl_map_basic_set_pair *pair = entry;
        isl_map *map = (isl_map *)key;

        return isl_map_plain_is_equal(pair->key, map);
}

int isl_hmap_map_basic_set_has(isl_ctx *ctx,
        __isl_keep isl_hmap_map_basic_set *hmap, __isl_keep isl_map *key)
{
        uint32_t hash;

        hash = isl_map_get_hash(key);
        return !!isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
}

__isl_give isl_basic_set *isl_hmap_map_basic_set_get(isl_ctx *ctx,
        __isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key)
{
        struct isl_hash_table_entry *entry;
        struct isl_map_basic_set_pair *pair;
        uint32_t hash;

        hash = isl_map_get_hash(key);
        entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
        isl_map_free(key);

        if (!entry)
                return NULL;

        pair = entry->data;

        return isl_basic_set_copy(pair->val);
}

int isl_hmap_map_basic_set_set(isl_ctx *ctx,
        __isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key,
        __isl_take isl_basic_set *val)
{
        struct isl_hash_table_entry *entry;
        struct isl_map_basic_set_pair *pair;
        uint32_t hash;

        hash = isl_map_get_hash(key);
        entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 1);

        if (!entry)
                return -1;

        if (entry->data) {
                pair = entry->data;
                isl_basic_set_free(pair->val);
                pair->val = val;
                isl_map_free(key);
                return 0;
        }

        pair = isl_alloc_type(ctx, struct isl_map_basic_set_pair);
        if (!pair) {
                isl_map_free(key);
                isl_basic_set_free(val);
                return -1;
        }

        entry->data = pair;
        pair->key = key;
        pair->val = val;
        return 0;
}