Skip to content

Commit 7893919

Browse files
committed
Split geom::line_merge() function into two
with and without output parameter
1 parent 7e87776 commit 7893919

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

src/geom-functions.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -446,16 +446,16 @@ static void add_nodes_to_linestring(linestring_t *linestring, ITERATOR it,
446446
}
447447
}
448448

449-
geometry_t line_merge(geometry_t geom)
449+
void line_merge(geometry_t *output, geometry_t const &input)
450450
{
451-
geometry_t output{multilinestring_t{}, geom.srid()};
452-
453-
if (geom.is_null()) {
454-
output.reset();
455-
return output;
451+
if (!input.is_multilinestring()) {
452+
output->reset();
453+
return;
456454
}
457455

458-
assert(geom.is_multilinestring());
456+
output->set_srid(input.srid());
457+
458+
auto &linestrings = output->set<multilinestring_t>();
459459

460460
// Make a list of all endpoints...
461461
struct endpoint_t
@@ -490,16 +490,16 @@ geometry_t line_merge(geometry_t geom)
490490
struct connection_t
491491
{
492492
std::size_t left = NOCONN;
493-
geom::linestring_t const *ls;
493+
linestring_t const *ls;
494494
std::size_t right = NOCONN;
495495

496-
explicit connection_t(geom::linestring_t const *l) noexcept : ls(l) {}
496+
explicit connection_t(linestring_t const *l) noexcept : ls(l) {}
497497
};
498498

499499
std::vector<connection_t> conns;
500500

501501
// Initialize the two lists.
502-
for (auto const &line : geom.get<multilinestring_t>()) {
502+
for (auto const &line : input.get<multilinestring_t>()) {
503503
endpoints.emplace_back(line.front(), conns.size(), true);
504504
endpoints.emplace_back(line.back(), conns.size(), false);
505505
conns.emplace_back(&line);
@@ -525,8 +525,6 @@ geometry_t line_merge(geometry_t geom)
525525
}
526526
}
527527

528-
auto &linestrings = output.get<multilinestring_t>();
529-
530528
// First find all open ends and use them as starting points to assemble
531529
// linestrings. Mark ways as "done" as we go.
532530
std::size_t done_ways = 0;
@@ -614,9 +612,14 @@ geometry_t line_merge(geometry_t geom)
614612
}
615613

616614
if (linestrings.num_geometries() == 0) {
617-
output.reset();
615+
output->reset();
618616
}
617+
}
619618

619+
geometry_t line_merge(geometry_t const &input)
620+
{
621+
geometry_t output;
622+
line_merge(&output, input);
620623
return output;
621624
}
622625

src/geom-functions.hpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,20 @@ std::vector<geometry_t> split_multi(geometry_t &&geom, bool split_multi = true);
163163
* returns a multilinestring unless there is an error or the input geometry
164164
* is a nullgeom_t, in which case nullgeom_t is returned.
165165
*
166-
* \param geom Input geometry.
166+
* \param output Pointer to output geometry.
167+
* \param input Input geometry.
168+
*/
169+
void line_merge(geometry_t *output, geometry_t const &input);
170+
171+
/**
172+
* Merge lines in a multilinestring end-to-end as far as possible. Always
173+
* returns a multilinestring unless there is an error or the input geometry
174+
* is a nullgeom_t, in which case nullgeom_t is returned.
175+
*
176+
* \param input Input geometry.
167177
* \returns Result multilinestring.
168178
*/
169-
geometry_t line_merge(geometry_t geom);
179+
geometry_t line_merge(geometry_t const &input);
170180

171181
/**
172182
* Calculate the centroid of a geometry.

0 commit comments

Comments
 (0)