new Hashtable functions
This commit is contained in:
parent
461aef3a00
commit
a7de63bb9d
@ -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{
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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); \
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user