From: Mukund Sivaraman Date: Mon, 26 Aug 2013 01:46:00 +0000 (+0530) Subject: [2750] Add non-const variant of abstractSuccessor() X-Git-Tag: bind10-1.2.0beta1-release~193^2~4^2~74 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4d4b0dcd1dc2571a98b4e60bf846dd704ed7200d;p=thirdparty%2Fkea.git [2750] Add non-const variant of abstractSuccessor() --- diff --git a/src/lib/datasrc/memory/domaintree.h b/src/lib/datasrc/memory/domaintree.h index 5cf6e4d9d5..6075e9a18a 100644 --- a/src/lib/datasrc/memory/domaintree.h +++ b/src/lib/datasrc/memory/domaintree.h @@ -474,6 +474,16 @@ public: } private: + /// \brief Static helper function used by const and non-const + /// variants of abstractSuccessor() + template + static TT* + abstractSuccessorImpl(TT* node, + typename DomainTreeNode::DomainTreeNodePtr + DomainTreeNode::*left, + typename DomainTreeNode::DomainTreeNodePtr + DomainTreeNode::*right); + /// \brief private shared implementation of successor and predecessor /// /// As the two mentioned functions are merely mirror images of each other, @@ -485,10 +495,18 @@ private: /// The overhead of the member pointers should be optimised out, as this /// will probably get completely inlined into predecessor and successor /// methods. + DomainTreeNode* + abstractSuccessor(typename DomainTreeNode::DomainTreeNodePtr + DomainTreeNode::*left, + typename DomainTreeNode::DomainTreeNodePtr + DomainTreeNode::*right); + + /// \brief private shared implementation of successor and + /// predecessor (const variant) const DomainTreeNode* - abstractSuccessor(typename DomainTreeNode::DomainTreeNodePtr + abstractSuccessor(typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*left, - typename DomainTreeNode::DomainTreeNodePtr + typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*right) const; @@ -687,18 +705,18 @@ DomainTreeNode::getAbsoluteLabels( } template -const DomainTreeNode* -DomainTreeNode::abstractSuccessor( +template +TT* +DomainTreeNode::abstractSuccessorImpl(TT* node, typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*left, typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*right) - const { // This function is written as a successor. It becomes predecessor if // the left and right pointers are swapped. So in case of predecessor, // the left pointer points to right and vice versa. Don't get confused // by the idea, just imagine the pointers look into a mirror. - const DomainTreeNode* current = this; + const DomainTreeNode* current = node; // If it has right node, the successor is the left-most node of the right // subtree. if ((current->*right).get() != NULL) { @@ -727,6 +745,26 @@ DomainTreeNode::abstractSuccessor( } } +template +DomainTreeNode* +DomainTreeNode::abstractSuccessor( + typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*left, + typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*right) +{ + return (abstractSuccessorImpl >(this, left, right)); +} + +template +const DomainTreeNode* +DomainTreeNode::abstractSuccessor( + typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*left, + typename DomainTreeNode::DomainTreeNodePtr DomainTreeNode::*right) + const +{ + return (abstractSuccessorImpl > + (this, left, right)); +} + template const DomainTreeNode* DomainTreeNode::successor() const {