@@ -446,6 +446,62 @@ static void add_nodes_to_linestring(linestring_t *linestring, ITERATOR it,
446446 }
447447}
448448
449+ /* ***************************************************************************/
450+
451+ static void reverse (geom::nullgeom_t * /* output*/ ,
452+ geom::nullgeom_t const & /* input*/ ) noexcept
453+ {}
454+
455+ static void reverse (geom::point_t *output, geom::point_t const &input) noexcept
456+ {
457+ *output = input;
458+ }
459+
460+ static void reverse (point_list_t *output, point_list_t const &input)
461+ {
462+ output->reserve (input.size ());
463+ std::reverse_copy (input.cbegin (), input.cend (),
464+ std::back_inserter (*output));
465+ }
466+
467+ static void reverse (geom::polygon_t *output, geom::polygon_t const &input)
468+ {
469+ reverse (&output->outer (), input.outer ());
470+ for (auto const &g : input.inners ()) {
471+ reverse (&output->inners ().emplace_back (), g);
472+ }
473+ }
474+
475+ template <typename T>
476+ void reverse (geom::multigeometry_t <T> *output,
477+ geom::multigeometry_t <T> const &input)
478+ {
479+ output->reserve (input.num_geometries ());
480+ for (auto const &g : input) {
481+ reverse (&output->add_geometry (), g);
482+ }
483+ }
484+
485+ void reverse (geometry_t *output, geometry_t const &input)
486+ {
487+ output->set_srid (input.srid ());
488+
489+ input.visit ([&](auto const &geom) {
490+ using inner_type =
491+ std::remove_const_t <std::remove_reference_t <decltype (geom)>>;
492+ return reverse (&output->set <inner_type>(), geom);
493+ });
494+ }
495+
496+ geometry_t reverse (geometry_t const &input)
497+ {
498+ geometry_t output;
499+ reverse (&output, input);
500+ return output;
501+ }
502+
503+ /* ***************************************************************************/
504+
449505void line_merge (geometry_t *output, geometry_t const &input)
450506{
451507 if (input.is_linestring ()) {
0 commit comments