Exemple #1
0
/*----------------------------------------------------------------------
 * 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;
}
Exemple #2
0
/*----------------------------------------------------------------------
 * 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;
    }
  }
}
Exemple #3
0
/*----------------------------------------------------------------------
 * 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;  
}
Exemple #4
0
/*----------------------------------------------------------------------
 * 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;
}