|
|
|
@ -34,10 +34,10 @@ |
|
|
|
|
* @addtogroup lavu_tree AVTree |
|
|
|
|
* @ingroup lavu_data |
|
|
|
|
* |
|
|
|
|
* Low complexity tree container |
|
|
|
|
* Low-complexity tree container |
|
|
|
|
* |
|
|
|
|
* Insertion, removal, finding equal, largest which is smaller than and |
|
|
|
|
* smallest which is larger than, all have O(log n) worst case complexity. |
|
|
|
|
* smallest which is larger than, all have O(log n) worst-case complexity. |
|
|
|
|
* @{ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
@ -58,10 +58,11 @@ struct AVTreeNode *av_tree_node_alloc(void); |
|
|
|
|
* @param next If next is not NULL, then next[0] will contain the previous |
|
|
|
|
* element and next[1] the next element. If either does not exist, |
|
|
|
|
* then the corresponding entry in next is unchanged. |
|
|
|
|
* @return An element with cmp(key, elem)==0 or NULL if no such element exists in |
|
|
|
|
* the tree. |
|
|
|
|
* @return An element with cmp(key, elem) == 0 or NULL if no such element |
|
|
|
|
* exists in the tree. |
|
|
|
|
*/ |
|
|
|
|
void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *key, const void *b), void *next[2]); |
|
|
|
|
void *av_tree_find(const struct AVTreeNode *root, void *key, |
|
|
|
|
int (*cmp)(void *key, const void *b), void *next[2]); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Insert or remove an element. |
|
|
|
@ -82,11 +83,17 @@ void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *ke |
|
|
|
|
* lower overhead compared to many malloced elements. |
|
|
|
|
* You might want to define a function like: |
|
|
|
|
* @code |
|
|
|
|
* void *tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){ |
|
|
|
|
* if(!*next) *next= av_mallocz(av_tree_node_size); |
|
|
|
|
* void *tree_insert(struct AVTreeNode **rootp, void *key, |
|
|
|
|
* int (*cmp)(void *key, const void *b), |
|
|
|
|
* AVTreeNode **next) |
|
|
|
|
* { |
|
|
|
|
* if (!*next) |
|
|
|
|
* *next = av_mallocz(av_tree_node_size); |
|
|
|
|
* return av_tree_insert(rootp, key, cmp, next); |
|
|
|
|
* } |
|
|
|
|
* void *tree_remove(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b, AVTreeNode **next)){ |
|
|
|
|
* void *tree_remove(struct AVTreeNode **rootp, void *key, |
|
|
|
|
* int (*cmp)(void *key, const void *b, AVTreeNode **next)) |
|
|
|
|
* { |
|
|
|
|
* av_freep(next); |
|
|
|
|
* return av_tree_insert(rootp, key, cmp, next); |
|
|
|
|
* } |
|
|
|
@ -96,7 +103,10 @@ void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *ke |
|
|
|
|
* Which one it is depends on the tree state and the implementation. You |
|
|
|
|
* should make no assumptions that it's one or the other in the code. |
|
|
|
|
*/ |
|
|
|
|
void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next); |
|
|
|
|
void *av_tree_insert(struct AVTreeNode **rootp, void *key, |
|
|
|
|
int (*cmp)(void *key, const void *b), |
|
|
|
|
struct AVTreeNode **next); |
|
|
|
|
|
|
|
|
|
void av_tree_destroy(struct AVTreeNode *t); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -109,7 +119,9 @@ void av_tree_destroy(struct AVTreeNode *t); |
|
|
|
|
* @note The cmp function should use the same ordering used to construct the |
|
|
|
|
* tree. |
|
|
|
|
*/ |
|
|
|
|
void av_tree_enumerate(struct AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)); |
|
|
|
|
void av_tree_enumerate(struct AVTreeNode *t, void *opaque, |
|
|
|
|
int (*cmp)(void *opaque, void *elem), |
|
|
|
|
int (*enu)(void *opaque, void *elem)); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @} |
|
|
|
|