/*protected*/ std::auto_ptr<BoundableList> SIRtree::createParentBoundables(BoundableList *childBoundables,int newLevel) { assert(!childBoundables->empty()); std::auto_ptr<BoundableList> parentBoundables ( new BoundableList() ); parentBoundables->push_back(createNode(newLevel)); std::auto_ptr<BoundableList> sortedChildBoundables ( sortBoundables(childBoundables) ); //for(unsigned int i=0;i<sortedChildBoundables->size();i++) for (BoundableList::iterator i=sortedChildBoundables->begin(), e=sortedChildBoundables->end(); i!=e; ++i) { //Boundable *childBoundable=(AbstractNode*)(*sortedChildBoundables)[i]; Boundable *childBoundable=*i; AbstractNode* lNode = lastNode(parentBoundables.get()); if (lNode->getChildBoundables()->size() == nodeCapacity) { parentBoundables->push_back(createNode(newLevel)); } lNode->addChildBoundable(childBoundable); } return parentBoundables; }
/*protected*/ std::auto_ptr<BoundableList> AbstractSTRtree::createParentBoundables(BoundableList* childBoundables, int newLevel) { assert(!childBoundables->empty()); std::auto_ptr< BoundableList > parentBoundables ( new BoundableList() ); parentBoundables->push_back(createNode(newLevel)); std::auto_ptr< BoundableList > sortedChildBoundables ( sortBoundables(childBoundables) ); for (BoundableList::iterator i=sortedChildBoundables->begin(), e=sortedChildBoundables->end(); i!=e; i++) //for(std::size_t i=0, scbsize=sortedChildBoundables->size(); i<scbsize; ++i) { Boundable *childBoundable=*i; // (*sortedChildBoundables)[i]; AbstractNode *last = lastNode(parentBoundables.get()); if (last->getChildBoundables()->size() == nodeCapacity) { last=createNode(newLevel); parentBoundables->push_back(last); } last->addChildBoundable(childBoundable); } return parentBoundables; }
/* private */ bool AbstractSTRtree::remove(const void* searchBounds, AbstractNode& node, void* item) { // first try removing item from this node if ( removeItem(node, item) ) return true; BoundableList& boundables = *(node.getChildBoundables()); // next try removing item from lower nodes for (BoundableList::iterator i=boundables.begin(), e=boundables.end(); i!=e; i++) { Boundable* childBoundable = *i; if (!getIntersectsOp()->intersects(childBoundable->getBounds(), searchBounds)) continue; if (AbstractNode *an=dynamic_cast<AbstractNode*>(childBoundable)) { // if found, record child for pruning and exit if ( remove(searchBounds, *an, item) ) { if (an->getChildBoundables()->empty()) { boundables.erase(i); } return true; } } } return false; }
/*protected*/ void AbstractSTRtree::query(const void* searchBounds, const AbstractNode& node, ItemVisitor& visitor) { const BoundableList& boundables = *(node.getChildBoundables()); for (BoundableList::const_iterator i=boundables.begin(), e=boundables.end(); i!=e; i++) { const Boundable* childBoundable = *i; if (!getIntersectsOp()->intersects(childBoundable->getBounds(), searchBounds)) { continue; } if(const AbstractNode *an=dynamic_cast<const AbstractNode*>(childBoundable)) { query(searchBounds, *an, visitor); } else if (const ItemBoundable *ib=dynamic_cast<const ItemBoundable *>(childBoundable)) { visitor.visitItem(ib->getItem()); } else { assert(0); // unsupported childBoundable type } } }
/*private*/ bool AbstractSTRtree::removeItem(AbstractNode& node, void* item) { BoundableList& boundables = *(node.getChildBoundables()); BoundableList::iterator childToRemove = boundables.end(); for (BoundableList::iterator i=boundables.begin(), e=boundables.end(); i!=e; i++) { Boundable* childBoundable = *i; if (ItemBoundable *ib=dynamic_cast<ItemBoundable*>(childBoundable)) { if ( ib->getItem() == item) childToRemove = i; } } if (childToRemove != boundables.end()) { boundables.erase(childToRemove); return true; } return false; }