diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-11-23 12:03:26 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-11-23 12:03:26 +0000 |
| commit | ef8563a818812493c33e34a259189757d0e7612b (patch) | |
| tree | 0f83027c0d8238d8132a53b8ccfdb3b5055e2b8b /src/common.cpp | |
| parent | aa2bcb166f2f0356dceb4e9424223ccbd483faf0 (diff) | |
Remove auto
Diffstat (limited to 'src/common.cpp')
| -rw-r--r-- | src/common.cpp | 303 |
1 files changed, 0 insertions, 303 deletions
diff --git a/src/common.cpp b/src/common.cpp index 93f5e6d00..db946d5f3 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -246,306 +246,3 @@ i16 f32_to_f16(f32 value) { #define MAP_FUNC map_isize_ #define MAP_NAME MapIsize #include "map.c" - - -#if 0 -#ifndef MAP_FIND_RESULT -#define MAP_FIND_RESULT -typedef struct MapFindResult { - isize hash_index; - isize entry_prev; - isize entry_index; -} MapFindResult; -#endif - - -template <typename T> -struct MapEntry { - HashKey key; - isize next; - T value; -}; - -template <typename T> -struct Map { - Array(isize) hashes; - Array(MapEntry<T>) entries; -}; - -template <typename T> void map_init (Map<T> *h, gbAllocator a); -template <typename T> void map_init_with_reserve(Map<T> *h, gbAllocator a, isize capacity); -template <typename T> void map_destroy (Map<T> *h); -template <typename T> T * map_get (Map<T> *h, HashKey key); -template <typename T> void map_set (Map<T> *h, HashKey key, T value); -template <typename T> void map_remove (Map<T> *h, HashKey key); -template <typename T> void map_clear (Map<T> *h); -template <typename T> void map_grow (Map<T> *h); -template <typename T> void map_rehash (Map<T> *h, isize new_count); - -template <typename T> MapEntry<T> *multi_map_find_first(Map<T> *h, HashKey key); -template <typename T> MapEntry<T> *multi_map_find_next (Map<T> *h, MapEntry<T> *e); - -template <typename T> isize multi_map_count (Map<T> *h, HashKey key); -template <typename T> void multi_map_get_all (Map<T> *h, HashKey key, T *items); -template <typename T> void multi_map_insert (Map<T> *h, HashKey key, T value); -template <typename T> void multi_map_remove (Map<T> *h, HashKey key, MapEntry<T> *e); -template <typename T> void multi_map_remove_all(Map<T> *h, HashKey key); - - - - -template <typename T> -gb_inline void map_init(Map<T> *h, gbAllocator a) { - array_init(&h->hashes, a); - array_init(&h->entries, a); -} - -template <typename T> -gb_inline void map_init_with_reserve(Map<T> *h, gbAllocator a, isize capacity) { - array_init_reserve(&h->hashes, a, capacity); - array_init_reserve(&h->entries, a, capacity); -} - -template <typename T> -gb_inline void map_destroy(Map<T> *h) { - array_free(&h->entries); - array_free(&h->hashes); -} - -template <typename T> -gb_internal isize map__add_entry(Map<T> *h, HashKey key) { - MapEntry<T> e = {}; - e.key = key; - e.next = -1; - array_add(&h->entries, e); - return h->entries.count-1; -} - -template <typename T> -gb_internal MapFindResult map__find(Map<T> *h, HashKey key) { - MapFindResult fr = {-1, -1, -1}; - if (h->hashes.count > 0) { - fr.hash_index = key.key % h->hashes.count; - fr.entry_index = h->hashes.e[fr.hash_index]; - while (fr.entry_index >= 0) { - if (hash_key_equal(h->entries.e[fr.entry_index].key, key)) { - return fr; - } - fr.entry_prev = fr.entry_index; - fr.entry_index = h->entries.e[fr.entry_index].next; - } - } - return fr; -} - -template <typename T> -gb_internal MapFindResult map__find(Map<T> *h, MapEntry<T> *e) { - MapFindResult fr = {-1, -1, -1}; - if (h->hashes.count > 0) { - fr.hash_index = e->key.key % h->hashes.count; - fr.entry_index = h->hashes.e[fr.hash_index]; - while (fr.entry_index >= 0) { - if (&h->entries.e[fr.entry_index] == e) { - return fr; - } - fr.entry_prev = fr.entry_index; - fr.entry_index = h->entries.e[fr.entry_index].next; - } - } - return fr; -} - - -template <typename T> -gb_internal bool map__full(Map<T> *h) { - return 0.75f * h->hashes.count <= h->entries.count; -} - -template <typename T> -gb_inline void map_grow(Map<T> *h) { - isize new_count = GB_ARRAY_GROW_FORMULA(h->entries.count); - map_rehash(h, new_count); -} - -template <typename T> -void map_rehash(Map<T> *h, isize new_count) { - isize i, j; - Map<T> nh = {0}; - map_init(&nh, h->hashes.allocator); - array_resize(&nh.hashes, new_count); - array_reserve(&nh.entries, h->entries.count); - for (i = 0; i < new_count; i++) { - nh.hashes.e[i] = -1; - } - for (i = 0; i < h->entries.count; i++) { - MapEntry<T> *e = &h->entries.e[i]; - MapFindResult fr; - if (nh.hashes.count == 0) { - map_grow(&nh); - } - fr = map__find(&nh, e->key); - j = map__add_entry(&nh, e->key); - if (fr.entry_prev < 0) { - nh.hashes.e[fr.hash_index] = j; - } else { - nh.entries.e[fr.entry_prev].next = j; - } - nh.entries.e[j].next = fr.entry_index; - nh.entries.e[j].value = e->value; - if (map__full(&nh)) { - map_grow(&nh); - } - } - map_destroy(h); - *h = nh; -} - -template <typename T> -gb_inline T *map_get(Map<T> *h, HashKey key) { - isize index = map__find(h, key).entry_index; - if (index >= 0) - return &h->entries.e[index].value; - return NULL; -} - -template <typename T> -void map_set(Map<T> *h, HashKey key, T value) { - isize index; - MapFindResult fr; - if (h->hashes.count == 0) - map_grow(h); - fr = map__find(h, key); - if (fr.entry_index >= 0) { - index = fr.entry_index; - } else { - index = map__add_entry(h, key); - if (fr.entry_prev >= 0) { - h->entries.e[fr.entry_prev].next = index; - } else { - h->hashes.e[fr.hash_index] = index; - } - } - h->entries.e[index].value = value; - - if (map__full(h)) - map_grow(h); -} - - - -template <typename T> -void map__erase(Map<T> *h, MapFindResult fr) { - if (fr.entry_prev < 0) { - h->hashes.e[fr.hash_index] = h->entries.e[fr.entry_index].next; - } else { - h->entries.e[fr.entry_prev].next = h->entries.e[fr.entry_index].next; - } - if (fr.entry_index == h->entries.count-1) { - array_pop(&h->entries); - return; - } - h->entries.e[fr.entry_index] = h->entries.e[h->entries.count-1]; - MapFindResult last = map__find(h, h->entries.e[fr.entry_index].key); - if (last.entry_prev >= 0) { - h->entries.e[last.entry_prev].next = fr.entry_index; - } else { - h->hashes.e[last.hash_index] = fr.entry_index; - } -} - -template <typename T> -void map_remove(Map<T> *h, HashKey key) { - MapFindResult fr = map__find(h, key); - if (fr.entry_index >= 0) { - map__erase(h, fr); - } -} - -template <typename T> -gb_inline void map_clear(Map<T> *h) { - gb_array_clear(h->hashes); - gb_array_clear(h->entries); -} - - - -template <typename T> -MapEntry<T> *multi_map_find_first(Map<T> *h, HashKey key) { - isize i = map__find(h, key).entry_index; - if (i < 0) { - return NULL; - } - return &h->entries.e[i]; -} - -template <typename T> -MapEntry<T> *multi_map_find_next(Map<T> *h, MapEntry<T> *e) { - isize i = e->next; - while (i >= 0) { - if (hash_key_equal(h->entries.e[i].key, e->key)) { - return &h->entries.e[i]; - } - i = h->entries.e[i].next; - } - return NULL; -} - -template <typename T> -isize multi_map_count(Map<T> *h, HashKey key) { - isize count = 0; - auto *e = multi_map_find_first(h, key); - while (e != NULL) { - count++; - e = multi_map_find_next(h, e); - } - return count; -} - -template <typename T> -void multi_map_get_all(Map<T> *h, HashKey key, T *items) { - isize i = 0; - auto *e = multi_map_find_first(h, key); - while (e != NULL) { - items[i++] = e->value; - e = multi_map_find_next(h, e); - } -} - -template <typename T> -void multi_map_insert(Map<T> *h, HashKey key, T value) { - if (h->hashes.count == 0) { - map_grow(h); - } - MapFindResult fr = map__find(h, key); - isize i = map__add_entry(h, key); - if (fr.entry_prev < 0) { - h->hashes.e[fr.hash_index] = i; - } else { - h->entries.e[fr.entry_prev].next = i; - } - h->entries.e[i].next = fr.entry_index; - h->entries.e[i].value = value; - if (map__full(h)) { - map_grow(h); - } -} - -template <typename T> -void multi_map_remove(Map<T> *h, HashKey key, MapEntry<T> *e) { - MapFindResult fr = map__find(h, e); - if (fr.entry_index >= 0) { - map__erase(h, fr); - } -} - -template <typename T> -void multi_map_remove_all(Map<T> *h, HashKey key) { - while (map_get(h, key) != NULL) { - map_remove(h, key); - } -} - - - - -#endif |