15 #ifndef GEOS_INDEX_STRTREE_ABSTRACTSTRTREE_H
16 #define GEOS_INDEX_STRTREE_ABSTRACTSTRTREE_H
18 #include <geos/export.h>
20 #include <geos/index/strtree/AbstractNode.h>
57 ItemsListItem(
void* item_)
62 ItemsListItem(ItemsList* item_)
77 assert(t == item_is_geometry);
83 assert(t == item_is_list);
94 class ItemsList :
public std::vector<ItemsListItem> {
96 typedef std::vector<ItemsListItem> base_type;
99 delete_item(ItemsListItem& item)
101 if(ItemsListItem::item_is_list == item.t) {
109 std::for_each(begin(), end(), &ItemsList::delete_item);
114 push_back(
void* item)
116 this->base_type::push_back(ItemsListItem(item));
121 push_back_owned(ItemsList* itemList)
123 this->base_type::push_back(ItemsListItem(itemList));
139 class GEOS_DLL AbstractSTRtree {
155 virtual AbstractNode* createHigherLevels(
159 virtual std::unique_ptr<BoundableList> sortBoundables(
const BoundableList* input) = 0;
161 bool remove(
const void* searchBounds, AbstractNode& node,
void* item);
162 bool removeItem(AbstractNode& node,
void* item);
164 ItemsList* itemsTree(AbstractNode* node);
173 class GEOS_DLL IntersectsOp {
183 virtual bool intersects(
const void* aBounds,
184 const void* bBounds) = 0;
192 std::vector <AbstractNode*>* nodes;
195 virtual AbstractNode* createNode(
int level) = 0;
201 virtual std::unique_ptr<BoundableList> createParentBoundables(
204 virtual AbstractNode*
207 assert(!nodeList->empty());
209 return static_cast<AbstractNode*>(nodeList->back());
212 virtual AbstractNode*
220 virtual void insert(
const void* bounds,
void* item);
223 void query(
const void* searchBounds, std::vector<void*>& foundItems);
226 void query(
const void* searchBounds, ItemVisitor& visitor);
228 void query(
const void* searchBounds,
const AbstractNode& node, ItemVisitor& visitor);
231 bool remove(
const void* itemEnv,
void* item);
233 std::unique_ptr<BoundableList> boundablesAtLevel(
int level);
236 std::size_t nodeCapacity;
244 virtual IntersectsOp* getIntersectsOp() = 0;
253 AbstractSTRtree(std::size_t newNodeCapacity)
257 nodes(new std::vector<AbstractNode *>()),
258 nodeCapacity(newNodeCapacity)
260 assert(newNodeCapacity > 1);
264 compareDoubles(
double a,
double b)
270 return (a < b) ? true :
false;
273 virtual ~AbstractSTRtree();
283 virtual void build();
294 virtual void query(
const void* searchBounds,
const AbstractNode* node, std::vector<void*>* matches);
308 virtual void boundablesAtLevel(
int level,
AbstractNode* top,
325 ItemsList* itemsTree();
333 #endif // GEOS_INDEX_STRTREE_ABSTRACTSTRTREE_H