rb_free.c

Go to the documentation of this file.
00001 /*                       R B _ F R E E . C
00002  * BRL-CAD
00003  *
00004  * Copyright (c) 1998-2006 United States Government as represented by
00005  * the U.S. Army Research Laboratory.
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public License
00009  * as published by the Free Software Foundation; either version 2 of
00010  * the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Library General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this file; see the file named COPYING for more
00019  * information.
00020  */
00021 
00022 /** \addtogroup rb */
00023 /*@{*/
00024 /** @file rb_free.c
00025  *              Routine to free a red-black tree
00026  *
00027  * @author
00028  *      Paul J. Tanenbaum
00029  *
00030  * @par Source -
00031  *      The U. S. Army Research Laboratory
00032  *@n    Aberdeen Proving Ground, Maryland  21005-5068  USA
00033  */
00034 /*@}*/
00035 
00036 #ifndef lint
00037 static const char libbu_rb_free_RCSid[] = "@(#) $Header: /cvsroot/brlcad/brlcad/src/libbu/rb_free.c,v 14.12 2006/08/31 23:16:38 lbutler Exp $";
00038 #endif
00039 
00040 #include "common.h"
00041 
00042 
00043 
00044 #include <stdio.h>
00045 #include <math.h>
00046 #include "machine.h"
00047 #include "bu.h"
00048 #include "./rb_internals.h"
00049 
00050 /**                     B U _ R B _ F R E E ( )
00051  *
00052  *                    Free a red-black tree
00053  *
00054  *      This function has two parameters: the tree to free and a function
00055  *      to handle the application data.  bu_rb_free() traverses tree's lists
00056  *      of nodes and packages, freeing each one in turn, and then frees tree
00057  *      itself.  If free_data is non-NULL, then bu_rb_free() calls it just
00058  *      before freeing each package , passing it the package's rbp_data
00059  *      member.  Otherwise, the application data is left untouched.
00060  */
00061 void bu_rb_free (bu_rb_tree *tree, void (*free_data) (/* ??? */))
00062 {
00063     struct bu_rb_list           *rblp;
00064     struct bu_rb_node           *node;
00065     struct bu_rb_package        *package;
00066 
00067     BU_CKMAG(tree, BU_RB_TREE_MAGIC, "red-black tree");
00068 
00069     /*
00070      *  Free all the nodes
00071      */
00072     while (BU_LIST_WHILE(rblp, bu_rb_list, &(tree -> rbt_nodes.l)))
00073     {
00074         BU_CKMAG(rblp, BU_RB_LIST_MAGIC, "red-black list element");
00075         bu_rb_free_node(rblp -> rbl_node);
00076     }
00077 
00078     /*
00079      *  Free all the packages
00080      */
00081     while (BU_LIST_WHILE(rblp, bu_rb_list, &(tree -> rbt_packages.l)))
00082     {
00083         BU_CKMAG(rblp, BU_RB_LIST_MAGIC, "red-black list element");
00084         package = rblp -> rbl_package;
00085         BU_CKMAG(package, BU_RB_PKG_MAGIC, "red-black package");
00086         if (free_data)
00087             (*free_data)(package -> rbp_data);
00088         bu_rb_free_package(package);
00089     }
00090 
00091     /*
00092      *  Free the tree's NIL sentinel
00093      */
00094     node = tree -> rbt_empty_node;
00095     bu_free((genptr_t) node -> rbn_left, "red-black left children");
00096     bu_free((genptr_t) node -> rbn_right, "red-black right children");
00097     bu_free((genptr_t) node -> rbn_parent, "red-black parents");
00098     bu_free((genptr_t) node -> rbn_color, "red-black colors");
00099     bu_free((genptr_t) node -> rbn_package, "red-black packages");
00100     bu_free((genptr_t) node, "red-black empty node");
00101 
00102     /*
00103      *  Free the tree itself
00104      */
00105     bu_free((genptr_t) tree -> rbt_root, "red-black roots");
00106     bu_free((genptr_t) tree -> rbt_unique, "red-black uniqueness flags");
00107     bu_free((genptr_t) tree, "red-black tree");
00108 }
00109 
00110 /**                 B U _ R B _ F R E E _ N O D E ( )
00111  *
00112  *          Relinquish memory occupied by a red-black node
00113  *
00114  *      This function has one parameter: a node to free.  bu_rb_free_node()
00115  *      frees the memory allocated for the various members of the node
00116  *      and then frees the memory allocated for the node itself.
00117  */
00118 void bu_rb_free_node (struct bu_rb_node *node)
00119 {
00120     bu_rb_tree  *tree;
00121 
00122     BU_CKMAG(node, BU_RB_NODE_MAGIC, "red-black node");
00123 
00124     tree = node -> rbn_tree;
00125     if (bu_rb_current(tree) == node)
00126         bu_rb_current(tree) = bu_rb_null(tree);
00127     BU_CKMAG(node, BU_RB_NODE_MAGIC, "red-black node");
00128 
00129     /*
00130      *  Remove node from the list of all nodes
00131      */
00132     BU_CKMAG(node -> rbn_list_pos, BU_RB_LIST_MAGIC, "red-black list element");
00133     BU_LIST_DEQUEUE(&(node -> rbn_list_pos -> l));
00134 
00135     bu_free((genptr_t) node -> rbn_parent, "red-black parents");
00136     bu_free((genptr_t) node -> rbn_left, "red-black left children");
00137     bu_free((genptr_t) node -> rbn_right, "red-black right children");
00138     bu_free((genptr_t) node -> rbn_color, "red-black colors");
00139     bu_free((genptr_t) node -> rbn_package, "red-black packages");
00140     bu_free((genptr_t) node -> rbn_list_pos, "red-black list element");
00141     bu_free((genptr_t) node, "red-black node");
00142 }
00143 
00144 /**                 B U _ R B _ F R E E _ P A C K A G E ( )
00145  *
00146  *          Relinquish memory occupied by a red-black package
00147  *
00148  *      This function has one parameter: a package to free.
00149  *      bu_rb_free_package() frees the memory allocated to point to the
00150  *      nodes that contained the package and then frees the memory
00151  *      allocated for the package itself.
00152  */
00153 void bu_rb_free_package (struct bu_rb_package *package)
00154 {
00155     BU_CKMAG(package, BU_RB_PKG_MAGIC, "red-black package");
00156 
00157     /*
00158      *  Remove node from the list of all packages
00159      */
00160     BU_CKMAG(package -> rbp_list_pos, BU_RB_LIST_MAGIC,
00161         "red-black list element");
00162     BU_LIST_DEQUEUE(&(package -> rbp_list_pos -> l));
00163 
00164     bu_free((genptr_t) package -> rbp_node, "red-black package nodes");
00165     bu_free((genptr_t) package -> rbp_list_pos, "red-black list element");
00166     bu_free((genptr_t) package, "red-black package");
00167 }
00168 /*@}*/
00169 /*
00170  * Local Variables:
00171  * mode: C
00172  * tab-width: 8
00173  * c-basic-offset: 4
00174  * indent-tabs-mode: t
00175  * End:
00176  * ex: shiftwidth=4 tabstop=8
00177  */

Generated on Mon Sep 18 01:24:48 2006 for BRL-CAD by  doxygen 1.4.6