@@ -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
0 commit comments