12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #ifndef CORE_HASHMAP_H
- #define CORE_HASHMAP_H
- #include "core/Types.h"
- typedef size_t (*CoreHasher)(const void* key, size_t n);
- typedef bool (*CoreEqual)(const void* keyA, const void* keyB, size_t n);
- typedef struct {
- void* keys;
- void* values;
- size_t keySize;
- size_t valueSize;
- size_t capacity;
- size_t entries;
- CoreHasher hasher;
- CoreEqual equal;
- } CoreHashMap;
- #define CORE_HASH_MAP(keySize, valueSize, hasher, equal) \
- ((CoreHashMap){nullptr, nullptr, keySize, valueSize, 0, 0, hasher, equal})
- void coreDestroyHashMap(CoreHashMap* m);
- void coreRehashHashMap(CoreHashMap* m, size_t minCapacity);
- void* coreHashMapPutPointer(CoreHashMap* m, const void* key, const void* value);
- #define coreHashMapPut(m, kType, key, vType, ...) \
- coreHashMapPutPointer(m, &(kType){key}, &(vType){__VA_ARGS__})
- void* coreHashMapSearchPointer(CoreHashMap* m, const void* key);
- #define coreHashMapSearch(m, kType, key, vType) \
- ((vType*)coreHashMapSearchPointer(m, &(kType){key}))
- const void* coreHashMapSearchPointerC(const CoreHashMap* m, const void* key);
- #define coreHashMapSearchC(m, kType, key, vType) \
- ((const vType*)coreHashMapSearchPointerC(m, &(kType){key}))
- bool coreHashMapContainsPointer(const CoreHashMap* m, const void* key);
- #define coreHashMapContains(m, kType, key) \
- coreHashMapContainsPointer(m, &(kType){key})
- void coreClearHashMap(CoreHashMap* m);
- size_t coreToStringHashMap(const CoreHashMap* m, char* buffer, size_t n,
- CoreToString keyString, CoreToString valueString);
- void coreSwapHashMap(CoreHashMap* a, CoreHashMap* b);
- size_t coreHashString(const void* key, size_t n);
- size_t coreHash(const void* key, size_t n);
- bool coreEqual(const void* keyA, const void* keyB, size_t n);
- typedef struct {
- const void* key;
- void* value;
- } CoreHashMapNode;
- typedef struct {
- const CoreHashMap* map;
- size_t index;
- CoreHashMapNode node;
- } CoreHashMapIterator;
- #define CORE_HASH_MAP_ITERATOR(map) \
- ((CoreHashMapIterator){map, (size_t)-1, {0}})
- CoreHashMapNode* coreHashMapNext(CoreHashMapIterator* mi);
- #define coreHashMapKeyPointer(node, type) ((const type*)node->key)
- #define coreHashMapKey(node, type) (*coreHashMapKeyPointer(node, type))
- #define coreHashMapValuePointer(node, type) ((const type*)node->value)
- #define coreHashMapValue(node, type) (*coreHashMapValuePointer(node, type))
- #endif
|