|
@@ -45,6 +45,28 @@ static size_t searchSlot(CoreHashMap* m, const void* key) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void* searchValueU32(const CoreHashMap* m, const void* rawKey) {
|
|
|
+ u32 key = *(const u32*)rawKey;
|
|
|
+ if(m->capacity != 0) {
|
|
|
+ if(key == 0) {
|
|
|
+ size_t i = m->capacity - 1;
|
|
|
+ return ((u32*)m->keys)[i] == 0 ? getValue(m, i) : nullptr;
|
|
|
+ }
|
|
|
+ size_t baseHash = ((size_t)key) * 514685581u;
|
|
|
+ size_t end = m->capacity - 2;
|
|
|
+ for(size_t i = 0; i <= end; i++) {
|
|
|
+ size_t hash = (baseHash + i) & end;
|
|
|
+ u32 keyEntry = *(u32*)getKey(m, hash);
|
|
|
+ if(keyEntry == key) {
|
|
|
+ return getValue(m, hash);
|
|
|
+ } else if(keyEntry == 0) {
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nullptr;
|
|
|
+}
|
|
|
+
|
|
|
static void* searchValue(const CoreHashMap* m, const void* key) {
|
|
|
if(m->capacity != 0) {
|
|
|
if(isInvalidKey(m, key)) {
|
|
@@ -74,6 +96,18 @@ static size_t roundUp2(size_t n) {
|
|
|
return w;
|
|
|
}
|
|
|
|
|
|
+CoreHashMap coreInitHashMap(size_t keySize, size_t valueSize, CoreHasher hasher,
|
|
|
+ CoreEqual equal) {
|
|
|
+ CoreSearchValue search = searchValue;
|
|
|
+ if(hasher == coreHash && equal == coreEqual) {
|
|
|
+ switch(keySize) {
|
|
|
+ case sizeof(u32): search = searchValueU32; break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (CoreHashMap){nullptr, nullptr, keySize, valueSize, 0,
|
|
|
+ 0, hasher, equal, search};
|
|
|
+}
|
|
|
+
|
|
|
void coreDestroyHashMap(CoreHashMap* m) {
|
|
|
coreFree(m->keys);
|
|
|
coreFree(m->values);
|
|
@@ -88,7 +122,7 @@ void coreRehashHashMap(CoreHashMap* m, size_t minCapacity) {
|
|
|
CoreHashMap map =
|
|
|
CORE_HASH_MAP(m->keySize, m->valueSize, m->hasher, m->equal);
|
|
|
size_t keyBytes = l * m->keySize;
|
|
|
- map.keys = coreAllocate(l * m->keySize);
|
|
|
+ map.keys = coreAllocate(keyBytes);
|
|
|
memset(map.keys, 0, keyBytes);
|
|
|
memset(getKey(&map, l - 1), 1, m->keySize);
|
|
|
map.values = coreAllocate(l * m->valueSize);
|
|
@@ -129,11 +163,11 @@ void* coreHashMapPutPointer(CoreHashMap* m, const void* key,
|
|
|
}
|
|
|
|
|
|
void* coreHashMapSearchPointer(CoreHashMap* m, const void* key) {
|
|
|
- return searchValue(m, key);
|
|
|
+ return m->search(m, key);
|
|
|
}
|
|
|
|
|
|
const void* coreHashMapSearchPointerC(const CoreHashMap* m, const void* key) {
|
|
|
- return searchValue(m, key);
|
|
|
+ return m->search(m, key);
|
|
|
}
|
|
|
|
|
|
bool coreHashMapContainsPointer(const CoreHashMap* m, const void* key) {
|