Red-Black tree
[Containers]
These functions provide Red-Black trees management. More...
Data Structures | |
struct | _Eina_Rbtree |
Defines | |
#define | EINA_RBTREE Eina_Rbtree __rbtree |
recommended way to declare the inlined Eina_Rbtree in your type. | |
#define | EINA_RBTREE_GET(Rbtree) & ((Rbtree)->__rbtree) |
access the inlined node if it was created with EINA_RBTREE. | |
#define | EINA_RBTREE_CMP_NODE_CB(Function) ((Eina_Rbtree_Cmp_Node_Cb)Function) |
Cast using Eina_Rbtree_Cmp_Node_Cb. | |
#define | EINA_RBTREE_CMP_KEY_CB(Function) ((Eina_Rbtree_Cmp_Key_Cb)Function) |
Cast using Eina_Rbtree_Cmp_Key_Cb. | |
#define | EINA_RBTREE_FREE_CB(Function) ((Eina_Rbtree_Free_Cb)Function) |
Cast using Eina_Rbtree_Free_Cb. | |
Typedefs | |
typedef struct _Eina_Rbtree | Eina_Rbtree |
Type for a Red-Black tree node. | |
typedef Eina_Rbtree_Direction(* | Eina_Rbtree_Cmp_Node_Cb )(const Eina_Rbtree *left, const Eina_Rbtree *right, void *data) |
Function used compare two nodes and see which direction to navigate. | |
typedef int(* | Eina_Rbtree_Cmp_Key_Cb )(const Eina_Rbtree *node, const void *key, int length, void *data) |
Function used compare node with a given key of specified length. | |
typedef void(* | Eina_Rbtree_Free_Cb )(Eina_Rbtree *node, void *data) |
Function used free a node. | |
Enumerations | |
enum | Eina_Rbtree_Color { EINA_RBTREE_RED, EINA_RBTREE_BLACK } |
node color. | |
enum | Eina_Rbtree_Direction { EINA_RBTREE_LEFT = 0, EINA_RBTREE_RIGHT = 1 } |
walk direction. | |
Functions | |
static Eina_Rbtree * | eina_rbtree_inline_lookup (const Eina_Rbtree *root, const void *key, int length, Eina_Rbtree_Cmp_Key_Cb cmp, const void *data) |
Eina_Rbtree * | eina_rbtree_inline_insert (Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_Node_Cb cmp, const void *data) |
Insert a new node inside an existing red black tree. | |
Eina_Rbtree * | eina_rbtree_inline_remove (Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_Node_Cb cmp, const void *data) |
Remove a node from an existing red black tree. | |
void | eina_rbtree_delete (Eina_Rbtree *root, Eina_Rbtree_Free_Cb func, void *data) |
Delete all nodes from a valid red black tree. | |
Eina_Iterator * | eina_rbtree_iterator_prefix (const Eina_Rbtree *root) |
Returned a new prefix iterator associated to a rbtree. | |
Eina_Iterator * | eina_rbtree_iterator_infix (const Eina_Rbtree *root) |
Returned a new prefix iterator associated to a rbtree. | |
Eina_Iterator * | eina_rbtree_iterator_postfix (const Eina_Rbtree *root) |
Returned a new prefix iterator associated to a rbtree. |
Detailed Description
These functions provide Red-Black trees management.
For a brief description look at http://en.wikipedia.org/wiki/Red-black_tree . This code is largely inspired from a tutorial written by Julienne Walker at : http://eternallyconfuzzled.com/tuts/datastructures/jsw_tut_rbtree.aspx . The main difference is that this set of function never allocate any data, making them particularly useful for memory management.
Define Documentation
#define EINA_RBTREE Eina_Rbtree __rbtree |
recommended way to declare the inlined Eina_Rbtree in your type.
struct my_type { EINA_RBTREE; int my_value; char *my_name; };
- See also:
- EINA_RBTREE_GET()
Typedef Documentation
Type for a Red-Black tree node.
It should be inlined into user's type.
Function Documentation
Eina_Rbtree * eina_rbtree_inline_insert | ( | Eina_Rbtree * | root, | |
Eina_Rbtree * | node, | |||
Eina_Rbtree_Cmp_Node_Cb | cmp, | |||
const void * | data | |||
) |
Insert a new node inside an existing red black tree.
- Parameters:
-
root The root of an exisiting valid red black tree. node The new node to insert. cmp The callback that is able to compare two nodes. data Private data to help the compare function.
- Returns:
- The new root of the red black tree.
This function insert a new node in a valid red black tree. NULL is an empty valid red black tree. The resulting new tree is a valid red black tree. This function doesn't allocate any data.
Eina_Rbtree * eina_rbtree_inline_remove | ( | Eina_Rbtree * | root, | |
Eina_Rbtree * | node, | |||
Eina_Rbtree_Cmp_Node_Cb | cmp, | |||
const void * | data | |||
) |
Remove a node from an existing red black tree.
- Parameters:
-
root The root of a valid red black tree. node The node to remove from the tree. cmp The callback that is able to compare two nodes. data Private data to help the compare function.
- Returns:
- The new root of the red black tree.
This function remove a new node in a valid red black tree that should contain the node that you are removing. This function will return NULL when the red black tree got empty. This function doesn't free any data.
void eina_rbtree_delete | ( | Eina_Rbtree * | root, | |
Eina_Rbtree_Free_Cb | func, | |||
void * | data | |||
) |
Delete all nodes from a valid red black tree.
- Parameters:
-
root The root of a valid red black tree. func The callback that will free each node. data Private data to help the compare function.
Eina_Iterator * eina_rbtree_iterator_prefix | ( | const Eina_Rbtree * | root | ) |
Returned a new prefix iterator associated to a rbtree.
- Parameters:
-
root The root of rbtree.
- Returns:
- A new iterator.
This function returns a newly allocated iterator associated to root
. It will iterate the tree using prefix walk. If root
is NULL
, this function still returns a valid iterator that will always return false on eina_iterator_next(), thus keeping API sane.
If the memory can not be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is set. Otherwise, a valid iterator is returned.
- Warning:
- if the rbtree structure changes then the iterator becomes invalid! That is, if you add or remove nodes this iterator behavior is undefined and your program may crash!
Eina_Iterator * eina_rbtree_iterator_infix | ( | const Eina_Rbtree * | root | ) |
Returned a new prefix iterator associated to a rbtree.
- Parameters:
-
root The root of rbtree.
- Returns:
- A new iterator.
This function returns a newly allocated iterator associated to root
. It will iterate the tree using infix walk. If root
is NULL
, this function still returns a valid iterator that will always return false on eina_iterator_next(), thus keeping API sane.
If the memory can not be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is set. Otherwise, a valid iterator is returned.
- Warning:
- if the rbtree structure changes then the iterator becomes invalid! That is, if you add or remove nodes this iterator behavior is undefined and your program may crash!
Eina_Iterator * eina_rbtree_iterator_postfix | ( | const Eina_Rbtree * | root | ) |
Returned a new prefix iterator associated to a rbtree.
- Parameters:
-
root The root of rbtree.
- Returns:
- A new iterator.
This function returns a newly allocated iterator associated to root
. It will iterate the tree using postfix walk. If root
is NULL
, this function still returns a valid iterator that will always return false on eina_iterator_next(), thus keeping API sane.
If the memory can not be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is set. Otherwise, a valid iterator is returned.
- Warning:
- if the rbtree structure changes then the iterator becomes invalid! That is, if you add or remove nodes this iterator behavior is undefined and your program may crash!