diff --git a/include/arc/std/hashtable.h b/include/arc/std/hashtable.h index 16b3648..965762e 100644 --- a/include/arc/std/hashtable.h +++ b/include/arc/std/hashtable.h @@ -104,6 +104,15 @@ void ARC_Hashtable_Clear(ARC_Hashtable *hashtable); */ void *ARC_Hashtable_Get(ARC_Hashtable *hashtable, void *key); +/** + * @brief gets the number of elements stored in the hashtable + * + * @param[in] hashtable the hashtable to get number of elements from + * + * @return the size of the vector +*/ +uint32_t ARC_Hashtable_GetSize(ARC_Hashtable *hashtable); + /** * @brief iterates through a hashtable passing available key value pairs to a callback * diff --git a/src/std/chemical.c b/src/std/chemical.c index 03a0eef..4cb3578 100644 --- a/src/std/chemical.c +++ b/src/std/chemical.c @@ -16,6 +16,8 @@ struct ARC_Chemical { ARC_Hashtable *groups; ARC_Hashtable *currentGroup; + + ARC_Bool load; }; typedef struct ARC_ChemicalTypeData { @@ -313,6 +315,13 @@ void ARC_ChemicalData_RunVariableLineTag(ARC_ParserTagToken *tagToken, ARC_Chemi ARC_String_Create(&variableString, NULL, 0); ARC_ParserData_HelperRecurseStringAdd(&variableString, childTagToken); + //check if removing + if(chemical->load == ARC_False){ + ARC_Hashtable_Remove(chemical->currentGroup, (void *)variableString->data); + ARC_String_Destroy(variableString); + return; + } + //check to see if the current variable is already in the current group hashtable ARC_ChemicalTypeData *typeData = (ARC_ChemicalTypeData *)ARC_Hashtable_Get(chemical->currentGroup, variableString->data); if(typeData != NULL){ @@ -420,6 +429,13 @@ void ARC_ChemicalData_RunGroupTag(ARC_ParserTagToken *tagToken, ARC_Chemical *ch ARC_String_Create(&groupVariable, NULL, 0); ARC_ParserData_HelperRecurseStringAdd(&groupVariable, childTagToken); + //check if removing + if(chemical->load == ARC_False){ + //TODO: check if the group is empty and remove it if it is + ARC_String_Destroy(groupVariable); + return; + } + //get the needed hashtable or create it from the groups hashtable ARC_Hashtable *groupHashtable = ARC_Hashtable_Get(chemical->groups, (void *)groupVariable->data); if(groupHashtable == NULL){ @@ -577,6 +593,8 @@ void ARC_Chemical_Create(ARC_Chemical **chemical){ ARC_Hashtable_Create(&((*chemical)->currentGroup), NULL, &keyCompareFn, &groupDataDestroyKeyValueFn); ARC_Hashtable_Add((*chemical)->groups, (void *)emptyCStr, (*chemical)->currentGroup); + (*chemical)->load = ARC_True; + //cleanup ARC_String_Destroy(languageString); } @@ -691,16 +709,22 @@ void *ARC_Chemical_GetWithCStr(ARC_Chemical *chemical, const char *element){ } void ARC_Chemical_LoadFromString(ARC_Chemical *chemical, ARC_String **string){ + chemical->load = ARC_True; ARC_Parser_Parse(chemical->parser, string); } void ARC_Chemical_LoadFromFile(ARC_Chemical *chemical, ARC_String *path){ + chemical->load = ARC_True; ARC_Parser_ParseFile(chemical->parser, path); } void ARC_Chemical_UnloadFromString(ARC_Chemical *chemical, ARC_String **string){ + chemical->load = ARC_False; + ARC_Parser_Parse(chemical->parser, string); } -void ARC_Chemical_UnloadFromFile(ARC_Chemical *chemical, ARC_String *data){ +void ARC_Chemical_UnloadFromFile(ARC_Chemical *chemical, ARC_String *path){ + chemical->load = ARC_False; + ARC_Parser_ParseFile(chemical->parser, path); } diff --git a/src/std/hashtable.c b/src/std/hashtable.c index e22fa9f..8ccb06d 100644 --- a/src/std/hashtable.c +++ b/src/std/hashtable.c @@ -406,6 +406,25 @@ void *ARC_Hashtable_Get(ARC_Hashtable *hashtable, void *key){ return NULL; } +uint32_t ARC_Hashtable_GetSize(ARC_Hashtable *hashtable){ + uint32_t size = 0; + + //loop through the vector and add iterate the size when the value is not null + for(uint32_t index = 0; index < hashtable->currentCapacity; index++){ + //get the current node + ARC_HashtableNode node = hashtable->nodes[index]; + + //skip past NULL keys + if(node.key == NULL){ + continue; + } + + size++; + } + + return size; +} + void ARC_Hashtable_RunIteration(ARC_Hashtable *hashtable, ARC_Hashtable_IteratorFn iteratorFn, void *userData){ //pass each non NULL nodes into an iteratorFn callback for(uint32_t index = 0; index < hashtable->currentCapacity; index++){