void Region::Shape::appendSpan(int y, SegmentIterator begin, SegmentIterator end)
{
    if (canCoalesce(begin, end))
        return;

    appendSpan(y);
    m_segments.appendRange(begin, end);
}
Example #2
0
void BPTree::delete_entry(_F_FileAddr L, pKey_Attr pPrimKey, _F_FileAddr pRec) {
	BPTreeNode NodeL;
	NodeL.readNodeFromFile(L);
	// delete the (V,P) entry
	if( 1 == NodeL.IsLeaf )
		NodeL.deleteKeyInLeaf(pPrimKey);
	else 
		NodeL.deleteKeyNotLeaf(pPrimKey);
	// L is root and has only one son and not a leaf
	if( isRoot(L) && ( 0 == NodeL.ItemOnNode ) && (0 == NodeL.IsLeaf) )  {
		grantRoot(NodeL.p[0]); // grant root to the son
		deleteNodeInFile(L);   // delete node 
	}
	else 
		if( !isRoot(L) && NodeL.isNotEnoughPoints() )  {// isn't root and not enough points
			//set L_ neighbour of L
			bool IsLLeftOfL_;
			_F_FileAddr L_;
			pKey_Attr pPrimKey_;
			setNb(L, &L_, &pPrimKey_, &IsLLeftOfL_);
    
			BPTreeNode NodeL_;
			NodeL_.readNodeFromFile(L_);
			if( canCoalesce(&NodeL, &NodeL_)) {
				if(IsLLeftOfL_) 
					swapVariables(L,L_); 
				coalesce(&NodeL, &NodeL_, pPrimKey_, IsLLeftOfL_);
				if( NodeL.IsLeaf && IsLLeftOfL_ ) // differe from book 
					swapVariables(L,L_);       

				delete_entry(getParent(L), pPrimKey_, L);
				if( NodeL.IsLeaf && IsLLeftOfL_ )  // L is a leaf and L < L_. Different from the book
					deleteNodeInFile(L_);  // delete the node pointed by L_
				else
					deleteNodeInFile(L);   // delete the node pointed by L
			}
			else 
			  reDistribute(&NodeL, &NodeL_, pPrimKey_, IsLLeftOfL_, L);

			NodeL_.writeNodeToFile(L_);
		}
		NodeL.writeNodeToFile(L);  // if though the node is delete
}