MODULE = Geo::Geos PACKAGE = Geo::Geos::Index::SpatialIndex
PROTOTYPES: DISABLE
Array SpatialIndex::query(Envelope& env, SV* arg = NULL) {
Object me {ST(0)};
auto payload = me.payload(&payload_marker_SVs_map);
auto real_payload = static_cast<SVs_map_payload*>(payload.ptr);
if (!arg) {
std::vector<void *> v;
THIS->query(&env, v);
RETVAL = Helper::wrap_inc_SVs(&v, real_payload->map);
}
else {
Sub visitor {arg};
if (!visitor) throw "Unsupported argument";
SubItemVisitor v{visitor, real_payload->map};
THIS->query(&env, v);
XSRETURN_UNDEF;
}
}
void SpatialIndex::insert(Envelope& env, SV* item) {
Object me{ST(0)};
auto payload = me.payload(&payload_marker_SVs_map);
auto real_payload = static_cast<SVs_map_payload*>(payload.ptr);
SV* value = Helper::store_sv(item, real_payload->map);
THIS->insert(&env, value);
}
bool SpatialIndex::remove(Envelope& env, SV *item) {
Object me{ST(0)};
auto payload = me.payload(&payload_marker_SVs_map);
auto real_payload = static_cast<SVs_map_payload*>(payload.ptr);
SV* value = hv_delete_ent(real_payload->map, item, 0, 0);
if (!value) throw "value is n/a in hash";
THIS->remove(&env, value);
}
BOOT {
payload_marker_SVs_map.svt_free = payload_marker_SVs_map_free;
}