GiSTlist<GiSTentry*> GiST::RemoveTop(GiSTnode *node) { GiSTlist<GiSTentry*> deleted; int count=node->NumEntries(); // default: remove the first ones on the page int num_rem=(int)((count+1)*RemoveRatio()+0.5); for(int i=num_rem-1; i>=0; i--) { deleted.Append((GiSTentry *)(*node)[i].Ptr()->Copy()); node->DeleteEntry(i); } return(deleted); }
GiSTlist<GiSTentry*> RT::RemoveTop(GiSTnode *node) { GiSTlist<GiSTentry*> deleted; int count = node->NumEntries(); int num_rem = (int)((count + 1)*RemoveRatio() + 0.5); distix *dvec = new distix[node->NumEntries()]; int *ivec = new int[num_rem]; RTentry *uentry = (RTentry *)(node->Union()); RTkey tmpbox; int i; // compute distance of each node to center of bounding box, // and sort by decreasing distance for (i = 0; i < node->NumEntries(); i++) { dvec[i].ix = i; tmpbox = ((RTentry *)((*node)[i].Ptr()))->bbox(); dvec[i].dist = tmpbox.dist(uentry->bbox()); } delete uentry; qsort(dvec, node->NumEntries(), sizeof(distix), GiSTdistixcmp); for (i = 0; i < num_rem; i++) ivec[i] = dvec[i].ix; delete dvec; // sort the first num_rem by index number to make removal easier qsort(ivec, num_rem, sizeof(int), GiSTintcmp); for (i = num_rem - 1; i >=0 ; i--) { RTentry *tmpentry = new RTentry(*(RTentry *)((*node)[ivec[i]].Ptr())); deleted.Append(tmpentry); node->DeleteEntry(ivec[i]); } delete ivec; return(deleted); }