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
00029
00030
00031
00032
00033
00034 #include "bu.h"
00035 #if 0
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 struct rb_list
00048 {
00049 struct bu_list l;
00050 union
00051 {
00052 struct rb_node *rbl_n;
00053 struct rb_package *rbl_p;
00054 } rbl_u;
00055 };
00056 #define rbl_magic l.magic
00057 #define rbl_node rbl_u.rbl_n
00058 #define rbl_package rbl_u.rbl_p
00059 #define RB_LIST_NULL ((struct rb_list *) 0)
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 typedef struct
00080 {
00081
00082 long rbt_magic;
00083 int rbt_nm_nodes;
00084
00085 void (*rbt_print)();
00086 int rbt_debug;
00087 char *rbt_description;
00088
00089 int rbt_nm_orders;
00090 int (**rbt_order)();
00091 struct rb_node **rbt_root;
00092 char *rbt_unique;
00093 struct rb_node *rbt_current;
00094 struct rb_list rbt_nodes;
00095 struct rb_list rbt_packages;
00096 struct rb_node *rbt_empty_node;
00097 } rb_tree;
00098 #define RB_TREE_NULL ((rb_tree *) 0)
00099 #define RB_TREE_MAGIC 0x72627472
00100
00101
00102
00103
00104 #define RB_DEBUG_INSERT 0x00000001
00105 #define RB_DEBUG_UNIQ 0x00000002
00106 #define RB_DEBUG_ROTATE 0x00000004
00107 #define RB_DEBUG_OS 0x00000008
00108 #define RB_DEBUG_DELETE 0x00000010
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 struct rb_package
00124 {
00125 long rbp_magic;
00126 struct rb_node **rbp_node;
00127 struct rb_list *rbp_list_pos;
00128 void *rbp_data;
00129 };
00130 #define RB_PKG_NULL ((struct rb_package *) 0)
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 struct rb_node
00143 {
00144 long rbn_magic;
00145 rb_tree *rbn_tree;
00146 struct rb_node **rbn_parent;
00147 struct rb_node **rbn_left;
00148 struct rb_node **rbn_right;
00149 char *rbn_color;
00150 int *rbn_size;
00151 struct rb_package **rbn_package;
00152 int rbn_pkg_refs;
00153 struct rb_list *rbn_list_pos;
00154 };
00155 #define RB_NODE_NULL ((struct rb_node *) 0)
00156
00157
00158
00159
00160 #define SENSE_MIN 0
00161 #define SENSE_MAX 1
00162 #define rb_min(t,o) rb_extreme((t), (o), SENSE_MIN)
00163 #define rb_max(t,o) rb_extreme((t), (o), SENSE_MAX)
00164 #define rb_pred(t,o) rb_neighbor((t), (o), SENSE_MIN)
00165 #define rb_succ(t,o) rb_neighbor((t), (o), SENSE_MAX)
00166
00167
00168
00169
00170 #define PREORDER 0
00171 #define INORDER 1
00172 #define POSTORDER 2
00173
00174
00175
00176
00177 BU_EXTERN(rb_tree *rb_create, (char *description,
00178 int nm_orders,
00179 int (**order_funcs)()
00180 ));
00181 BU_EXTERN(rb_tree *rb_create1, (char *description,
00182 int (*order_func)()
00183 ));
00184 BU_EXTERN(void *rb_curr, (rb_tree *tree,
00185 int order
00186 ));
00187 #define rb_curr1(t) rb_curr((t), 0)
00188 BU_EXTERN(void rb_delete, (rb_tree *tree,
00189 int order
00190 ));
00191 #define rb_delete1(t) rb_delete((t), 0)
00192 BU_EXTERN(void rb_diagnose_tree,(rb_tree *tree,
00193 int order,
00194 int trav_type
00195 ));
00196 BU_EXTERN(void *rb_extreme, (rb_tree *tree,
00197 int order,
00198 int sense
00199 ));
00200 BU_EXTERN(void rb_free, (rb_tree *tree,
00201 void (*free_data)()
00202 ));
00203 #define RB_RETAIN_DATA ((void (*)()) 0)
00204 #define rb_free1(t,f) \
00205 { \
00206 RB_CKMAG((t), RB_TREE_MAGIC, "red-black tree"); \
00207 bu_free((char *) ((t) -> rbt_order), \
00208 "red-black order function"); \
00209 rb_free(t,f); \
00210 }
00211 BU_EXTERN(void *rb_select, (rb_tree *tree,
00212 int order,
00213 int k
00214 ));
00215 #define rb_select1(t,k) rb_select((t), 0, (k))
00216 BU_EXTERN(int rb_insert, (rb_tree *tree,
00217 void *data
00218 ));
00219 BU_EXTERN(int rb_is_uniq, (rb_tree *tree,
00220 int order
00221 ));
00222 #define rb_is_uniq1(t) rb_is_uniq((t), 0)
00223 BU_EXTERN(void *rb_neighbor, (rb_tree *tree,
00224 int order,
00225 int sense
00226 ));
00227 BU_EXTERN(int rb_rank, (rb_tree *tree,
00228 int order
00229 ));
00230 #define rb_rank1(t) rb_rank1((t), 0)
00231 BU_EXTERN(void *rb_search, (rb_tree *tree,
00232 int order,
00233 void *data
00234 ));
00235 #define rb_search1(t,d) rb_search((t), 0, (d))
00236 BU_EXTERN(void rb_set_uniqv, (rb_tree *tree,
00237 bitv_t vec
00238 ));
00239 BU_EXTERN(void rb_summarize_tree,(rb_tree *tree
00240 ));
00241 BU_EXTERN(void rb_uniq_all_off, (rb_tree *tree
00242 ));
00243 BU_EXTERN(void rb_uniq_all_on, (rb_tree *tree
00244 ));
00245 BU_EXTERN(int rb_uniq_off, (rb_tree *tree,
00246 int order
00247 ));
00248 #define rb_uniq_off1(t) rb_uniq_off((t), 0)
00249 BU_EXTERN(int rb_uniq_on, (rb_tree *tree,
00250 int order
00251 ));
00252 #define rb_uniq_on1(t) rb_uniq_on((t), 0)
00253 BU_EXTERN(void rb_walk, (rb_tree *tree,
00254 int order,
00255 void (*visit)(),
00256 int trav_type
00257 ));
00258 #define rb_walk1(t,v,d) rb_walk((t), 0, (v), (d))
00259
00260 #endif
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271