Data Structures | Functions

Di_tree

Data Structures

struct  di_tree
 Tree. More...
struct  di_tree_node
 Node of a tree. More...

Functions

di_treedi_tree_new (di_compare_func key_compare_func)
di_treedi_tree_new_full (di_compare_func key_compare_func, di_destroy_notify key_destroy_func, di_destroy_notify value_destroy_func)
void di_tree_destroy (di_tree *tree)
void di_tree_insert (di_tree *tree, void *key, void *value)
void * di_tree_lookup (di_tree *tree, const void *key)
void di_tree_foreach (di_tree *tree, di_hfunc *func, void *user_data)
di_ksize_t di_tree_size (di_tree *tree)

Function Documentation

void di_tree_destroy ( di_tree tree  ) 

Destroys the di_tree. If keys and/or values are dynamically allocated, you should either free them first or create the di_tree using di_tree_new_full. In the latter case the destroy functions you supplied will be called on all keys and values before destroying the di_hash_table.

Parameters:
tree a di_tree.

References di_free(), and root.

{
  di_tree_node_destroy (tree, tree->root);
  di_free (tree);
}

void di_tree_foreach ( di_tree tree,
di_hfunc *  func,
void *  user_data 
)

Calls the given function for each of the key/value pairs in the di_tree. The function is passed the key and value of each pair, and the given user_data parameter.

Postcondition:
The hash table may not be modified while iterating over it (you can't add/remove items).
Parameters:
tree a di_tree.
func the function to call for each key/value pair.
user_data user data to pass to the function.

References root.

{
  di_tree_node_foreach (tree->root, func, user_data);
}

void di_tree_insert ( di_tree tree,
void *  key,
void *  value 
)

Inserts a new key and value into a di_tree.

If the key already exists in the di_tree its current value is replaced with the new value. If you supplied a value_destroy_func when creating the di_tree, the old value is freed using that function. If you supplied a key_destroy_func when creating the di_tree, the passed key is freed using that function.

Parameters:
tree a di_tree.
key a key to insert.
value the value to associate with the key.

References nnodes, and root.

{
  if (!tree->root)
  {
    tree->root = di_tree_node_new (key, value);
    tree->nnodes++;
  }
  else
    tree->root = di_tree_node_insert (tree, tree->root, key, value);
}

void* di_tree_lookup ( di_tree tree,
const void *  key 
)

Looks up a key in a di_tree.

Parameters:
tree a di_tree.,
key the key to look up.
Returns:
the associated value, or NULL if the key is not found.

References root.

{
  return di_tree_node_lookup (tree, tree->root, key);
}

di_tree* di_tree_new ( di_compare_func  key_compare_func  ) 

Creates a new di_tree.

Parameters:
key_compare_func a function to compare two keys. This is used when looking up keys in the di_tree.
Returns:
a new di_tree.

References di_tree_new_full().

{
  return di_tree_new_full (key_compare_func, NULL, NULL);
}

di_tree* di_tree_new_full ( di_compare_func  key_compare_func,
di_destroy_notify  key_destroy_func,
di_destroy_notify  value_destroy_func 
)

Creates a new di_tree like di_tree_new and allows to specify functions to free the memory allocated for the key and value that get called when removing the entry from the di_tree

Parameters:
key_compare_func a function to check two keys for equality. This is used when looking up keys in the di_tree.
key_destroy_func a function to free the memory allocated for the key used when removing the entry from the di_tree or NULL if you don't want to supply such a function.
value_destroy_func a function to free the memory allocated for the value used when removing the entry from the di_tree or NULL if you don't want to supply such a function.
Returns:
a new di_tree.

References di_new, key_compare_func, key_destroy_func, nnodes, root, and value_destroy_func.

Referenced by di_tree_new().

{
  di_tree *tree;

  tree = di_new (di_tree, 1);
  tree->nnodes             = 0;
  tree->key_compare_func   = key_compare_func;
  tree->key_destroy_func   = key_destroy_func;
  tree->value_destroy_func = value_destroy_func;
  tree->root               = 0;

  return tree;
}

di_ksize_t di_tree_size ( di_tree tree  ) 

Returns the number of elements contained in the di_tree.

Parameters:
hash_table a di_tree.
Returns:
the number of key/value pairs.

References nnodes.

{
  return tree->nnodes;
}