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