package org.oscim.utils;
import java.util.List;
import org.oscim.core.Box;
import org.oscim.utils.pool.Pool;
import org.oscim.utils.quadtree.BoxTree;
import org.oscim.utils.quadtree.BoxTree.BoxItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class QuadTree<T> extends BoxTree<BoxItem<T>, T> implements SpatialIndex<T> {
public QuadTree(int extents, int maxDepth) {
super(extents, maxDepth);
}
static final Logger log = LoggerFactory.getLogger(QuadTree.class);
final Pool<BoxItem<T>> boxPool = new Pool<BoxItem<T>>() {
@Override
protected BoxItem<T> createItem() {
return new BoxItem<T>();
}
};
private BoxItem<T> getBox(Box box) {
BoxItem<T> it = boxPool.get();
it.x1 = (int) box.xmin;
it.y1 = (int) box.ymin;
it.x2 = (int) box.xmax;
it.y2 = (int) box.ymax;
return it;
}
@Override
public void insert(Box box, T item) {
insert(new BoxItem<T>(box, item));
}
@Override
public boolean remove(Box box, T item) {
BoxItem<T> bbox = getBox(box);
boolean ok = remove(bbox, item);
boxPool.release(bbox);
return ok;
}
static class CollectCb<T> implements SearchCb<T> {
@SuppressWarnings("unchecked")
@Override
public boolean call(T item, Object context) {
List<T> l = (List<T>) context;
l.add(item);
return true;
}
}
final CollectCb<T> collectCb = new CollectCb<T>();
@Override
public List<T> search(Box bbox, List<T> results) {
BoxItem<T> box = getBox(bbox);
search(box, collectCb, results);
boxPool.release(box);
return results;
}
@Override
public int search(Box bbox, SearchCb<T> cb, Object context) {
BoxItem<T> box = getBox(bbox);
search(box, cb, context);
boxPool.release(box);
return 0;
}
}