/*---------------------------------------------------------------------- * Find an element of the map. * Return the element node or NULL if not found. -----------------------------------------------------------------------*/ HashMapNode HashMap_Find(HashMap map, const HashMapKey key) { HashMapKeyNode keynode = HashMap_GetHashMapKeyNode(map, key, FALSE); if (keynode) { HashMapNode node = (HashMapNode)keynode->first; while (node) { if (map->compare(key, node->key) == 0) return node; node = node->next; } } return NULL; }
/*---------------------------------------------------------------------- * Destroy an element from the hash map. * Both stored element and key are destroyed. -----------------------------------------------------------------------*/ void HashMap_DestroyElement(HashMap map, HashMapKey key) { HashMapKeyNode keynode = HashMap_GetHashMapKeyNode(map, key, FALSE); if (keynode!=NULL) { HashMapNode node = (HashMapNode)keynode->first; while (node != NULL) { if (map->compare(key, node->key)==0) { if (node->key) map->destroyKey(node->key); DLList_DestroyElement((DLList)keynode, (DLListNode) node); return; } node = node->next; } } }
/*---------------------------------------------------------------------- * Remove an element from the hash map and return it. * The stored key is destroyed from the map. -----------------------------------------------------------------------*/ ContainerElement HashMap_Remove(HashMap map, HashMapKey key) { HashMapKeyNode keynode = HashMap_GetHashMapKeyNode(map, key, FALSE); if (keynode != NULL) { HashMapNode node = (HashMapNode)keynode->first; while (node != NULL) { if (map->compare(key, node->key)==0) { if (node->key) map->destroyKey(node->key); return DLList_RemoveElement((DLList)keynode, (DLListNode) node); } node = node->next; } } return NULL; }
/*---------------------------------------------------------------------- * Set an element in the hash map, the old element is returned. * The element and the key are stored in the map. * @param key Key of the element. * @param elem Element. * @return The old element, NULL if none. -----------------------------------------------------------------------*/ ContainerElement HashMap_Set(HashMap map, HashMapKey key, ContainerElement elem) { HashMapKeyNode keynode = HashMap_GetHashMapKeyNode(map, key, TRUE); HashMapNode node = (HashMapNode)keynode->first; ContainerElement old = NULL; while (node && map->compare(key, node->key) != 0) node = (HashMapNode)node->next; if (node) { old = node->elem; node->elem = elem; // free the key duplication. TtaFreeMemory (key); } else { node = (HashMapNode) TtaGetMemory (sizeof(sHashMapNode)); memset (node, 0, sizeof(sHashMapNode)); node->elem = elem; node->key = key; node->prev = NULL; if (keynode->first == NULL) { keynode->first = keynode->last = (DLListNode)node; node->next = NULL; } else { keynode->first->prev = (DLListNode)node; node->next = (HashMapNode)keynode->first; keynode->first = (DLListNode)node; } } return (ContainerElement)old; }