From 2a6ad6e20742edee66241d5cb927065cc52e1464 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Wed, 20 Apr 2022 19:49:57 +0300 Subject: [PATCH] some Hashtable improvements from another branch --- DtsodParser/DtsodV24.c | 4 +--- Hashtable/Hashtable.c | 25 ++++++++++--------------- Hashtable/Hashtable.h | 15 +++------------ tests/test_dtsod.c | 4 ---- tests/test_hashtable.c | 27 +++++++++++++-------------- 5 files changed, 27 insertions(+), 48 deletions(-) diff --git a/DtsodParser/DtsodV24.c b/DtsodParser/DtsodV24.c index f5ce5b4..aff3589 100644 --- a/DtsodParser/DtsodV24.c +++ b/DtsodParser/DtsodV24.c @@ -7,9 +7,7 @@ Unitype DtsodV24_get(Hashtable* dtsod, char* key){ // adds or sets value void DtsodV24_addOrSet(Hashtable* dtsod, char* key, Unitype value){ - Unitype* val=Hashtable_getptr(dtsod, key); - if(val) *val=value; - else Hashtable_add(dtsod, key, value); + Hashtable_addOrSet(dtsod,key,value); } // checks for dtsod contains value or dont diff --git a/Hashtable/Hashtable.c b/Hashtable/Hashtable.c index c7a8da4..f74f8cf 100644 --- a/Hashtable/Hashtable.c +++ b/Hashtable/Hashtable.c @@ -53,19 +53,17 @@ void Hashtable_expand(Hashtable* ht){ } Autoarr(KVPair)* getrow(Hashtable* ht, char* key, bool can_expand){ - Autoarr(KVPair)* ar=ht->rows[ihash(key)%HT_HEIGHTS[ht->hein]]; + uint32 hash=ihash(key); + Autoarr(KVPair)* ar=ht->rows[hash%HT_HEIGHTS[ht->hein]]; if(can_expand && Autoarr_length(ar)==Autoarr_max_length(ar)) optime("expand",1,(Hashtable_expand(ht))); - ar=ht->rows[ihash(key)%HT_HEIGHTS[ht->hein]]; + ar=ht->rows[hash%HT_HEIGHTS[ht->hein]]; return ar; } - -void Hashtable_add_pair(Hashtable* ht, KVPair p){ - Autoarr_add(getrow(ht,p.key,true),p); -} void Hashtable_add(Hashtable* ht, char* key, Unitype u){ - Hashtable_add_pair(ht,KVPair(key,u)); + KVPair p={ .key=key, .value=u }; + Autoarr_add(getrow(ht,key,true),p); } // returns null or pointer to value in hashtable @@ -88,18 +86,15 @@ Unitype Hashtable_get(Hashtable* ht, char* key){ } return UniNull; } -KVPair Hashtable_get_pair(Hashtable* ht, char* key){ - return KVPair(key,Hashtable_get(ht,key)); -} + bool Hashtable_try_get(Hashtable* ht, char* key, Unitype* output){ Unitype u=Hashtable_get(ht,key); *output=u; return u.type!=Null; } -/* void Hashtable_set_pair(Hashtable* ht, KVPair p){ - if(Hashtable_try_get(ht,p.key, NULL)){ - - } +void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u){ + Unitype* val=Hashtable_getptr(ht, key); + if(val) *val=u; + else Hashtable_add(ht, key, u); } -void Hashtable_set(Hashtable* ht, char* key, Unitype u){ Hashtable_set_pair(ht,KVPair(key,u)); } */ diff --git a/Hashtable/Hashtable.h b/Hashtable/Hashtable.h index bb7d5a6..19eca90 100644 --- a/Hashtable/Hashtable.h +++ b/Hashtable/Hashtable.h @@ -19,28 +19,19 @@ void Hashtable_free(Hashtable* ht); // amount of rows uint16 Hashtable_height(Hashtable* ht); -// adds charptr and value to new KVPair -// use cptr_copy() to create new string if needed -#define KVPair(key,value) (KVPair){key,value} - -// // don't add pairs with the same keys, // or something weird will happen -// -void Hashtable_add_pair(Hashtable* ht, KVPair p); +// if not sure, use Hashtable_addOrSet() void Hashtable_add(Hashtable* ht, char* key, Unitype u); +void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u); + // returns null or pointer to value in hashtable Unitype* Hashtable_getptr(Hashtable* ht, char* key); Unitype Hashtable_get(Hashtable* ht, char* key); -KVPair Hashtable_get_pair(Hashtable* ht, char* key); bool Hashtable_try_get(Hashtable* ht, char* key, Unitype* output); -// not implemented yet -void Hashtable_set_pair(Hashtable* ht, KVPair p); -void Hashtable_set(Hashtable* ht, char* key, Unitype u); - #define Hashtable_foreach(HT, EL, codeblock)({\ uint16 hmax=Hashtable_height(HT);\ for(uint16 h=0; h - - void test_dtsod(){ optime(__func__,1,({ printf("\e[96m-------------[test_dtsod]-------------\n"); diff --git a/tests/test_hashtable.c b/tests/test_hashtable.c index 83ea577..e0cf59d 100644 --- a/tests/test_hashtable.c +++ b/tests/test_hashtable.c @@ -36,28 +36,27 @@ void printrowgraph(Hashtable* ht){ } } +char* genkey(uint32 i){ + char* key=malloc(12); + IFWIN( + sprintf_s(key,12,"key_%u",i), + sprintf(key,"key_%u",i) + ); + return key; +} + void fill(Hashtable* ht){ - for(uint32 i=0;i<100000;i++){ - char* key=malloc(12); - IFWIN( - sprintf_s(key,12,"key_%u",i), - sprintf(key,"key_%u",i) - ); - Hashtable_add(ht,key,Uni(UInt64,i)); - } + for(uint32 i=0;i<100000;i++) + Hashtable_add(ht,genkey(i),Uni(UInt64,i)); } Unitype gett(Hashtable* ht){ - char* key=malloc(12); Unitype u; for(uint32 i=0;i<100000;i++){ - IFWIN( - sprintf_s(key,12,"key_%u",i), - sprintf(key,"key_%u",i) - ); + char* key=genkey(i); u=Hashtable_get(ht,key); + free(key); } - free(key); return u; }