some Hashtable improvements from another branch

This commit is contained in:
Timerix22 2022-04-20 19:49:57 +03:00
parent 20a60fec60
commit 2a6ad6e207
5 changed files with 27 additions and 48 deletions

View File

@ -7,9 +7,7 @@ Unitype DtsodV24_get(Hashtable* dtsod, char* key){
// adds or sets value // adds or sets value
void DtsodV24_addOrSet(Hashtable* dtsod, char* key, Unitype value){ void DtsodV24_addOrSet(Hashtable* dtsod, char* key, Unitype value){
Unitype* val=Hashtable_getptr(dtsod, key); Hashtable_addOrSet(dtsod,key,value);
if(val) *val=value;
else Hashtable_add(dtsod, key, value);
} }
// checks for dtsod contains value or dont // checks for dtsod contains value or dont

View File

@ -53,19 +53,17 @@ void Hashtable_expand(Hashtable* ht){
} }
Autoarr(KVPair)* getrow(Hashtable* ht, char* key, bool can_expand){ 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)) if(can_expand && Autoarr_length(ar)==Autoarr_max_length(ar))
optime("expand",1,(Hashtable_expand(ht))); 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; 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){ 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 // returns null or pointer to value in hashtable
@ -88,18 +86,15 @@ Unitype Hashtable_get(Hashtable* ht, char* key){
} }
return UniNull; 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){ bool Hashtable_try_get(Hashtable* ht, char* key, Unitype* output){
Unitype u=Hashtable_get(ht,key); Unitype u=Hashtable_get(ht,key);
*output=u; *output=u;
return u.type!=Null; return u.type!=Null;
} }
/* void Hashtable_set_pair(Hashtable* ht, KVPair p){ void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u){
if(Hashtable_try_get(ht,p.key, NULL)){ 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)); } */

View File

@ -19,28 +19,19 @@ void Hashtable_free(Hashtable* ht);
// amount of rows // amount of rows
uint16 Hashtable_height(Hashtable* ht); 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, // don't add pairs with the same keys,
// or something weird will happen // or something weird will happen
// // if not sure, use Hashtable_addOrSet()
void Hashtable_add_pair(Hashtable* ht, KVPair p);
void Hashtable_add(Hashtable* ht, char* key, Unitype u); 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 // returns null or pointer to value in hashtable
Unitype* Hashtable_getptr(Hashtable* ht, char* key); Unitype* Hashtable_getptr(Hashtable* ht, char* key);
Unitype Hashtable_get(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); 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)({\ #define Hashtable_foreach(HT, EL, codeblock)({\
uint16 hmax=Hashtable_height(HT);\ uint16 hmax=Hashtable_height(HT);\
for(uint16 h=0; h<hmax; h++){\ for(uint16 h=0; h<hmax; h++){\

View File

@ -30,10 +30,6 @@ void print_dtsod(Hashtable* dtsod){
})); }));
} }
#include <errno.h>
void test_dtsod(){ void test_dtsod(){
optime(__func__,1,({ optime(__func__,1,({
printf("\e[96m-------------[test_dtsod]-------------\n"); printf("\e[96m-------------[test_dtsod]-------------\n");

View File

@ -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){ void fill(Hashtable* ht){
for(uint32 i=0;i<100000;i++){ for(uint32 i=0;i<100000;i++)
char* key=malloc(12); Hashtable_add(ht,genkey(i),Uni(UInt64,i));
IFWIN(
sprintf_s(key,12,"key_%u",i),
sprintf(key,"key_%u",i)
);
Hashtable_add(ht,key,Uni(UInt64,i));
}
} }
Unitype gett(Hashtable* ht){ Unitype gett(Hashtable* ht){
char* key=malloc(12);
Unitype u; Unitype u;
for(uint32 i=0;i<100000;i++){ for(uint32 i=0;i<100000;i++){
IFWIN( char* key=genkey(i);
sprintf_s(key,12,"key_%u",i),
sprintf(key,"key_%u",i)
);
u=Hashtable_get(ht,key); u=Hashtable_get(ht,key);
free(key);
} }
free(key);
return u; return u;
} }