]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2750] Add non-const variant of largestNode()
authorMukund Sivaraman <muks@isc.org>
Mon, 26 Aug 2013 02:07:40 +0000 (07:37 +0530)
committerMukund Sivaraman <muks@isc.org>
Mon, 26 Aug 2013 02:10:13 +0000 (07:40 +0530)
src/lib/datasrc/memory/domaintree.h

index 9bcacd30e48f587477477b57a4928e6182c18bcc..ffba88cf7f136eadfcb7ca9048bf55547b59ac25 100644 (file)
@@ -1412,12 +1412,24 @@ public:
     const DomainTreeNode<T>*
     previousNode(DomainTreeNodeChain<T>& node_path) const;
 
+private:
+    /// \brief Static helper function used by const and non-const
+    /// variants of largestNode()
+    template <typename TT, typename TTN>
+    static TTN*
+    largestNodeImpl(TT* node);
+
+public:
     /// \brief return the largest node in the tree of trees.
     ///
     /// \throw none
     ///
     /// \return A \c DomainTreeNode that is the largest node in the
     /// tree. If there are no nodes, then \c NULL is returned.
+    DomainTreeNode<T>* largestNode();
+
+    /// \brief return the largest node in the tree of trees (const
+    /// variant).
     const DomainTreeNode<T>* largestNode() const;
 
     /// \brief Get the total number of nodes in the tree
@@ -1881,9 +1893,10 @@ DomainTree<T>::previousNode(DomainTreeNodeChain<T>& node_path) const {
 }
 
 template <typename T>
-const DomainTreeNode<T>*
-DomainTree<T>::largestNode() const {
-    const DomainTreeNode<T>* node = root_.get();
+template <typename TT, typename TTN>
+TTN*
+DomainTree<T>::largestNodeImpl(TT* tree) {
+    TTN* node = tree->root_.get();
     while (node != NULL) {
         // We go right first, then down.
         if (node->getRight() != NULL) {
@@ -1898,6 +1911,19 @@ DomainTree<T>::largestNode() const {
     return (node);
 }
 
+template <typename T>
+DomainTreeNode<T>*
+DomainTree<T>::largestNode() {
+  return (largestNodeImpl<DomainTree<T>, DomainTreeNode<T> >(this));
+}
+
+template <typename T>
+const DomainTreeNode<T>*
+DomainTree<T>::largestNode() const {
+    return (largestNodeImpl<const DomainTree<T>, const DomainTreeNode<T> >
+            (this));
+}
+
 template <typename T>
 typename DomainTree<T>::Result
 DomainTree<T>::insert(util::MemorySegment& mem_sgmt,