From: Mukund Sivaraman Date: Fri, 3 Aug 2012 14:17:50 +0000 (+0530) Subject: [2105] Add #2182 (deleteHelper changes) into DomainTree X-Git-Tag: trac2351_base~142 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2b062467de80d3fe2b3b255aed7f63a86ebd1d12;p=thirdparty%2Fkea.git [2105] Add #2182 (deleteHelper changes) into DomainTree --- diff --git a/src/lib/datasrc/memory/domaintree.h b/src/lib/datasrc/memory/domaintree.h index dae1b89e64..ad8f085324 100644 --- a/src/lib/datasrc/memory/domaintree.h +++ b/src/lib/datasrc/memory/domaintree.h @@ -1368,39 +1368,33 @@ DomainTree::~DomainTree() { template void DomainTree::deleteHelper(util::MemorySegment& mem_sgmt, - DomainTreeNode* root, - const DT& deleter) { - if (root == NULL) { - return; - } - - DomainTreeNode* node = root; - while (root->getLeft() != NULL || root->getRight() != NULL) { - DomainTreeNode* left(NULL); - DomainTreeNode* right(NULL); - while ((left = node->getLeft()) != NULL || - (right = node->getRight()) != NULL) { - node = (left != NULL) ? left : right; - } - - DomainTreeNode* parent = node->getParent(); - if (parent->getLeft() == node) { - parent->left_ = NULL; + DomainTreeNode* root, + const DT& deleter) { + while (root != NULL) { + // If there is a left, right or down node, walk into it and + // iterate. + if (root->getLeft() != NULL) { + DomainTreeNode* node = root; + root = root->getLeft(); + node->left_ = NULL; + } else if (root->getRight() != NULL) { + DomainTreeNode* node = root; + root = root->getRight(); + node->right_ = NULL; + } else if (root->getDown() != NULL) { + DomainTreeNode* node = root; + root = root->getDown(); + node->down_ = NULL; } else { - parent->right_ = NULL; + // There are no left, right or down nodes, so we can + // free this one and go back to its parent. + DomainTreeNode* node = root; + root = root->getParent(); + deleter(mem_sgmt, node->data_); + DomainTreeNode::destroy(mem_sgmt, node); + --node_count_; } - - deleteHelper(mem_sgmt, node->getDown(), deleter); - deleter(mem_sgmt, node->data_); - DomainTreeNode::destroy(mem_sgmt, node); - --node_count_; - node = parent; } - - deleteHelper(mem_sgmt, root->getDown(), deleter); - deleter(mem_sgmt, root->data_); - DomainTreeNode::destroy(mem_sgmt, root); - --node_count_; } template