]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
iputils.hh: NetmaskTree::TreeNode: Implement tree traversal methods.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 30 Sep 2019 08:30:25 +0000 (10:30 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 11 Feb 2020 01:49:36 +0000 (02:49 +0100)
pdns/iputils.hh

index 9a66e13b84a88ce18a4899fb78d1377d31660708..ce938c7b437640bd97a2575f7c8eb3497908b0a5 100644 (file)
@@ -761,6 +761,51 @@ private:
       return new_node;
     }
 
+    //<! Traverse left branch depth-first
+    TreeNode *traverse_l()
+    {
+      TreeNode *tnode = this;
+
+      while (tnode->left)
+        tnode = tnode->left.get();
+      return tnode;
+    }
+
+    //<! Traverse tree depth-first and in-order (L-N-R)
+    TreeNode *traverse_lnr()
+    {
+      TreeNode *tnode = this;
+
+      // precondition: descended left as deep as possible
+      if (tnode->right) {
+        // descend right
+        tnode = tnode->right.get();
+        // descend left as deep as possible and return next node
+        return tnode->traverse_l();
+      }
+
+      // ascend to parent
+      while (tnode->parent != nullptr) {
+        TreeNode *prev_child = tnode;
+        tnode = tnode->parent;
+
+        // return this node, but only when we come from the left child branch
+        if (tnode->left && tnode->left.get() == prev_child)
+          return tnode;
+      }
+      return nullptr;
+    }
+
+    //<! Traverse only assigned nodes
+    TreeNode *traverse_lnr_assigned()
+    {
+      TreeNode *tnode = traverse_lnr();
+
+      while (tnode != nullptr && !tnode->assigned)
+        tnode = tnode->traverse_lnr();
+      return tnode;
+    }
+
     unique_ptr<TreeNode> left;
     unique_ptr<TreeNode> right;
     TreeNode* parent;