File: avl-util.h

package info (click to toggle)
setools 2.0-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 14,112 kB
  • ctags: 10,502
  • sloc: ansic: 76,267; tcl: 27,222; yacc: 2,943; makefile: 993; sh: 504; lex: 244
file content (54 lines) | stat: -rw-r--r-- 1,548 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/* Copyright (C) 2001-2003 Tresys Technology, LLC
 * see file 'COPYING' for use and warranty information */

/* 
 * Authors: mayerf@tresys.com and Karl MacMillan <kmacmillan@tresys.com>
 */

/* avl-util.h
 *
 * Generic avl trees. This data structure is an efficient way
 * to map keys to array indexes. The user of this interface
 * provides 3 callback functions and stores all of the data: the
 * avl trees simply provide a fast way to find a specific item
 * in an array.
 */


#ifndef _APOLICY_AVL_UTIL_H_
#define _APOLICY_AVL_UTIL_H_

typedef int(*avl_compare_t)(void *user_data, const void *a, int idx);
typedef int(*avl_grow_t)(void *user_data, int sz);
typedef int(*avl_add_t)(void *user_data, const void *key, int idx);

/* AVL tree structures */
typedef struct avl_pointers {
	int	left;
	int	right;
	int	height;
} avl_ptrs_t;

typedef struct avl_tree{
	int head;		/* array idx into assoicated list */
	int ptrs_len;		/* len of the ptrs array */
	avl_ptrs_t *ptrs;	/* dynamic array to mirror the assoicated list */
	void *user_data;	/* data passed to the callbacks */
	avl_compare_t compare;  /* callback to compare two keys */
	avl_grow_t grow;	/* callback to request more space */
	avl_add_t add;		/* callback to store a new value */
} avl_tree_t;

int avl_get_idx(const void *key, avl_tree_t *tree);
int avl_init(avl_tree_t *tree, void *user_data, avl_compare_t compare, avl_grow_t grow, avl_add_t add);
void avl_free(avl_tree_t *tree);
int avl_insert(avl_tree_t *tree, void *key, int *newidx);

#endif /* _APOLICY_AVL_UTIL_H_ */