#ifndef CORE_HASHMAP_H #define CORE_HASHMAP_H #include "core/Types.h" struct CoreHashMap; typedef struct CoreHashMap CoreHashMap; typedef size_t (*CoreHasher)(const void* key, size_t n); typedef bool (*CoreEqual)(const void* keyA, const void* keyB, size_t n); typedef void* (*CoreSearchValue)(const CoreHashMap* m, const void* key); struct CoreHashMap { void* keys; void* values; size_t keySize; size_t valueSize; size_t capacity; size_t entries; CoreHasher hasher; CoreEqual equal; CoreSearchValue search; }; void coreInitHashMap(CoreHashMap* m, size_t keySize, size_t valueSize); void coreInitHashMapF(CoreHashMap* m, size_t keySize, size_t valueSize, CoreHasher hasher, CoreEqual 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); bool coreHashMapRemovePointer(CoreHashMap* m, const void* key); #define coreHashMapRemove(m, kType, key) \ coreHashMapRemovePointer(m, &(kType){key}) 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 { char* key; char* endKey; char* value; char* endValue; const CoreHashMap* map; CoreHashMapNode node; } CoreHashMapIterator; void coreInitHashMapIterator(CoreHashMapIterator* mi, CoreHashMap* m); bool coreHashMapHasNext(CoreHashMapIterator* mi); CoreHashMapNode* coreHashMapNext(CoreHashMapIterator* mi); #define coreHashMapKeyPointer(node, type) ((const type*)node->key) #define coreHashMapKey(node, type) (*coreHashMapKeyPointer(node, type)) #define coreHashMapValuePointer(node, type) ((type*)node->value) #define coreHashMapValue(node, type) (*coreHashMapValuePointer(node, type)) #endif