Skip to content

Commit

Permalink
LineSegmentIndex: Avoid creating std::vector on heap
Browse files Browse the repository at this point in the history
  • Loading branch information
dbaston authored and pramsey committed Oct 24, 2024
1 parent b72a68d commit 2baf9f9
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 31 deletions.
2 changes: 1 addition & 1 deletion include/geos/simplify/LineSegmentIndex.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class GEOS_DLL LineSegmentIndex {

void remove(const geom::LineSegment* seg);

std::unique_ptr< std::vector<geom::LineSegment*> >
std::vector<const geom::LineSegment*>
query(const geom::LineSegment* seg);


Expand Down
35 changes: 7 additions & 28 deletions src/simplify/LineSegmentIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,59 +54,38 @@ class LineSegmentVisitor: public index::ItemVisitor {

const LineSegment* querySeg;

std::unique_ptr< std::vector<LineSegment*> > items;
std::vector<const LineSegment*> items;

public:

LineSegmentVisitor(const LineSegment* s)
:
ItemVisitor(),
querySeg(s),
items(new std::vector<LineSegment*>())
querySeg(s)
{}

~LineSegmentVisitor() override
{
// nothing to do, LineSegments are not owned by us
}

LineSegmentVisitor(const LineSegmentVisitor& o)
:
ItemVisitor(),
querySeg(o.querySeg),
items(new std::vector<LineSegment*>(*(o.items.get())))
{
}

LineSegmentVisitor&
operator=(const LineSegmentVisitor& o)
{
if(this == &o) {
return *this;
}
querySeg = o.querySeg;
items.reset(new std::vector<LineSegment*>(*(o.items.get())));
return *this;
}

void
visitItem(void* item) override
{
LineSegment* seg = static_cast<LineSegment*>(item);
const LineSegment* seg = static_cast<const LineSegment*>(item);
if(Envelope::intersects(seg->p0, seg->p1,
querySeg->p0, querySeg->p1)) {
items->push_back(seg);
items.push_back(seg);
}
}

std::unique_ptr< std::vector<LineSegment*> >
std::vector<const LineSegment*>
getItems()
{
// NOTE: Apparently, this is 'source' method giving up the object resource.
return std::move(items);
}


};


Expand Down Expand Up @@ -144,15 +123,15 @@ LineSegmentIndex::remove(const LineSegment* seg)
}

/*public*/
std::unique_ptr< std::vector<LineSegment*> >
std::vector<const LineSegment*>
LineSegmentIndex::query(const LineSegment* querySeg)
{
Envelope env(querySeg->p0, querySeg->p1);

LineSegmentVisitor visitor(querySeg);
index.query(&env, visitor);

std::unique_ptr< std::vector<LineSegment*> > itemsFound = visitor.getItems();
auto itemsFound = visitor.getItems();

return itemsFound;
}
Expand Down
4 changes: 2 additions & 2 deletions src/simplify/TaggedLineStringSimplifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ TaggedLineStringSimplifier::hasOutputIntersection(
//std::unique_ptr<std::vector<LineSegment*>>
auto querySegs = outputIndex->query(&flatSeg);

for(const LineSegment* querySeg : *querySegs) {
for(const LineSegment* querySeg : querySegs) {
if(hasInvalidIntersection(*querySeg, flatSeg)) {
return true;
}
Expand Down Expand Up @@ -314,7 +314,7 @@ TaggedLineStringSimplifier::hasInputIntersection(
{
const auto& querySegs = inputIndex->query(&flatSeg);

for(const LineSegment* ls : *querySegs) {
for(const LineSegment* ls : querySegs) {
const TaggedLineSegment* querySeg = static_cast<const TaggedLineSegment*>(ls);

if (hasInvalidIntersection(*ls, flatSeg)) {
Expand Down

0 comments on commit 2baf9f9

Please sign in to comment.