Red-Black Tree -------------- Macros ~~~~~~ `RBTREE_INIT`:: Initialize a `rbtree` structure. + should only be used with the declaration like: + ---- rbtree tree = RBTREE_INIT(cmp); ---- + will expand to set the compare function 'cmp' to the `cmp_fn` member. Data structures ~~~~~~~~~~~~~~~ * `rbtree` + -- Structure that holds a tree of nodes `root`:: Pointer to the node that is the root of the tree. `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. + Returns a positive value if the node was inserted, zero if the key already exists in the tree and a negative value if an error occured. 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 'free_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.