Browse Source

[2218] Add DomainTree::largestNode() to return the largest node in tree-of-trees

There was an old version of this method, but that was buggy.
Mukund Sivaraman 12 years ago
parent
commit
055a835258

+ 25 - 0
src/lib/datasrc/memory/domaintree.h

@@ -1303,6 +1303,13 @@ public:
     const DomainTreeNode<T>*
     const DomainTreeNode<T>*
     previousNode(DomainTreeNodeChain<T>& node_path) const;
     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
     /// \brief Get the total number of nodes in the tree
     ///
     ///
     /// It includes nodes internally created as a result of adding a domain
     /// It includes nodes internally created as a result of adding a domain
@@ -1748,6 +1755,24 @@ DomainTree<T>::previousNode(DomainTreeNodeChain<T>& node_path) const {
 }
 }
 
 
 template <typename T>
 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
 typename DomainTree<T>::Result
 DomainTree<T>::insert(util::MemorySegment& mem_sgmt,
 DomainTree<T>::insert(util::MemorySegment& mem_sgmt,
                       const isc::dns::Name& target_name,
                       const isc::dns::Name& target_name,

+ 5 - 0
src/lib/datasrc/memory/tests/domaintree_unittest.cc

@@ -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) {
 TEST_F(DomainTreeTest, nextNodeError) {
     // Empty chain for nextNode() is invalid.
     // Empty chain for nextNode() is invalid.
     TestDomainTreeNodeChain chain;
     TestDomainTreeNodeChain chain;