[cfe-commits] r49608 - /cfe/trunk/lib/Rewrite/DeltaTree.cpp

Chris Lattner sabre at nondot.org
Sun Apr 13 01:22:31 PDT 2008


Author: lattner
Date: Sun Apr 13 03:22:30 2008
New Revision: 49608

URL: http://llvm.org/viewvc/llvm-project?rev=49608&view=rev
Log:
split node splitting from interior node restructuring.


Modified:
    cfe/trunk/lib/Rewrite/DeltaTree.cpp

Modified: cfe/trunk/lib/Rewrite/DeltaTree.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/DeltaTree.cpp?rev=49608&r1=49607&r2=49608&view=diff

==============================================================================
--- cfe/trunk/lib/Rewrite/DeltaTree.cpp (original)
+++ cfe/trunk/lib/Rewrite/DeltaTree.cpp Sun Apr 13 03:22:30 2008
@@ -56,6 +56,14 @@
   };
 } // end anonymous namespace
 
+
+struct InsertResult {
+  DeltaTreeNode *LHS, *RHS;
+  SourceDelta Split;
+  InsertResult() : LHS(0) {}
+};
+
+
 namespace {
   /// DeltaTreeNode - The common part of all nodes.
   ///
@@ -85,7 +93,7 @@
     int FullDelta;
   public:
     DeltaTreeNode(bool isLeaf = true)
-    : NumValuesUsed(0), IsLeaf(isLeaf), FullDelta(0) {}
+      : NumValuesUsed(0), IsLeaf(isLeaf), FullDelta(0) {}
     
     bool isLeaf() const { return IsLeaf; }
     int getFullDelta() const { return FullDelta; }
@@ -101,6 +109,9 @@
       return Values[i];
     }
     
+    void DoSplit(InsertResult &InsertRes);
+    
+    
     /// AddDeltaNonFull - Add a delta to this tree and/or it's children, knowing
     /// that this node is not currently full.
     void AddDeltaNonFull(unsigned FileIndex, int Delta);
@@ -238,36 +249,8 @@
   DeltaTreeNode *Child = getChild(ChildNo);
   assert(!isFull() && Child->isFull() && "Inconsistent constraints");
   
-  // Since the child is full, it contains 2*WidthFactor-1 values.  We move
-  // the first 'WidthFactor-1' values to the LHS child (which we leave in the
-  // original child), propagate one value up into us, and move the last
-  // 'WidthFactor-1' values into thew RHS child.
-  
-  // Create the new child node.
-  DeltaTreeNode *NewNode;
-  if (DeltaTreeInteriorNode *CIN = dyn_cast<DeltaTreeInteriorNode>(Child)) {
-    // If the child is an interior node, also move over 'WidthFactor' grand
-    // children into the new node.
-    NewNode = new DeltaTreeInteriorNode();
-    memcpy(&((DeltaTreeInteriorNode*)NewNode)->Children[0],
-           &CIN->Children[WidthFactor],
-           WidthFactor*sizeof(CIN->Children[0]));
-  } else {
-    // Just create the child node.
-    NewNode = new DeltaTreeNode();
-  }
-  
-  // Move over the last 'WidthFactor-1' values from Child to NewNode.
-  memcpy(&NewNode->Values[0], &Child->Values[WidthFactor],
-         (WidthFactor-1)*sizeof(Child->Values[0]));
-  
-  // Decrease the number of values in the two children.
-  NewNode->NumValuesUsed = Child->NumValuesUsed = WidthFactor-1;
-  
-  // Recompute the two children's full delta.  Our delta hasn't changed, but
-  // their delta has.
-  NewNode->RecomputeFullDeltaLocally();
-  Child->RecomputeFullDeltaLocally();
+  InsertResult SplitRes;
+  Child->DoSplit(SplitRes);
   
   // Now that we have two nodes and a new element, insert the median value
   // into ourself by moving all the later values/children down, then inserting
@@ -275,15 +258,55 @@
   if (getNumValuesUsed() != ChildNo)
     memmove(&Children[ChildNo+2], &Children[ChildNo+1], 
             (getNumValuesUsed()-ChildNo)*sizeof(Children[0]));
-  Children[ChildNo+1] = NewNode;
+  Children[ChildNo] = SplitRes.LHS;
+  Children[ChildNo+1] = SplitRes.RHS;
   
   if (getNumValuesUsed() != ChildNo)
     memmove(&Values[ChildNo+1], &Values[ChildNo],
             (getNumValuesUsed()-ChildNo)*sizeof(Values[0]));
-  Values[ChildNo] = Child->Values[WidthFactor-1];
+  Values[ChildNo] = SplitRes.Split;
   ++NumValuesUsed;
 }
 
+void DeltaTreeNode::DoSplit(InsertResult &InsertRes) {
+  assert(isFull() && "Why split a non-full node?");
+  
+  // Since this node is full, it contains 2*WidthFactor-1 values.  We move
+  // the first 'WidthFactor-1' values to the LHS child (which we leave in this
+  // node), propagate one value up, and move the last 'WidthFactor-1' values
+  // into the RHS child.
+  
+  // Create the new child node.
+  DeltaTreeNode *NewNode;
+  if (DeltaTreeInteriorNode *IN = dyn_cast<DeltaTreeInteriorNode>(this)) {
+    // If this is an interior node, also move over 'WidthFactor' children
+    // into the new node.
+    DeltaTreeInteriorNode *New = new DeltaTreeInteriorNode();
+    memcpy(&New->Children[0], &IN->Children[WidthFactor],
+           WidthFactor*sizeof(IN->Children[0]));
+    NewNode = New;
+  } else {
+    // Just create the new leaf node.
+    NewNode = new DeltaTreeNode();
+  }
+  
+  // Move over the last 'WidthFactor-1' values from here to NewNode.
+  memcpy(&NewNode->Values[0], &Values[WidthFactor],
+         (WidthFactor-1)*sizeof(Values[0]));
+  
+  // Decrease the number of values in the two nodes.
+  NewNode->NumValuesUsed = NumValuesUsed = WidthFactor-1;
+  
+  // Recompute the two nodes' full delta.
+  NewNode->RecomputeFullDeltaLocally();
+  RecomputeFullDeltaLocally();
+  
+  InsertRes.LHS = this;
+  InsertRes.RHS = NewNode;
+  InsertRes.Split = Values[WidthFactor-1];
+}
+
+
 
 //===----------------------------------------------------------------------===//
 //                        DeltaTree Implementation
@@ -406,16 +429,17 @@
 /// into the current DeltaTree at offset FileIndex.
 void DeltaTree::AddDelta(unsigned FileIndex, int Delta) {
   assert(Delta && "Adding a noop?");
+  DeltaTreeNode *MyRoot = getRoot(Root);
   
   // If the root is full, create a new dummy (non-empty) interior node that
   // points to it, allowing the old root to be split.
-  if (getRoot(Root)->isFull())
-    Root = new DeltaTreeInteriorNode(getRoot(Root));
+  if (MyRoot->isFull())
+    Root = MyRoot = new DeltaTreeInteriorNode(MyRoot);
   
-  getRoot(Root)->AddDeltaNonFull(FileIndex, Delta);
+  MyRoot->AddDeltaNonFull(FileIndex, Delta);
   
 #ifdef VERIFY_TREE
-  VerifyTree(Root);
+  VerifyTree(MyRoot);
 #endif
 }
 





More information about the cfe-commits mailing list