annotate tree.h @ 727:98b64f65be0d libavutil

Reorganise intreadwrite.h This changes intreadwrite.h to support per-arch implementations of the various macros allowing us to take advantage of special instructions or other properties the compiler does not know about.
author mru
date Sat, 18 Apr 2009 00:00:22 +0000
parents 70bdd5501662
children 6676b1979b68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
136
4ae092965c27 AVL tree
michael
parents:
diff changeset
1 /*
4ae092965c27 AVL tree
michael
parents:
diff changeset
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
4ae092965c27 AVL tree
michael
parents:
diff changeset
3 *
4ae092965c27 AVL tree
michael
parents:
diff changeset
4 * This file is part of FFmpeg.
4ae092965c27 AVL tree
michael
parents:
diff changeset
5 *
4ae092965c27 AVL tree
michael
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
4ae092965c27 AVL tree
michael
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
4ae092965c27 AVL tree
michael
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
4ae092965c27 AVL tree
michael
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
4ae092965c27 AVL tree
michael
parents:
diff changeset
10 *
4ae092965c27 AVL tree
michael
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
4ae092965c27 AVL tree
michael
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4ae092965c27 AVL tree
michael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4ae092965c27 AVL tree
michael
parents:
diff changeset
14 * Lesser General Public License for more details.
4ae092965c27 AVL tree
michael
parents:
diff changeset
15 *
4ae092965c27 AVL tree
michael
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
4ae092965c27 AVL tree
michael
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
4ae092965c27 AVL tree
michael
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4ae092965c27 AVL tree
michael
parents:
diff changeset
19 */
4ae092965c27 AVL tree
michael
parents:
diff changeset
20
261
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
21 /**
642
70bdd5501662 Use full internal pathname in doxygen @file directives.
diego
parents: 636
diff changeset
22 * @file libavutil/tree.h
261
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
23 * A tree container.
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
24 * Insertion, removal, finding equal, largest which is smaller than and
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
25 * smallest which is larger than, all have O(log n) worst case complexity.
261
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
26 * @author Michael Niedermayer <michaelni@gmx.at>
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
27 */
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
28
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 417
diff changeset
29 #ifndef AVUTIL_TREE_H
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 417
diff changeset
30 #define AVUTIL_TREE_H
136
4ae092965c27 AVL tree
michael
parents:
diff changeset
31
4ae092965c27 AVL tree
michael
parents:
diff changeset
32 struct AVTreeNode;
413
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
33 extern const int av_tree_node_size;
150
michael
parents: 136
diff changeset
34
michael
parents: 136
diff changeset
35 /**
michael
parents: 136
diff changeset
36 * Finds an element.
michael
parents: 136
diff changeset
37 * @param root a pointer to the root node of the tree
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
38 * @param next If next is not NULL, then next[0] will contain the previous
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
39 * element and next[1] the next element. If either does not exist,
259
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
40 * then the corresponding entry in next is unchanged.
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
41 * @return An element with cmp(key, elem)==0 or NULL if no such element exists in
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
42 * the tree.
150
michael
parents: 136
diff changeset
43 */
michael
parents: 136
diff changeset
44 void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *key, const void *b), void *next[2]);
michael
parents: 136
diff changeset
45
michael
parents: 136
diff changeset
46 /**
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
47 * Inserts or removes an element.
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
48 * If *next is NULL, then the supplied element will be removed if it exists.
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
49 * If *next is not NULL, then the supplied element will be inserted, unless
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
50 * it already exists in the tree.
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
51 * @param rootp A pointer to a pointer to the root node of the tree; note that
259
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
52 * the root node can change during insertions, this is required
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
53 * to keep the tree balanced.
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
54 * @param next Used to allocate and free AVTreeNodes. For insertion the user
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
55 * must set it to an allocated and zeroed object of at least
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
56 * av_tree_node_size bytes size. av_tree_insert() will set it to
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
57 * NULL if it has been consumed.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
58 * For deleting elements *next is set to NULL by the user and
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
59 * av_tree_node_size() will set it to the AVTreeNode which was
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
60 * used for the removed element.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
61 * This allows the use of flat arrays, which have
413
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
62 * lower overhead compared to many malloced elements.
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
63 * You might want to define a function like:
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
64 * void *tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
65 * if(!*next) *next= av_mallocz(av_tree_node_size);
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
66 * return av_tree_insert(rootp, key, cmp, next);
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
67 * }
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
68 * void *tree_remove(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b, AVTreeNode **next)){
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
69 * if(*next) av_freep(next);
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
70 * return av_tree_insert(rootp, key, cmp, next);
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
71 * }
150
michael
parents: 136
diff changeset
72 *
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
73 * @return If no insertion happened, the found element; if an insertion or
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 572
diff changeset
74 removal happened, then either key or NULL will be returned.
261
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
75 * Which one it is depends on the tree state and the implementation. You
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
76 * should make no assumptions that it's one or the other in the code.
150
michael
parents: 136
diff changeset
77 */
413
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
78 void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next);
136
4ae092965c27 AVL tree
michael
parents:
diff changeset
79 void av_tree_destroy(struct AVTreeNode *t);
4ae092965c27 AVL tree
michael
parents:
diff changeset
80
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 417
diff changeset
81 #endif /* AVUTIL_TREE_H */