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
00035
00036
00037
00038 #include "compat4.h"
00039
00040 #ifndef SEEN_BU_H
00041 #include "bu.h"
00042 #endif
00043
00044 #ifndef BU_RB_INTERNALS_H
00045 #define BU_RB_INTERNALS_H seen
00046
00047
00048
00049
00050
00051
00052
00053
00054 #define BU_RB_CKMAG BU_CKMAG
00055 #define BU_RB_NODE_MAGIC 0x72626e6f
00056 #define BU_RB_PKG_MAGIC 0x7262706b
00057 #define BU_RB_LIST_MAGIC 0x72626c73
00058
00059
00060
00061
00062
00063
00064 #define BU_RB_CKORDER(t, o) \
00065 if (((o) < 0) || ((o) >= (t) -> rbt_nm_orders)) \
00066 { \
00067 bu_log( \
00068 "Error: Order %d outside 0..%d (nm_orders-1), file %s, line %d\n", \
00069 (o), (t) -> rbt_nm_orders - 1, __FILE__, __LINE__); \
00070 exit (0); \
00071 }
00072
00073
00074
00075
00076 #define bu_rb_order_func(t, o) (((t) -> rbt_order)[o])
00077 #define bu_rb_print(t, p) (((t) -> rbt_print)((p) -> rbp_data))
00078 #define bu_rb_root(t, o) (((t) -> rbt_root)[o])
00079 #define bu_rb_current(t) ((t) -> rbt_current)
00080 #define bu_rb_null(t) ((t) -> rbt_empty_node)
00081 #define bu_rb_get_uniqueness(t, o) \
00082 ( \
00083 (((t) -> rbt_unique)[(o)/8] & (0x1 << ((o) % 8))) ? 1 : 0 \
00084 )
00085 #define bu_rb_set_uniqueness(t, o, u) \
00086 { \
00087 int _b = (o) / 8; \
00088 int _p = (o) - _b * 8; \
00089 \
00090 ((t) -> rbt_unique)[_b] &= ~(0x1 << _p); \
00091 ((t) -> rbt_unique)[_b] |= (u) << _p; \
00092 }
00093
00094
00095
00096
00097 #define bu_rb_parent(n, o) (((n) -> rbn_parent)[o])
00098 #define bu_rb_left_child(n, o) (((n) -> rbn_left)[o])
00099 #define bu_rb_right_child(n, o) (((n) -> rbn_right)[o])
00100 #define BU_RB_LEFT 0
00101 #define BU_RB_RIGHT 1
00102 #define bu_rb_child(n, o, d) (((d) == BU_RB_LEFT) ? \
00103 bu_rb_left_child((n), (o)) : \
00104 bu_rb_right_child((n), (o)))
00105 #define bu_rb_other_child(n, o, d) (((d) == BU_RB_LEFT) ? \
00106 bu_rb_right_child((n), (o)) : \
00107 bu_rb_left_child((n), (o)))
00108 #define bu_rb_size(n, o) (((n) -> rbn_size)[o])
00109 #define bu_rb_get_color(n, o) \
00110 ( \
00111 (((n) -> rbn_color)[(o)/8] & (0x1 << ((o) % 8))) ? 1 : 0 \
00112 )
00113 #define bu_rb_set_color(n, o, c) \
00114 { \
00115 int _b = (o) / 8; \
00116 int _p = (o) - _b * 8; \
00117 \
00118 ((n) -> rbn_color)[_b] &= ~(0x1 << _p); \
00119 ((n) -> rbn_color)[_b] |= (c) << _p; \
00120 }
00121 #define BU_RB_RED 0
00122 #define BU_RB_BLACK 1
00123 #define bu_rb_data(n, o) (((n) -> rbn_package)[o] -> rbp_data)
00124
00125
00126
00127
00128
00129 #define WALK_NODES 0
00130 #define WALK_DATA 1
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 #define bu_rb_rotate(n, o, d) (((d) == BU_RB_LEFT) ? \
00142 _rb_rot_left((n), (o)) : \
00143 _rb_rot_right((n), (o)))
00144 #define bu_rb_other_rotate(n, o, d) (((d) == BU_RB_LEFT) ? \
00145 _rb_rot_right((n), (o)) : \
00146 _rb_rot_left((n), (o)))
00147
00148
00149
00150
00151 BU_EXTERN(struct bu_rb_node *_rb_neighbor, (struct bu_rb_node *node,
00152 int order,
00153 int sense
00154 ));
00155 BU_EXTERN(void _rb_rot_left, (struct bu_rb_node *x,
00156 int order
00157 ));
00158 BU_EXTERN(void _rb_rot_right, (struct bu_rb_node *y,
00159 int order
00160 ));
00161 BU_EXTERN(void _rb_walk, (bu_rb_tree *tree,
00162 int order,
00163 void (*visit)(),
00164 int what_to_visit,
00165 int trav_type
00166 ));
00167 BU_EXTERN(void bu_rb_free_node, (struct bu_rb_node *node));
00168 BU_EXTERN(void bu_rb_free_package, (struct bu_rb_package *package));
00169
00170 #endif
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181