From 83cd586ea304d6f6aa190c65ee796baaba1941a7 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 23 Sep 2021 12:35:04 -0700 Subject: feat: improved interface of map macro --- include/libn/macro/map.h | 64 ++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'include/libn/macro/map.h') diff --git a/include/libn/macro/map.h b/include/libn/macro/map.h index 0743c1b..7c2f7ae 100644 --- a/include/libn/macro/map.h +++ b/include/libn/macro/map.h @@ -35,11 +35,11 @@ static const double __ac_HASH_UPPER = 0.77; map = alloc((h), 1, sizeof(*map)); \ return map -#define MAP_FREE(map, free, h) \ - free(h, map->keys); \ - free(h, map->flags); \ - free(h, map->vals); \ - free(h, map); +#define MAP_FREE(map, mem, heap) \ + mem.free(heap, map->keys); \ + mem.free(heap, map->flags); \ + mem.free(heap, map->vals); \ + mem.free(heap, map); #define MAP_RESET(map) \ if (map && map->flags) { \ @@ -72,7 +72,7 @@ static const double __ac_HASH_UPPER = 0.77; } else \ i = 0; -#define MAP_GROW(map, key_t, val_t, new_n_buckets, hashfunc, alloc, free, h) \ +#define MAP_GROW(map, key_t, val_t, new_n_buckets, hashfunc, mem, heap) \ int32 *new_flags = nil; \ int32 j = 1; \ { \ @@ -82,25 +82,25 @@ static const double __ac_HASH_UPPER = 0.77; if (map->size >= (int32)(new_n_buckets * __ac_HASH_UPPER + 0.5)) \ j = 0; \ else { \ - new_flags = alloc(h, __ac_fsize(new_n_buckets), sizeof(int32)); \ + new_flags = mem.alloc(heap, __ac_fsize(new_n_buckets), sizeof(int32)); \ if (!new_flags) return -1; \ memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(int32)); \ if (map->n_buckets < new_n_buckets) { /* expand */ \ - key_t *new_keys = alloc(h, new_n_buckets, sizeof(key_t)); \ + key_t *new_keys = mem.alloc(heap, new_n_buckets, sizeof(key_t)); \ if (!new_keys) { \ - free(h, new_flags); \ + mem.free(heap, new_flags); \ return -1; \ } \ memcpy(new_keys, map->keys, sizeof(key_t) * map->n_buckets); \ - free(h, map->keys); \ + mem.free(heap, map->keys); \ map->keys = new_keys; \ - val_t *new_vals = alloc(h, new_n_buckets, sizeof(val_t)); \ + val_t *new_vals = mem.alloc(heap, new_n_buckets, sizeof(val_t)); \ if (!new_vals) { \ - free(h, new_flags); \ + mem.free(heap, new_flags); \ return -1; \ } \ memcpy(new_vals, map->vals, sizeof(val_t) * map->n_buckets); \ - free(h, map->vals); \ + mem.free(heap, map->vals); \ map->vals = new_vals; \ } \ } \ @@ -142,17 +142,17 @@ static const double __ac_HASH_UPPER = 0.77; } \ } \ if (map->n_buckets > new_n_buckets) { /* shrink the hash table */ \ - key_t *new_keys = alloc(h, new_n_buckets, sizeof(key_t)); \ + key_t *new_keys = mem.alloc(heap, new_n_buckets, sizeof(key_t)); \ memcpy(new_keys, map->keys, sizeof(key_t) * map->n_buckets); \ - free(h, map->keys); \ + mem.free(heap, map->keys); \ map->keys = new_keys; \ \ - val_t *new_vals = alloc(h, new_n_buckets, sizeof(val_t)); \ + val_t *new_vals = mem.alloc(heap, new_n_buckets, sizeof(val_t)); \ memcpy(new_vals, map->vals, sizeof(val_t) * map->n_buckets); \ - free(h, map->vals); \ + mem.free(heap, map->vals); \ map->vals = new_vals; \ } \ - free(h, map->flags); /* free the working space */ \ + mem.free(heap, map->flags); /* free the working space */ \ map->flags = new_flags; \ map->n_buckets = new_n_buckets; \ map->n_occupied = map->size; \ @@ -235,10 +235,10 @@ static const double __ac_HASH_UPPER = 0.77; set = alloc((h), 1, sizeof(*set)); \ return set -#define SET_FREE(set, free, h) \ - free(h, set->keys); \ - free(h, set->flags); \ - free(h, set) +#define SET_FREE(set, mem, heap) \ + mem.free(heap, set->keys); \ + mem.free(heap, set->flags); \ + mem.free(heap, set) #define SET_RESET(set) \ if (set && set->flags) { \ @@ -271,7 +271,7 @@ static const double __ac_HASH_UPPER = 0.77; } else \ i = 0; -#define SET_GROW(set, key_t, new_n_buckets, hashfunc, alloc, free, h) \ +#define SET_GROW(set, key_t, new_n_buckets, hashfunc, mem, heap) \ int32 *new_flags = nil; \ int32 j = 1; \ { \ @@ -281,17 +281,17 @@ static const double __ac_HASH_UPPER = 0.77; if (set->size >= (int32)(new_n_buckets * __ac_HASH_UPPER + 0.5)) \ j = 0; \ else { \ - new_flags = alloc(h, __ac_fsize(new_n_buckets), sizeof(int32)); \ + new_flags = mem.alloc(heap, __ac_fsize(new_n_buckets), sizeof(int32)); \ if (!new_flags) return -1; \ memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(int32)); \ if (set->n_buckets < new_n_buckets) { /* expand */ \ - key_t *new_keys = alloc(h, new_n_buckets, sizeof(key_t)); \ + key_t *new_keys = mem.alloc(heap, new_n_buckets, sizeof(key_t)); \ if (!new_keys) { \ - free(h, new_flags); \ + mem.free(heap, new_flags); \ return -1; \ } \ memcpy(new_keys, set->keys, sizeof(key_t) * set->n_buckets); \ - free(h, set->keys); \ + mem.free(heap, set->keys); \ set->keys = new_keys; \ } \ } \ @@ -325,12 +325,12 @@ static const double __ac_HASH_UPPER = 0.77; } \ } \ if (set->n_buckets > new_n_buckets) { /* shrink the hash table */ \ - key_t *new_keys = alloc(h, new_n_buckets, sizeof(key_t)); \ + key_t *new_keys = mem.alloc(heap, new_n_buckets, sizeof(key_t)); \ memcpy(new_keys, set->keys, sizeof(key_t) * set->n_buckets); \ - free(h, set->keys); \ + mem.free(heap, set->keys); \ set->keys = new_keys; \ } \ - free(h, set->flags); /* free the working space */ \ + mem.free(heap, set->flags); /* free the working space */ \ set->flags = new_flags; \ set->n_buckets = new_n_buckets; \ set->n_occupied = set->size; \ @@ -391,10 +391,10 @@ static const double __ac_HASH_UPPER = 0.77; ++set->size; \ } else \ *err = 0; \ - return x + return x #define SET_DEL(set, x) \ if (x != set->n_buckets && !__ac_iseither(set->flags, x)) { \ __ac_set_isdel_true(set->flags, x); \ --set->size; \ - } + } -- cgit v1.2.1