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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #ifndef lint
00058 static const char libbu_rb_walk_RCSid[] = "@(#) $Header: /cvsroot/brlcad/brlcad/src/libbu/rb_walk.c,v 14.12 2006/08/31 23:16:39 lbutler Exp $";
00059 #endif
00060
00061 #include "common.h"
00062
00063 #include <stdlib.h>
00064 #include <stdio.h>
00065 #include <math.h>
00066
00067 #include "machine.h"
00068 #include "rtlist.h"
00069 #include "bu.h"
00070 #include "compat4.h"
00071 #include "./rb_internals.h"
00072
00073
00074
00075
00076
00077
00078 static void prewalknodes (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00079 {
00080 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00081 BU_RB_CKORDER(root -> rbn_tree, order);
00082
00083 if (root == bu_rb_null(root -> rbn_tree))
00084 return;
00085 visit(root, depth);
00086 prewalknodes (bu_rb_left_child(root, order), order, visit, depth + 1);
00087 prewalknodes (bu_rb_right_child(root, order), order, visit, depth + 1);
00088 }
00089
00090
00091
00092
00093
00094 static void inwalknodes (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00095 {
00096 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00097 BU_RB_CKORDER(root -> rbn_tree, order);
00098
00099 if (root == bu_rb_null(root -> rbn_tree))
00100 return;
00101 inwalknodes (bu_rb_left_child(root, order), order, visit, depth + 1);
00102 visit(root, depth);
00103 inwalknodes (bu_rb_right_child(root, order), order, visit, depth + 1);
00104 }
00105
00106
00107
00108
00109
00110 static void postwalknodes (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00111 {
00112 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00113 BU_RB_CKORDER(root -> rbn_tree, order);
00114
00115 if (root == bu_rb_null(root -> rbn_tree))
00116 return;
00117 postwalknodes (bu_rb_left_child(root, order), order, visit, depth + 1);
00118 postwalknodes (bu_rb_right_child(root, order), order, visit, depth + 1);
00119 visit(root, depth);
00120 }
00121
00122
00123
00124
00125
00126 static void prewalkdata (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00127 {
00128 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00129 BU_RB_CKORDER(root -> rbn_tree, order);
00130
00131 if (root == bu_rb_null(root -> rbn_tree))
00132 return;
00133 visit(bu_rb_data(root, order), depth);
00134 prewalkdata (bu_rb_left_child(root, order), order, visit, depth + 1);
00135 prewalkdata (bu_rb_right_child(root, order), order, visit, depth + 1);
00136 }
00137
00138
00139
00140
00141
00142 static void inwalkdata (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00143 {
00144 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00145 BU_RB_CKORDER(root -> rbn_tree, order);
00146
00147 if (root == bu_rb_null(root -> rbn_tree))
00148 return;
00149 inwalkdata (bu_rb_left_child(root, order), order, visit, depth + 1);
00150 visit(bu_rb_data(root, order), depth);
00151 inwalkdata (bu_rb_right_child(root, order), order, visit, depth + 1);
00152 }
00153
00154
00155
00156
00157
00158 static void postwalkdata (struct bu_rb_node *root, int order, void (*visit) (), int depth)
00159 {
00160 BU_CKMAG(root, BU_RB_NODE_MAGIC, "red-black node");
00161 BU_RB_CKORDER(root -> rbn_tree, order);
00162
00163 if (root == bu_rb_null(root -> rbn_tree))
00164 return;
00165 postwalkdata (bu_rb_left_child(root, order), order, visit, depth + 1);
00166 postwalkdata (bu_rb_right_child(root, order), order, visit, depth + 1);
00167 visit(bu_rb_data(root, order), depth);
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 void _rb_walk (bu_rb_tree *tree, int order, void (*visit) (), int what_to_visit, int trav_type)
00184 {
00185 static void (*walk[][3])() =
00186 {
00187 { prewalknodes, inwalknodes, postwalknodes },
00188 { prewalkdata, inwalkdata, postwalkdata }
00189 };
00190
00191 BU_CKMAG(tree, BU_RB_TREE_MAGIC, "red-black tree");
00192 BU_RB_CKORDER(tree, order);
00193 switch (trav_type)
00194 {
00195 case PREORDER:
00196 case INORDER:
00197 case POSTORDER:
00198 switch (what_to_visit)
00199 {
00200 case WALK_NODES:
00201 case WALK_DATA:
00202 (*walk[what_to_visit][trav_type])
00203 (bu_rb_root(tree, order), order, visit, 0);
00204 break;
00205 default:
00206 bu_log("FATAL: _rb_walk(): Illegal visitation object: %d\n",
00207 what_to_visit);
00208 bu_bomb("");
00209 }
00210 break;
00211 default:
00212 bu_log("FATAL: _rb_walk(): Illegal traversal type: %d\n",
00213 trav_type);
00214 bu_bomb("");
00215 }
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 void bu_rb_walk (bu_rb_tree *tree, int order, void (*visit) (), int trav_type)
00228 {
00229 BU_CKMAG(tree, BU_RB_TREE_MAGIC, "red-black tree");
00230 BU_RB_CKORDER(tree, order);
00231
00232 _rb_walk(tree, order, visit, WALK_DATA, trav_type);
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244