new Hashtable functions

This commit is contained in:
Timerix22 2023-05-22 03:06:03 +06:00
parent 461aef3a00
commit a7de63bb9d
3 changed files with 37 additions and 5 deletions

View File

@ -318,7 +318,7 @@ Maybe __deserialize(char** _text, bool _calledRecursively) {
partOfDollarList=false; partOfDollarList=false;
Autoarr(Unitype)* list; Autoarr(Unitype)* list;
Unitype lu; Unitype lu;
if(Hashtable_try_get(dict,nameCPtr, &lu)){ if(Hashtable_tryGet(dict,nameCPtr, &lu)){
list=(Autoarr(Unitype)*)lu.VoidPtr; list=(Autoarr(Unitype)*)lu.VoidPtr;
} }
else{ else{

View File

@ -67,11 +67,19 @@ Autoarr(KVPair)* getrow(Hashtable* ht, char* key, bool can_expand){
return ar; return ar;
} }
/// @param key must be heap allocated
/// Hashtable_free will free this pointer
void Hashtable_add(Hashtable* ht, char* key, Unitype u){ void Hashtable_add(Hashtable* ht, char* key, Unitype u){
KVPair p={ .key=key, .value=u }; KVPair p={ .key=key, .value=u };
Autoarr_add(getrow(ht,key,true),p); Autoarr_add(getrow(ht,key,true),p);
} }
void Hashtable_addMany(Hashtable* ht, KVPair* pair_array, u32 count){
for(u32 i=0; i<count; i++){
Hashtable_add(ht, pair_array[i].key, pair_array[i].value);
}
}
// 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){
Autoarr(KVPair)* ar=getrow(ht,key,false); Autoarr(KVPair)* ar=getrow(ht,key,false);
@ -93,14 +101,35 @@ Unitype Hashtable_get(Hashtable* ht, char* key){
return UniNull; return UniNull;
} }
bool Hashtable_try_get(Hashtable* ht, char* key, Unitype* output){ bool Hashtable_tryGet(Hashtable* ht, char* key, Unitype* output){
Unitype u=Hashtable_get(ht,key); Unitype u=Hashtable_get(ht,key);
*output=u; *output=u;
return Unitype_isUniNull(u); return !Unitype_isUniNull(u);
}
bool Hashtable_trySet(Hashtable* ht, char* key, Unitype u){
Unitype* val=Hashtable_getPtr(ht,key);
if(Unitype_isUniNull((*val)))
return false;
*val=u;
return true;
}
bool Hashtable_tryAdd(Hashtable* ht, char* key, Unitype u){
Unitype* val=Hashtable_getPtr(ht,key);
if(Unitype_isUniNull((*val))){
Hashtable_add(ht, key, u);
return true;
}
return false;
} }
void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u){ void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u){
Unitype* val=Hashtable_getPtr(ht, key); Unitype* val=Hashtable_getPtr(ht, key);
if(val) *val=u; // set
if(!Unitype_isUniNull((*val)))
*val=u;
// add
else Hashtable_add(ht, key, u); else Hashtable_add(ht, key, u);
} }

View File

@ -26,12 +26,15 @@ u16 Hashtable_height(Hashtable* ht);
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); void Hashtable_addOrSet(Hashtable* ht, char* key, Unitype u);
void Hashtable_addMany(Hashtable* ht, KVPair* pair_array, u32 count);
bool Hashtable_tryAdd(Hashtable* ht, char* key, Unitype u);
bool Hashtable_trySet(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);
bool Hashtable_try_get(Hashtable* ht, char* key, Unitype* output); bool Hashtable_tryGet(Hashtable* ht, char* key, Unitype* output);
#define Hashtable_foreach(HT, EL, codeblock...) { \ #define Hashtable_foreach(HT, EL, codeblock...) { \
u16 hmax=Hashtable_height(HT); \ u16 hmax=Hashtable_height(HT); \