41
44
void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *key, const void *b), void *next[2]);
44
* Finds a element for which cmp(key, elem)==0, if no such element is found key
45
* is inserted into the tree.
47
* Inserts or removes an element.
48
* If *next is NULL then the element supplied will be removed, if no such
49
* element exists behavior is undefined.
50
* If *next is not NULL then the element supplied will be inserted, unless
51
* it already exists in the tree.
46
52
* @param rootp A pointer to a pointer to the root node of the tree. Note that
47
53
* the root node can change during insertions, this is required
48
54
* to keep the tree balanced.
55
* @param next Used to allocate and free AVTreeNodes. For insertion the user
56
* must set it to an allocated and zeroed object of at least
57
* av_tree_node_size bytes size. av_tree_insert() will set it to
58
* NULL if it has been consumed.
59
* For deleting elements *next is set to NULL by the user and
60
* av_tree_node_size() will set it to the AVTreeNode which was
61
* used for the removed element.
62
* This allows the use of flat arrays, which have
63
* lower overhead compared to many malloced elements.
64
* You might want to define a function like:
65
* void *tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){
66
* if(!*next) *next= av_mallocz(av_tree_node_size);
67
* return av_tree_insert(rootp, key, cmp, next);
69
* void *tree_remove(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b, AVTreeNode **next)){
70
* if(*next) av_freep(next);
71
* return av_tree_insert(rootp, key, cmp, next);
50
74
* @return If no insertion happened, the found element.
51
* If an insertion happened, then either key or NULL will be returned.
75
* If an insertion or removial happened, then either key or NULL will be returned.
52
76
* Which one it is depends on the tree state and the implementation. You
53
77
* should make no assumptions that it's one or the other in the code.
55
void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b));
79
void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next);
56
80
void av_tree_destroy(struct AVTreeNode *t);
82
#endif /* FFMPEG_TREE_H */