From: Paul Ramsey Date: Wed, 25 Nov 2015 20:31:26 +0000 (+0000) Subject: #3376, make arguments to repeated point removal be const X-Git-Tag: 2.3.0beta1~366 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51efa730926820627a7fb288c7c142b1ed05a12d;p=postgis #3376, make arguments to repeated point removal be const git-svn-id: http://svn.osgeo.org/postgis/trunk@14428 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/liblwgeom.h.in b/liblwgeom/liblwgeom.h.in index 414c6e625..fe5477710 100644 --- a/liblwgeom/liblwgeom.h.in +++ b/liblwgeom/liblwgeom.h.in @@ -1571,7 +1571,7 @@ extern int lwgeom_covers_lwgeom_sphere(const LWGEOM *lwgeom1, const LWGEOM *lwge /** * Remove repeated points! */ -extern LWGEOM* lwgeom_remove_repeated_points(LWGEOM *in, double tolerance); +extern LWGEOM* lwgeom_remove_repeated_points(const LWGEOM *in, double tolerance); extern char lwtriangle_is_repeated_points(LWTRIANGLE *triangle); diff --git a/liblwgeom/liblwgeom_internal.h b/liblwgeom/liblwgeom_internal.h index 5d12d3cdf..d09f80b62 100644 --- a/liblwgeom/liblwgeom_internal.h +++ b/liblwgeom/liblwgeom_internal.h @@ -344,12 +344,12 @@ void closest_point_on_segment(const POINT4D *R, const POINT4D *A, const POINT4D /* * Repeated points */ -POINTARRAY *ptarray_remove_repeated_points_minpoints(POINTARRAY *in, double tolerance, int minpoints); -POINTARRAY *ptarray_remove_repeated_points(POINTARRAY *in, double tolerance); -LWGEOM* lwmpoint_remove_repeated_points(LWMPOINT *in, double tolerance); -LWGEOM* lwline_remove_repeated_points(LWLINE *in, double tolerance); -LWGEOM* lwcollection_remove_repeated_points(LWCOLLECTION *in, double tolerance); -LWGEOM* lwpoly_remove_repeated_points(LWPOLY *in, double tolerance); +POINTARRAY *ptarray_remove_repeated_points_minpoints(const POINTARRAY *in, double tolerance, int minpoints); +POINTARRAY *ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance); +LWGEOM* lwmpoint_remove_repeated_points(const LWMPOINT *in, double tolerance); +LWGEOM* lwline_remove_repeated_points(const LWLINE *in, double tolerance); +LWGEOM* lwcollection_remove_repeated_points(const LWCOLLECTION *in, double tolerance); +LWGEOM* lwpoly_remove_repeated_points(const LWPOLY *in, double tolerance); /* * Closure test diff --git a/liblwgeom/lwcollection.c b/liblwgeom/lwcollection.c index be254dc89..bc57a8e2b 100644 --- a/liblwgeom/lwcollection.c +++ b/liblwgeom/lwcollection.c @@ -437,7 +437,7 @@ LWCOLLECTION* lwcollection_extract(LWCOLLECTION *col, int type) } LWGEOM* -lwcollection_remove_repeated_points(LWCOLLECTION *coll, double tolerance) +lwcollection_remove_repeated_points(const LWCOLLECTION *coll, double tolerance) { uint32_t i; LWGEOM **newgeoms; diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 08deb5d60..1f4beb4c3 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -1404,7 +1404,7 @@ extern int lwgeom_dimensionality(LWGEOM *geom) return 0; } -extern LWGEOM* lwgeom_remove_repeated_points(LWGEOM *in, double tolerance) +extern LWGEOM* lwgeom_remove_repeated_points(const LWGEOM *in, double tolerance) { LWDEBUGF(4, "lwgeom_remove_repeated_points got type %s", lwtype_name(in->type)); @@ -1436,7 +1436,7 @@ extern LWGEOM* lwgeom_remove_repeated_points(LWGEOM *in, double tolerance) case TRIANGLETYPE: case TINTYPE: /* No point is repeated for a single point, or for Triangle or TIN */ - return in; + return lwgeom_clone_deep(in); case CIRCSTRINGTYPE: case COMPOUNDTYPE: @@ -1444,12 +1444,12 @@ extern LWGEOM* lwgeom_remove_repeated_points(LWGEOM *in, double tolerance) case CURVEPOLYTYPE: case MULTISURFACETYPE: /* Dunno how to handle these, will return untouched */ - return in; + return lwgeom_clone_deep(in); default: lwnotice("%s: unsupported geometry type: %s", __func__, lwtype_name(in->type)); - return in; + return lwgeom_clone_deep(in); break; } return 0; diff --git a/liblwgeom/lwline.c b/liblwgeom/lwline.c index cfd4d3f5a..58540cc7c 100644 --- a/liblwgeom/lwline.c +++ b/liblwgeom/lwline.c @@ -424,7 +424,7 @@ lwline_measured_from_lwline(const LWLINE *lwline, double m_start, double m_end) } LWGEOM* -lwline_remove_repeated_points(LWLINE *lwline, double tolerance) +lwline_remove_repeated_points(const LWLINE *lwline, double tolerance) { POINTARRAY* npts = ptarray_remove_repeated_points_minpoints(lwline->points, tolerance, 2); diff --git a/liblwgeom/lwmpoint.c b/liblwgeom/lwmpoint.c index 17b5bac53..6d0ff1f26 100644 --- a/liblwgeom/lwmpoint.c +++ b/liblwgeom/lwmpoint.c @@ -76,7 +76,7 @@ void lwmpoint_free(LWMPOINT *mpt) } LWGEOM* -lwmpoint_remove_repeated_points(LWMPOINT *mpoint, double tolerance) +lwmpoint_remove_repeated_points(const LWMPOINT *mpoint, double tolerance) { uint32_t nnewgeoms; uint32_t i, j; diff --git a/liblwgeom/lwpoly.c b/liblwgeom/lwpoly.c index fee37ffb3..fcc1cfc39 100644 --- a/liblwgeom/lwpoly.c +++ b/liblwgeom/lwpoly.c @@ -286,7 +286,7 @@ lwpoly_from_lwlines(const LWLINE *shell, } LWGEOM* -lwpoly_remove_repeated_points(LWPOLY *poly, double tolerance) +lwpoly_remove_repeated_points(const LWPOLY *poly, double tolerance) { uint32_t i; POINTARRAY **newrings; diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index a3ad34a43..69cf99e25 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -1400,7 +1400,7 @@ ptarray_longitude_shift(POINTARRAY *pa) * */ POINTARRAY * -ptarray_remove_repeated_points_minpoints(POINTARRAY *in, double tolerance, int minpoints) +ptarray_remove_repeated_points_minpoints(const POINTARRAY *in, double tolerance, int minpoints) { POINTARRAY* out; size_t ptsize; @@ -1451,7 +1451,7 @@ ptarray_remove_repeated_points_minpoints(POINTARRAY *in, double tolerance, int m } POINTARRAY * -ptarray_remove_repeated_points(POINTARRAY *in, double tolerance) +ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance) { return ptarray_remove_repeated_points_minpoints(in, tolerance, 2); } diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c index c2345937c..1dcdd34ca 100644 --- a/postgis/lwgeom_functions_basic.c +++ b/postgis/lwgeom_functions_basic.c @@ -2607,7 +2607,10 @@ Datum ST_RemoveRepeatedPoints(PG_FUNCTION_ARGS) g_out = geometry_serialize(lwgeom_out); if ( lwgeom_out != lwgeom_in ) + { lwgeom_free(lwgeom_out); + } + lwgeom_free(lwgeom_in); PG_FREE_IF_COPY(g_in, 0);