Red-Black Tree -------------- Macros ~~~~~~ `RBTREE_INIT`:: Initialize a `rbtree` structure. + should only be used with the declaration like: + ---- rbtree tree = RBTREE_INIT(...); ---- + the arguments are pointers to callback functions, in order: `delete_fn`, `update_fn`, `cmp_fn` Data structures ~~~~~~~~~~~~~~~ * `rbtree` + -- Structure that holds a tree of nodes `root`:: Pointer to the node that is the root of the tree. `delete_fn`:: Pointer to the function that should handle the delete routines for the `key` pointer. `cmp_fn`:: Pointer to the function that is used to compare two `key` pointers. + Shall return a value greater than zero if 'ptr1' > 'ptr2', a value less than zero if 'ptr1' < 'ptr2' and zero if 'ptr1' == 'ptr2'. -- Functions ~~~~~~~~~ `rbtree_insert()`:: Creates and inserts a new node in the tree. + If provided, calls `rbtree->delete_fn` if a node should be updated. + Returns nonzero if a new node was inserted or updated, zero otherwise. NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ensure that it has a infinite lifetime. `rbtree_delete()`:: Deletes a node from the tree. + Returns the node's key if a node was removed, `NULL` otherwise. `rbtree_free()`:: Deletes the whole tree. if provided, calls `rbtree->delete_fn` for every node. `rbtree_walk()`:: Walks the tree in-order and passes a pointer to `key` for the given node to the 'action' callback function. `rbtree_search()`:: Searches the tree for 'key'. + Returns a pointer to the node if found else `NULL`. `rbtree_is_empty()`:: Checks if a tree is empty, retruns zero if the tree is empty, nonzero otherwise.