]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2218] Add DomainTree::largestNode() to return the largest node in tree-of-trees
authorMukund Sivaraman <muks@isc.org>
Mon, 24 Sep 2012 05:05:09 +0000 (10:35 +0530)
committerMukund Sivaraman <muks@isc.org>
Mon, 24 Sep 2012 05:05:09 +0000 (10:35 +0530)
There was an old version of this method, but that was buggy.

src/lib/datasrc/memory/domaintree.h
src/lib/datasrc/memory/tests/domaintree_unittest.cc

index 9087a95982ccb376f5ee2cbeaa6263607a9400f6..aa37006129d083e54bd722a28af7088c92483ecf 100644 (file)
@@ -1303,6 +1303,13 @@ public:
     const DomainTreeNode<T>*
     previousNode(DomainTreeNodeChain<T>& node_path) const;
 
+    /// \brief return the largest node in the tree of trees.
+    ///
+    /// \return A \c DomainTreeNode that is the largest node in the
+    /// tree. If there are no nodes, then \c NULL is returned.
+    const DomainTreeNode<T>*
+    largestNode() const;
+
     /// \brief Get the total number of nodes in the tree
     ///
     /// It includes nodes internally created as a result of adding a domain
@@ -1747,6 +1754,24 @@ DomainTree<T>::previousNode(DomainTreeNodeChain<T>& node_path) const {
     return (node);
 }
 
+template <typename T>
+const DomainTreeNode<T>*
+DomainTree<T>::largestNode() const {
+    const DomainTreeNode<T>* node = root_.get();
+    while (node != NULL) {
+        // We go right first, then down.
+        if (node->getRight() != NULL) {
+            node = node->getRight();
+        } else if (node->getDown() != NULL) {
+            node = node->getDown();
+        } else {
+           break;
+       }
+    }
+
+    return (node);
+}
+
 template <typename T>
 typename DomainTree<T>::Result
 DomainTree<T>::insert(util::MemorySegment& mem_sgmt,
index b26c9b5813f0699847c86a0782a27efc8fbb55cc..07932069bf1f583a570472c68e1fe47cef6cc5b5 100644 (file)
@@ -1005,6 +1005,11 @@ TEST_F(DomainTreeTest, previousNode) {
     }
 }
 
+TEST_F(DomainTreeTest, largestNode) {
+    cdtnode = dtree.largestNode();
+    EXPECT_EQ(Name("k"), cdtnode->getName());
+}
+
 TEST_F(DomainTreeTest, nextNodeError) {
     // Empty chain for nextNode() is invalid.
     TestDomainTreeNodeChain chain;