annotate tree.h @ 510:b7593ce78422 libavutil

Make av_fifo*_read() ignore the available amount of data. This is more efficient as in practice the check is redundant most of the time. Callers which do not know if enough data is available have to check it with av_fifo_size(). Doing the check in *read() means the caller has no choice to skip the check when its known to be redundant. Also the return value was never documented in a public header so changing it should not break the API. Besides this fixes the case where read() failed on a 100% full fifo.
author michael
date Sun, 25 May 2008 22:20:39 +0000
parents ba2d05538ec1
children bd4052d9050c
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 /**
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
22 * @file tree.h
2ed59b450840 Add Doxygen author and file description, rephrase a Doxygen comment.
diego
parents: 259
diff changeset
23 * A tree container.
417
ba2d05538ec1 Document O() time.
michael
parents: 416
diff changeset
24 * Insertion, Removial, Finding equal, largest which is smaller than and
ba2d05538ec1 Document O() time.
michael
parents: 416
diff changeset
25 * smallest which is larger than all have O(log n) worst case time.
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
392
d0f3bb6e367e Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 261
diff changeset
29 #ifndef FFMPEG_TREE_H
d0f3bb6e367e Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 261
diff changeset
30 #define FFMPEG_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
259
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
38 * @param next If next is not NULL then next[0] will contain the previous
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
39 * element and next[1] the next element if either does not exist
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.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
48 * If *next is NULL then the element supplied will be removed, if no such
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
49 * element exists behavior is undefined.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
50 * If *next is not NULL then the element supplied will be inserted, unless
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
51 * it already exists in the tree.
259
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
52 * @param rootp A pointer to a pointer to the root node of the tree. Note that
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
53 * the root node can change during insertions, this is required
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
54 * to keep the tree balanced.
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
55 * @param next Used to allocate and free AVTreeNodes. For insertion the user
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
56 * must set it to an allocated and zeroed object of at least
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
57 * av_tree_node_size bytes size. av_tree_insert() will set it to
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
58 * NULL if it has been consumed.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
59 * For deleting elements *next is set to NULL by the user and
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
60 * av_tree_node_size() will set it to the AVTreeNode which was
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
61 * used for the removed element.
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
62 * 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
63 * 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
64 * 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
65 * 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
66 * 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
67 * 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
68 * }
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
69 * 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
70 * if(*next) av_freep(next);
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
71 * return av_tree_insert(rootp, key, cmp, next);
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
72 * }
150
michael
parents: 136
diff changeset
73 *
259
2498a8c0c832 spelling/grammar fixes for the Doxygen comments
diego
parents: 258
diff changeset
74 * @return If no insertion happened, the found element.
416
dee66b77779a Document node removial API.
michael
parents: 413
diff changeset
75 * If an insertion or removial 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
76 * 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
77 * should make no assumptions that it's one or the other in the code.
150
michael
parents: 136
diff changeset
78 */
413
a54e20281de9 Move *malloc() out of tree.c, that way the code can be used with
michael
parents: 392
diff changeset
79 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
80 void av_tree_destroy(struct AVTreeNode *t);
4ae092965c27 AVL tree
michael
parents:
diff changeset
81
392
d0f3bb6e367e Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 261
diff changeset
82 #endif /* FFMPEG_TREE_H */