feature (hashmaps): implemented hashmaps (NOT TESTED YET)
This commit is contained in:
parent
cd5737dba7
commit
713ffbc089
|
@ -0,0 +1,28 @@
|
||||||
|
// This file is part of noxos and licensed under the MIT open source license
|
||||||
|
|
||||||
|
#ifndef NOXOS_HASHMAP_H
|
||||||
|
#define NOXOS_HASHMAP_H
|
||||||
|
|
||||||
|
#include <utils/stdtypes.h>
|
||||||
|
|
||||||
|
typedef struct hashmap_entry_T hashmap_entry_T;
|
||||||
|
struct hashmap_entry_T {
|
||||||
|
bool in_use;
|
||||||
|
uint64_t key;
|
||||||
|
void* value;
|
||||||
|
hashmap_entry_T* prev;
|
||||||
|
hashmap_entry_T* next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t size;
|
||||||
|
hashmap_entry_T* entries;
|
||||||
|
} hashmap_T;
|
||||||
|
|
||||||
|
hashmap_T hashmap_create (uint64_t size);
|
||||||
|
void hashmap_destruct (hashmap_T* hashmap);
|
||||||
|
void hashmap_insert (hashmap_T* hashmap, uint64_t key, void* value);
|
||||||
|
void hashmap_delete (hashmap_T* hashmap, uint64_t key);
|
||||||
|
void* hashmap_lookup (hashmap_T* hashmap, uint64_t key);
|
||||||
|
|
||||||
|
#endif //NOXOS_HASHMAP_H
|
|
@ -0,0 +1,84 @@
|
||||||
|
// This file is part of noxos and licensed under the MIT open source license
|
||||||
|
|
||||||
|
#include <utils/hashmap.h>
|
||||||
|
#include <utils/memory.h>
|
||||||
|
|
||||||
|
hashmap_T hashmap_create(uint64_t size) {
|
||||||
|
hashmap_T hashmap;
|
||||||
|
|
||||||
|
hashmap.size = size;
|
||||||
|
hashmap.entries = memory_allocate(size * sizeof(hashmap_entry_T));
|
||||||
|
memory_set(hashmap.entries, 0, size * sizeof(hashmap_entry_T));
|
||||||
|
|
||||||
|
return hashmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hashmap_destruct (hashmap_T* hashmap) {
|
||||||
|
for (uint64_t i = 0; i < hashmap->size; i++) {
|
||||||
|
hashmap_entry_T* entry = hashmap->entries[i].next;
|
||||||
|
|
||||||
|
while (entry != NULL) {
|
||||||
|
hashmap_entry_T* next = entry->next;
|
||||||
|
memory_free(entry);
|
||||||
|
entry = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory_free(hashmap->entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hashmap_insert(hashmap_T* hashmap, uint64_t key, void* value) {
|
||||||
|
uint64_t index = key % hashmap->size;
|
||||||
|
|
||||||
|
if (!hashmap->entries[index].in_use) {
|
||||||
|
hashmap->entries[index].key = key;
|
||||||
|
hashmap->entries[index].value = value;
|
||||||
|
hashmap->entries[index].in_use = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashmap_entry_T* entry = &hashmap->entries[index];
|
||||||
|
while (entry->next != NULL) entry = entry->next;
|
||||||
|
|
||||||
|
entry->next = memory_allocate(sizeof(hashmap_entry_T));
|
||||||
|
entry->next->prev = entry;
|
||||||
|
entry->next->key = key;
|
||||||
|
entry->next->value = value;
|
||||||
|
entry->next->in_use = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hashmap_delete(hashmap_T* hashmap, uint64_t key) {
|
||||||
|
uint64_t index = key % hashmap->size;
|
||||||
|
|
||||||
|
hashmap_entry_T* entry = &hashmap->entries[index];
|
||||||
|
while (entry->key != key) {
|
||||||
|
if (entry->next == NULL) return;
|
||||||
|
entry = entry->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry->prev != NULL) {
|
||||||
|
entry->prev->next = entry->next;
|
||||||
|
|
||||||
|
if (entry->next != NULL) entry->next->prev = entry->prev;
|
||||||
|
|
||||||
|
memory_free(entry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->key = 0;
|
||||||
|
entry->value = NULL;
|
||||||
|
entry->in_use = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* hashmap_lookup(hashmap_T* hashmap, uint64_t key) {
|
||||||
|
uint64_t index = key % hashmap->size;
|
||||||
|
|
||||||
|
hashmap_entry_T* entry = &hashmap->entries[index];
|
||||||
|
while (entry->key != key) {
|
||||||
|
if (entry->next == NULL) return NULL;
|
||||||
|
entry = entry->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!entry->in_use) return NULL;
|
||||||
|
|
||||||
|
return entry->value;
|
||||||
|
}
|
Loading…
Reference in New Issue