/** * Return the bounds of a range that includes all the elements that are near specified (x, y). * * @param x X-axis coordinate of val. * @param y Y-axis coordinate of val. * @return Pair of iterators that point to the first and the last of the elements that are * near the (x, y) point. If any of given x or y is outside of a QuadTree range (i.e. * x >= startX + width or y >= startY + width), pair of end() is returned. */ std::pair<iterator, iterator> near(double x, double y) { if (coordinatesAreOk(x, y)) { TreeNode* node = getExistingNode( LocationCode<maxLevels>(tr.forward(Coordinates(x, y)))); return std::pair<iterator, iterator>( iterator(node, 0), ++iterator(node, node->count())); } return std::pair<iterator, iterator>(end(), end()); }
iterator insert(StoredObject&& toStore) { TreeNode* node = getNode(toStore.location); if (node->level() > 0) { // We store one element at time so there will be a moment before node overflow when its // count will be equal capacity. Then we'll relocate all its elements to the new child // nodes. At worst scenario, all elements will be relocated to the same node, so its // count() will be again equal to capacity. The loop ends when at least one element is // relocated to the another child node. while (node->count() == nodeCapacity && node->level() > 0) { typename TreeNode::iterator it; typename TreeNode::iterator itEnd = node->end(); for (it = node->begin(); it != itEnd; ++it) { node->child(it->location).insert(std::move(*it)); } node->clear(); node = &(node->child(toStore.location)); } } return iterator(node, node->insert(std::move(toStore))); }