Di_tree

## Data Structures

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

## Functions

di_tree * | di_tree_new (di_compare_func key_compare_func)
di_tree * | di_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)

## Detailed Description

## Function Documentation

## di_tree_destroy()

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.

{
di_tree_node_destroy (tree, tree->root);
di_free (tree);
}
di_free
void di_free(void *mem)
Definition mem.c:60
di_tree::root
di_tree_node * root
Definition tree.c:43

References di_free(), and di_tree::root.

## di_tree_foreach()

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.

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

References di_tree::root.

## di_tree_insert()

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.

{
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);
}
di_tree::nnodes
size_t nnodes
Definition tree.c:42

References di_tree::nnodes, and di_tree::root.

## di_tree_lookup()

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.

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

References di_tree::root.

## di_tree_new()

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.

{
return di_tree_new_full (key_compare_func, NULL, NULL);
}
di_tree_new_full
di_tree * di_tree_new_full(di_compare_func key_compare_func, di_destroy_notify key_destroy_func, di_destroy_notify value_destroy_func)
Definition tree.c:69

References di_tree_new_full().

## di_tree_new_full()

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.

{
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_new
#define di_new(struct_type, n_structs)
Definition mem.h:73
di_tree
Tree.
Definition tree.c:41
di_tree::key_compare_func
di_compare_func * key_compare_func
Definition tree.c:44
di_tree::key_destroy_func
di_destroy_notify * key_destroy_func
Definition tree.c:45
di_tree::value_destroy_func
di_destroy_notify * value_destroy_func
Definition tree.c:46

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

Referenced by di_tree_new().

## di_tree_size()

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.

{
return tree->nnodes;
}

References di_tree::nnodes.