#include "Hashtable.h" // amount of rows static const uint16 HT_HEIGHTS[]={17,61,257,1021,4099,16381,65521}; #define HT_HEIN_MIN 0 #define HT_HEIN_MAX 6 #define ARR_BC 2 #define ARR_BL 8 Hashtable* Hashtable_create(){ Hashtable* ht=malloc(sizeof(Hashtable)); ht->hein=HT_HEIN_MIN; ht->rows=malloc(HT_HEIGHTS[HT_HEIN_MIN]*sizeof(Autoarr(KeyValuePair))); for(uint16 i=0;irows[i]=Autoarr_create(KeyValuePair,ARR_BC,ARR_BL); return ht; } void Hashtable_free(Hashtable* ht){ for(uint16 i=0;ihein];i++){ Autoarr_KeyValuePair_clear(ht->rows+i); } free(ht->rows); free(ht); } uint16 Hashtable_height(Hashtable* ht) { return HT_HEIGHTS[ht->hein]; } void Hashtable_expand(Hashtable* ht){ if(ht->hein>=HT_HEIN_MAX) throw(ERR_MAXLENGTH); Autoarr(KeyValuePair)* newrows=malloc(HT_HEIGHTS[++ht->hein]*sizeof(Autoarr(KeyValuePair))); for(uint16 i=0;ihein];i++) newrows[i]=Autoarr_create(KeyValuePair,ARR_BC,ARR_BL); for(uint16 i=0;ihein-1];i++){ Autoarr(KeyValuePair)* ar=ht->rows+i; uint32 arlen=Autoarr_length(ar); for(uint16 k=0;khein]; Autoarr(KeyValuePair)* newar=newrows+newrown; Autoarr_add(newar,p); } Autoarr_clear(ar); } free(ht->rows); ht->rows=newrows; } Autoarr(KeyValuePair)* getrow(Hashtable* ht, char* key, bool can_expand){ Autoarr(KeyValuePair)* ar=ht->rows+ihash(key)%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]; return ar; } void Hashtable_add_pair(Hashtable* ht, KeyValuePair 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)); } // returns null or pointer to value in hashtable Unitype* Hashtable_getptr(Hashtable* ht, char* key){ Autoarr(KeyValuePair)* ar=getrow(ht,key,false); uint32 arlen=Autoarr_length(ar); for(uint32 i=0;ikey)) return &p->value; } return NULL; } Unitype Hashtable_get(Hashtable* ht, char* key){ Autoarr(KeyValuePair)* ar=getrow(ht,key,false); uint32 arlen=Autoarr_length(ar); for(uint32 i=0;i