FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
tree.h
Go to the documentation of this file.
1
/*
2
* copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
/**
22
* @file
23
* A tree container.
24
* @author Michael Niedermayer <michaelni@gmx.at>
25
*/
26
27
#ifndef AVUTIL_TREE_H
28
#define AVUTIL_TREE_H
29
30
#include "
attributes.h
"
31
#include "
version.h
"
32
33
/**
34
* @addtogroup lavu_tree AVTree
35
* @ingroup lavu_data
36
*
37
* Low complexity tree container
38
*
39
* Insertion, removal, finding equal, largest which is smaller than and
40
* smallest which is larger than, all have O(log n) worst case complexity.
41
* @{
42
*/
43
44
45
struct
AVTreeNode
;
46
extern
const
int
av_tree_node_size
;
47
48
/**
49
* Allocate an AVTreeNode.
50
*/
51
struct
AVTreeNode
*
av_tree_node_alloc
(
void
);
52
53
/**
54
* Find an element.
55
* @param root a pointer to the root node of the tree
56
* @param next If next is not NULL, then next[0] will contain the previous
57
* element and next[1] the next element. If either does not exist,
58
* then the corresponding entry in next is unchanged.
59
* @return An element with cmp(key, elem)==0 or NULL if no such element exists in
60
* the tree.
61
*/
62
void
*
av_tree_find
(
const
struct
AVTreeNode
*root,
void
*key,
int
(*
cmp
)(
void
*key,
const
void
*
b
),
void
*next[2]);
63
64
/**
65
* Insert or remove an element.
66
*
67
* If *next is NULL, then the supplied element will be removed if it exists.
68
* If *next is non-NULL, then the supplied element will be inserted, unless
69
* it already exists in the tree.
70
*
71
* @param rootp A pointer to a pointer to the root node of the tree; note that
72
* the root node can change during insertions, this is required
73
* to keep the tree balanced.
74
* @param key pointer to the element key to insert in the tree
75
* @param next Used to allocate and free AVTreeNodes. For insertion the user
76
* must set it to an allocated and zeroed object of at least
77
* av_tree_node_size bytes size. av_tree_insert() will set it to
78
* NULL if it has been consumed.
79
* For deleting elements *next is set to NULL by the user and
80
* av_tree_insert() will set it to the AVTreeNode which was
81
* used for the removed element.
82
* This allows the use of flat arrays, which have
83
* lower overhead compared to many malloced elements.
84
* You might want to define a function like:
85
* @code
86
* void *tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){
87
* if(!*next) *next= av_mallocz(av_tree_node_size);
88
* return av_tree_insert(rootp, key, cmp, next);
89
* }
90
* void *tree_remove(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b, AVTreeNode **next)){
91
* av_freep(next);
92
* return av_tree_insert(rootp, key, cmp, next);
93
* }
94
* @endcode
95
* @param cmp compare function used to compare elements in the tree
96
* @return If no insertion happened, the found element; if an insertion or
97
* removal happened, then either key or NULL will be returned.
98
* Which one it is depends on the tree state and the implementation. You
99
* should make no assumptions that it's one or the other in the code.
100
*/
101
void
*
av_tree_insert
(
struct
AVTreeNode
**rootp,
void
*key,
int
(*
cmp
)(
void
*key,
const
void
*
b
),
struct
AVTreeNode
**next);
102
void
av_tree_destroy
(
struct
AVTreeNode
*
t
);
103
104
/**
105
* Apply enu(opaque, &elem) to all the elements in the tree in a given range.
106
*
107
* @param cmp a comparison function that returns < 0 for a element below the
108
* range, > 0 for a element above the range and == 0 for a
109
* element inside the range
110
*
111
* @note The cmp function should use the same ordering used to construct the
112
* tree.
113
*/
114
void
av_tree_enumerate
(
struct
AVTreeNode
*
t
,
void
*opaque,
int
(*
cmp
)(
void
*opaque,
void
*
elem
),
int
(*enu)(
void
*opaque,
void
*elem));
115
116
/**
117
* @}
118
*/
119
120
#endif
/* AVUTIL_TREE_H */
Generated on Wed Jul 10 2013 23:48:16 for FFmpeg by
1.8.2