00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #ifndef __NUSMV_CORE_UTILS_AVL_H__
00038
00044 #define __NUSMV_CORE_UTILS_AVL_H__
00045
00046 #if HAVE_CONFIG_H
00047 # include "nusmv-config.h"
00048 #endif
00049
00050 #include "cudd/util.h"
00051
00058 typedef struct avl_node_struct avl_node;
00059 struct avl_node_struct {
00060 avl_node *left, *right;
00061 char *key;
00062 char *value;
00063 int height;
00064 };
00065
00072 typedef struct avl_tree_struct avl_tree;
00073 struct avl_tree_struct {
00074 avl_node *root;
00075 int (*compar)(char*, char*);
00076 int num_entries;
00077 int modified;
00078 };
00079
00086 typedef struct avl_generator_struct avl_generator;
00087 struct avl_generator_struct {
00088 avl_tree *tree;
00089 avl_node **nodelist;
00090 int count;
00091 };
00092
00098 #define AVL_FORWARD 0
00099
00105 #define AVL_BACKWARD 1
00106
00112 avl_tree *avl_init_table(int (*compare)(char*, char*));
00113
00119 int avl_delete(avl_tree *, char **, char **);
00120
00126 int avl_insert(avl_tree *, char *, char *);
00127
00133 int avl_lookup(avl_tree *, char *, char **);
00134
00140 int avl_first(avl_tree *, char **, char **);
00141
00147 int avl_last(avl_tree *, char **, char **);
00148
00154 int avl_find_or_add(avl_tree *, char *, char ***);
00155
00161 int avl_count(avl_tree *);
00162
00168 int avl_numcmp(char *, char *);
00169
00175 int avl_gen(avl_generator *, char **, char **);
00176
00182 void avl_foreach(avl_tree *, void (*)(char*, char*), int);
00183
00189 void avl_free_table(avl_tree *, void (*)(char*), void (*)(char*));
00190
00196 void avl_free_gen(avl_generator *);
00197
00203 avl_generator *avl_init_gen(avl_tree *, int);
00204
00210 #define avl_is_member(tree, key) avl_lookup(tree, key, (char **) 0)
00211
00217 #define avl_foreach_item(table, gen, dir, key_p, value_p) \
00218 for(gen = avl_init_gen(table, dir); \
00219 avl_gen(gen, key_p, value_p) || (avl_free_gen(gen),0);)
00220
00221 #endif