Browse Source

remove c style type conversion

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac397@3562 e5f2f494-b856-4b98-b285-d166d9295462
Han Feng 14 years ago
parent
commit
4137d05fa7
1 changed files with 28 additions and 35 deletions
  1. 28 35
      src/bin/auth/rbt_datasrc.h

+ 28 - 35
src/bin/auth/rbt_datasrc.h

@@ -281,12 +281,11 @@ private:
     //@{
     /// Each public function has related recursive helper function
     void eraseNode(RBNode<T>* node);
-    FindResult findHelper(const Name& name, RBTree<T>** tree,
+    FindResult findHelper(const Name& name, const RBTree<T>** tree,
                           RBNode<T>** node) const;
     int getNodeCountHelper(const RBNode<T>* node) const;
     int getNameCountHelper(const RBNode<T>* node) const;
-    void printTreeHelper(RBNode<T>* node, int depth) const;
-    void mergeWithUpNode();
+    void printTreeHelper(const RBNode<T>* node, int depth) const;
     //@}
 
     RBNode<T>*  root_;
@@ -358,13 +357,13 @@ RBTree<T>::~RBTree() {
 template <typename T>
 typename RBTree<T>::FindResult
 RBTree<T>::find(const Name& name, RBNode<T>** node) const {
-    RBTree<T>* tree;
+    const RBTree<T>* tree;
     return (findHelper(name, &tree, node));
 }
 
 template <typename T>
 typename RBTree<T>::FindResult
-RBTree<T>::findHelper(const Name& name, RBTree<T>** tree, RBNode<T>** ret) const {
+RBTree<T>::findHelper(const Name& name, const RBTree<T>** tree, RBNode<T>** ret) const {
     RBNode<T>* node = root_;
     while (node != NULLNODE) {
         NameComparisonResult compare_result = name.compare(node->name_);
@@ -374,7 +373,7 @@ RBTree<T>::findHelper(const Name& name, RBTree<T>** tree, RBNode<T>** ret) const
             if (node->is_shadow_) {
                 return (RBTree<T>::NOTFOUND);
             } else {
-                *tree = (RBTree*)this;
+                *tree = this;
                 *ret = node;
                 return (RBTree<T>::EXACTMATCH);
             }
@@ -399,7 +398,7 @@ RBTree<T>::findHelper(const Name& name, RBTree<T>** tree, RBNode<T>** ret) const
                     // if not found in sub domain tree, so current node is the longest match
                     // otherwise return the result in sub domin tree
                     if (RBTree<T>::NOTFOUND == result) {
-                        *tree = (RBTree *)this;
+                        *tree = this;
                         *ret = node;
                         return RBTree<T>::PARTIALMATCH;
                     } else {
@@ -445,12 +444,12 @@ RBTree<T>::getNameCount() const {
 template <typename T>
 int
 RBTree<T>::getNameCountHelper(const RBNode<T> *node) const {
-    if (NULLNODE == node || node->is_shadow_) {
+    if (NULLNODE == node) {
         return (0);
     }
 
     int sub_tree_name_count = node->down_ ? node->down_->getNameCount() : 0;
-    return (1 + sub_tree_name_count + getNameCountHelper(node->left_) +
+    return ((node->is_shadow_ ? 0 : 1) + sub_tree_name_count + getNameCountHelper(node->left_) +
             getNameCountHelper(node->right_));
 }
 
@@ -685,8 +684,8 @@ template <typename T>
 int
 RBTree<T>::erase(const Name& name) {
     RBNode<T>* node;
-    RBTree<T>* tree;
-    if (findHelper(name, &tree, &node) != RBTree<T>::EXACTMATCH) {
+    const RBTree<T>* ctree;
+    if (findHelper(name, &ctree, &node) != RBTree<T>::EXACTMATCH) {
         return (1);
     }
 
@@ -697,34 +696,28 @@ RBTree<T>::erase(const Name& name) {
         return (0);
     }
 
+    RBTree<T> *tree = const_cast<RBTree<T> *>(ctree);
     tree->eraseNode(node);
-    tree->mergeWithUpNode();
-    return 0;
-}
 
-template <typename T>
-void
-RBTree<T>::mergeWithUpNode()
-{
-    if (NULL == up_)
-        return;
-    // merge down to up
-    if (node_count_ == 1 && up_->is_shadow_) {
-        RBNode<T>* up = up_;
-        Name merged_name = root_->name_.concatenate(up->name_);
-        root_->cloneDNSData(*up);
-        up->setDownTree(root_->down_);
-        root_->setDownTree(NULL);
-        up->name_ = merged_name;
-        up->is_shadow_ = false;
-        delete this;
-    } else if (node_count_ == 0) { // delete empty tree
-        up_->setDownTree(NULL);
-        delete this;
+    if (NULL != tree->up_) {
+        // merge down to up
+        if (1 == tree->node_count_ && tree->up_->is_shadow_) {
+            RBNode<T>* up = tree->up_;
+            Name merged_name = tree->root_->name_.concatenate(up->name_);
+            tree->root_->cloneDNSData(*up);
+            up->setDownTree(tree->root_->down_);
+            tree->root_->setDownTree(NULL);
+            up->name_ = merged_name;
+            up->is_shadow_ = false;
+            delete tree;
+        } else if (0 == tree->node_count_) { // delete empty tree
+            tree->up_->setDownTree(NULL);
+            delete tree;
+        }
     }
+    return 0;
 }
 
-
 template <typename T>
 void
 RBTree<T>::eraseNode(RBNode<T> *node) {
@@ -850,7 +843,7 @@ RBTree<T>::printTree(int depth) const {
 
 template <typename T>
 void
-RBTree<T>::printTreeHelper(RBNode<T>* node, int depth) const {
+RBTree<T>::printTreeHelper(const RBNode<T>* node, int depth) const {
     INDNET(depth);
     std::cout << node->name_.toText() << " ("
               << ((node->color_ == BLACK) ? "black" : "red") << ")\n";