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.
