From b79ae4ec95cf2ac14e0acea09640105d5604c0e8 Mon Sep 17 00:00:00 2001 From: Xnoe Date: Sun, 21 Nov 2021 16:40:16 +0000 Subject: [PATCH] Updated Hashtable to use xnoe::Maybe, fixed many bugs within hashtable, updated hash --- src/kernel/datatypes/hash.cpp | 5 +++++ src/kernel/datatypes/hash.h | 2 ++ src/kernel/datatypes/hashtable.h | 32 ++++++++++++++++++-------------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/kernel/datatypes/hash.cpp b/src/kernel/datatypes/hash.cpp index 777df6e..d4d6c78 100644 --- a/src/kernel/datatypes/hash.cpp +++ b/src/kernel/datatypes/hash.cpp @@ -8,4 +8,9 @@ namespace xnoe { uint32_t hash(void* t) { return (uint32_t) t; } + + template<> + uint32_t hash(uint32_t t) { + return t; + } } \ No newline at end of file diff --git a/src/kernel/datatypes/hash.h b/src/kernel/datatypes/hash.h index e9c4914..c29cc2c 100644 --- a/src/kernel/datatypes/hash.h +++ b/src/kernel/datatypes/hash.h @@ -9,6 +9,8 @@ namespace xnoe { template<> uint32_t hash(void* t); + template<> + uint32_t hash(uint32_t t); } #endif \ No newline at end of file diff --git a/src/kernel/datatypes/hashtable.h b/src/kernel/datatypes/hashtable.h index a466abb..c5c84cc 100644 --- a/src/kernel/datatypes/hashtable.h +++ b/src/kernel/datatypes/hashtable.h @@ -4,6 +4,7 @@ #include "hash.h" #include "linkedlist.h" #include "../memory.h" +#include "maybe.h" namespace xnoe { template @@ -17,32 +18,35 @@ namespace xnoe { } void set(key k, value v) { - xnoe::linkedlist> list = table[xnoe::hash(k) % 4096]; - xnoe::linkedlistelem> current = list.start; + xnoe::linkedlist> list = table[xnoe::hash(k) % 4096]; + xnoe::linkedlistelem>* current = list.start; bool exists = false; - while (current->next) { - if (xnoe::get<0>(current->elem) == k) { - exists = true; - break; + if (current) { + while (current->next) { + if (xnoe::get<0>(current->elem) == k) { + exists = true; + break; + } } } if (exists) - current = xnoe::tuple(k, v); + current->elem = xnoe::tuple(k, v); else list.append(xnoe::tuple(k, v)); } - value* get(key k) { - xnoe::linkedlist> list = table[xnoe::hash(k) % 4096]; - xnoe::linkedlistelem> current = list.start; - while (current->next) - if (xnoe::get<0>(current->elem) == k) - return &(xnoe::get<1>(current->elem)); + xnoe::Maybe get(key k) { + xnoe::linkedlist> list = table[xnoe::hash(k) % 4096]; + xnoe::linkedlistelem>* current = list.start; + if (current) + while (current->next) + if (xnoe::get<0>(current->elem) == k) + return xnoe::Maybe(xnoe::get<1>(current->elem)); - return 0; + return xnoe::Maybe(); } }; }