| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * This file is part of Libav. | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * License along with Libav; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-27 14:41:03 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  |  * @file | 
					
						
							| 
									
										
										
										
											2007-02-27 14:41:03 +00:00
										 |  |  |  * A tree container. | 
					
						
							| 
									
										
										
										
											2009-01-28 23:03:17 +00:00
										 |  |  |  * Insertion, removal, finding equal, largest which is smaller than and | 
					
						
							|  |  |  |  * smallest which is larger than, all have O(log n) worst case complexity. | 
					
						
							| 
									
										
										
										
											2007-02-27 14:41:03 +00:00
										 |  |  |  * @author Michael Niedermayer <michaelni@gmx.at> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-31 07:39:47 +00:00
										 |  |  | #ifndef AVUTIL_TREE_H
 | 
					
						
							|  |  |  | #define AVUTIL_TREE_H
 | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct AVTreeNode; | 
					
						
							| 
									
										
										
										
											2008-01-04 17:52:16 +00:00
										 |  |  | extern const int av_tree_node_size; | 
					
						
							| 
									
										
										
										
											2006-11-30 12:00:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-06-30 15:38:06 +00:00
										 |  |  |  * Find an element. | 
					
						
							| 
									
										
										
										
											2006-11-30 12:00:29 +00:00
										 |  |  |  * @param root a pointer to the root node of the tree | 
					
						
							| 
									
										
										
										
											2009-01-28 23:03:17 +00:00
										 |  |  |  * @param next If next is not NULL, then next[0] will contain the previous | 
					
						
							|  |  |  |  *             element and next[1] the next element. If either does not exist, | 
					
						
							| 
									
										
										
										
											2007-02-27 00:16:39 +00:00
										 |  |  |  *             then the corresponding entry in next is unchanged. | 
					
						
							|  |  |  |  * @return An element with cmp(key, elem)==0 or NULL if no such element exists in | 
					
						
							|  |  |  |  *         the tree. | 
					
						
							| 
									
										
										
										
											2006-11-30 12:00:29 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *key, const void *b), void *next[2]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-06-30 15:38:06 +00:00
										 |  |  |  * Insert or remove an element. | 
					
						
							| 
									
										
										
										
											2009-01-28 23:03:17 +00:00
										 |  |  |  * If *next is NULL, then the supplied element will be removed if it exists. | 
					
						
							|  |  |  |  * If *next is not NULL, then the supplied element will be inserted, unless | 
					
						
							| 
									
										
										
										
											2008-01-04 18:46:53 +00:00
										 |  |  |  * it already exists in the tree. | 
					
						
							| 
									
										
										
										
											2009-01-28 23:03:17 +00:00
										 |  |  |  * @param rootp A pointer to a pointer to the root node of the tree; note that | 
					
						
							| 
									
										
										
										
											2007-02-27 00:16:39 +00:00
										 |  |  |  *              the root node can change during insertions, this is required | 
					
						
							|  |  |  |  *              to keep the tree balanced. | 
					
						
							| 
									
										
										
										
											2008-01-04 18:46:53 +00:00
										 |  |  |  * @param next Used to allocate and free AVTreeNodes. For insertion the user | 
					
						
							|  |  |  |  *             must set it to an allocated and zeroed object of at least | 
					
						
							|  |  |  |  *             av_tree_node_size bytes size. av_tree_insert() will set it to | 
					
						
							|  |  |  |  *             NULL if it has been consumed. | 
					
						
							|  |  |  |  *             For deleting elements *next is set to NULL by the user and | 
					
						
							|  |  |  |  *             av_tree_node_size() will set it to the AVTreeNode which was | 
					
						
							|  |  |  |  *             used for the removed element. | 
					
						
							|  |  |  |  *             This allows the use of flat arrays, which have | 
					
						
							| 
									
										
										
										
											2008-01-04 17:52:16 +00:00
										 |  |  |  *             lower overhead compared to many malloced elements. | 
					
						
							|  |  |  |  *             You might want to define a function like: | 
					
						
							| 
									
										
										
										
											2009-05-09 23:02:20 +00:00
										 |  |  |  *             @code | 
					
						
							| 
									
										
										
										
											2008-01-04 17:52:16 +00:00
										 |  |  |  *             void *tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), AVTreeNode **next){ | 
					
						
							|  |  |  |  *                 if(!*next) *next= av_mallocz(av_tree_node_size); | 
					
						
							|  |  |  |  *                 return av_tree_insert(rootp, key, cmp, next); | 
					
						
							|  |  |  |  *             } | 
					
						
							| 
									
										
										
										
											2008-01-04 18:46:53 +00:00
										 |  |  |  *             void *tree_remove(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b, AVTreeNode **next)){ | 
					
						
							| 
									
										
										
										
											2011-02-03 11:30:17 +01:00
										 |  |  |  *                 av_freep(next); | 
					
						
							| 
									
										
										
										
											2008-01-04 18:46:53 +00:00
										 |  |  |  *                 return av_tree_insert(rootp, key, cmp, next); | 
					
						
							|  |  |  |  *             } | 
					
						
							| 
									
										
										
										
											2009-05-09 23:02:20 +00:00
										 |  |  |  *             @endcode | 
					
						
							| 
									
										
										
										
											2009-01-28 23:03:17 +00:00
										 |  |  |  * @return If no insertion happened, the found element; if an insertion or | 
					
						
							| 
									
										
										
										
											2009-05-09 23:00:46 +00:00
										 |  |  |  *         removal happened, then either key or NULL will be returned. | 
					
						
							| 
									
										
										
										
											2007-02-27 14:41:03 +00:00
										 |  |  |  *         Which one it is depends on the tree state and the implementation. You | 
					
						
							|  |  |  |  *         should make no assumptions that it's one or the other in the code. | 
					
						
							| 
									
										
										
										
											2006-11-30 12:00:29 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-01-04 17:52:16 +00:00
										 |  |  | void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next); | 
					
						
							| 
									
										
										
										
											2006-11-14 01:02:30 +00:00
										 |  |  | void av_tree_destroy(struct AVTreeNode *t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-03 17:31:24 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-06-30 15:38:06 +00:00
										 |  |  |  * Apply enu(opaque, &elem) to all the elements in the tree in a given range. | 
					
						
							| 
									
										
										
										
											2010-03-03 17:31:24 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @param cmp a comparison function that returns < 0 for a element below the | 
					
						
							|  |  |  |  *            range, > 0 for a element above the range and == 0 for a | 
					
						
							|  |  |  |  *            element inside the range | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @note The cmp function should use the same ordering used to construct the | 
					
						
							|  |  |  |  *       tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void av_tree_enumerate(struct AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-31 07:39:47 +00:00
										 |  |  | #endif /* AVUTIL_TREE_H */
 |