[geos-devel] Open issues
Markus Schaber
schabi at logix-tt.com
Mon Oct 30 11:01:03 EST 2006
Hi, Strk,
strk at refractions.net wrote:
>> - Our "typedef struct GEOSGeom_t *GEOSGeom;" used in function arguments
>> as "const GEOSGeom" actually defines an unmodifiable Pointer to a
>> modifiable Geometry. This is the reason for those "type qualifiers
>> ignored on return type" warnings.
>> Possible solutions:
>> - Include the "const" into the typedef, as the C-API does not expose
>> any in-place modificators.
>> - Remove the "*" from the typedef, and declare the Pointers explicitly
>> in the function definitions
>> We will have to dig into whether this might break any clients.
>
> I'd like to hear opinion of others on this.
> Making the pointer part visible is probably the cleanest thing to do,
> but clients will suffer from this. Maybe should *add* new typedefs
> so that old clients will still work w/out modification but new code
> can use the new typedefs ?
The attached Patch is a first try of follwing this path. But it causes
clients (geostest, to be exactly) to throw scary warnings, and I assume
that fixing those warnings in the clients will break source
compatibility with GEOS 2.X.
HTH,
Markus
--
Markus Schaber | Logical Tracking&Tracing International AG
Dipl. Inf. | Software Development GIS
Fight against software patents in Europe! www.ffii.org
www.nosoftwarepatents.org
-------------- next part --------------
Index: capi/geos_c.cpp
===================================================================
--- capi/geos_c.cpp (revision 1887)
+++ capi/geos_c.cpp (working copy)
@@ -51,8 +51,8 @@
#include <memory>
// Some extra magic to make type declarations in geos_c.h work - for cross-checking of types in header.
-#define GEOSGeom geos::geom::Geometry*
-#define GEOSCoordSeq geos::geom::CoordinateSequence*
+#define GEOSGeometry geos::geom::Geometry
+#define GEOSCoordSequence geos::geom::CoordinateSequence
#include "geos_c.h"
/// Define this if you want operations triggering Exceptions to
Index: capi/geos_c.h.in
===================================================================
--- capi/geos_c.h.in (revision 1887)
+++ capi/geos_c.h.in (working copy)
@@ -72,11 +72,17 @@
* C-API users, we need to define them as "opaque" struct pointers, as
* those clients don't have access to the original C++ headers, by design.
*/
-#ifndef GEOSGeom
-typedef struct GEOSGeom_t *GEOSGeom;
-typedef struct GEOSCoordSeq_t *GEOSCoordSeq;
+#ifndef GEOSGeometry
+typedef struct GEOSGeom_t GEOSGeometry;
+typedef struct GEOSCoordSeq_t GEOSCoordSequence;
#endif
+/* Those are compatibility definitions for source compatibility
+ * with GEOS 2.X clients relying on that type.
+ */
+typedef GEOSGeometry* GEOSGeom;
+typedef GEOSCoordSequence* GEOSCoordSeq;
+
/* Supported geometry types
* This was renamed from GEOSGeomTypeId in GEOS 2.2.X, which might
* break compatibility, this issue is still under investigation.
@@ -124,8 +130,8 @@
*
***********************************************************************/
-extern GEOSGeom GEOS_DLL GEOSGeomFromWKT(const char *wkt);
-extern char GEOS_DLL *GEOSGeomToWKT(const GEOSGeom g);
+extern GEOSGeometry* GEOS_DLL GEOSGeomFromWKT(const char *wkt);
+extern char GEOS_DLL *GEOSGeomToWKT(const GEOSGeometry* g);
/*
* Specify whether output WKB should be 2d or 3d.
@@ -141,11 +147,11 @@
extern int GEOS_DLL GEOS_getWKBByteOrder();
extern int GEOS_DLL GEOS_setWKBByteOrder(int byteOrder);
-extern GEOSGeom GEOS_DLL GEOSGeomFromWKB_buf(const unsigned char *wkb, size_t size);
-extern unsigned char GEOS_DLL *GEOSGeomToWKB_buf(const GEOSGeom g, size_t *size);
+extern GEOSGeometry* GEOS_DLL GEOSGeomFromWKB_buf(const unsigned char *wkb, size_t size);
+extern unsigned char GEOS_DLL *GEOSGeomToWKB_buf(const GEOSGeometry* g, size_t *size);
-extern GEOSGeom GEOS_DLL GEOSGeomFromHEX_buf(const unsigned char *hex, size_t size);
-extern unsigned char GEOS_DLL *GEOSGeomToHEX_buf(const GEOSGeom g, size_t *size);
+extern GEOSGeometry* GEOS_DLL GEOSGeomFromHEX_buf(const unsigned char *hex, size_t size);
+extern unsigned char GEOS_DLL *GEOSGeomToHEX_buf(const GEOSGeometry* g, size_t *size);
/************************************************************************
*
@@ -158,78 +164,78 @@
* of ``dims'' dimensions.
* Return NULL on exception.
*/
-extern GEOSCoordSeq GEOS_DLL GEOSCoordSeq_create(unsigned int size, unsigned int dims);
+extern GEOSCoordSequence* GEOS_DLL GEOSCoordSeq_create(unsigned int size, unsigned int dims);
/*
* Clone a Coordinate Sequence.
* Return NULL on exception.
*/
-extern GEOSCoordSeq GEOS_DLL GEOSCoordSeq_clone(const GEOSCoordSeq s);
+extern GEOSCoordSequence* GEOS_DLL GEOSCoordSeq_clone(const GEOSCoordSequence* s);
/*
* Destroy a Coordinate Sequence.
*/
-extern void GEOS_DLL GEOSCoordSeq_destroy(GEOSCoordSeq s);
+extern void GEOS_DLL GEOSCoordSeq_destroy(GEOSCoordSequence* s);
/*
* Set ordinate values in a Coordinate Sequence.
* Return 0 on exception.
*/
-extern int GEOS_DLL GEOSCoordSeq_setX(GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_setX(GEOSCoordSequence* s,
unsigned int idx, double val);
-extern int GEOS_DLL GEOSCoordSeq_setY(GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_setY(GEOSCoordSequence* s,
unsigned int idx, double val);
-extern int GEOS_DLL GEOSCoordSeq_setZ(GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_setZ(GEOSCoordSequence* s,
unsigned int idx, double val);
-extern int GEOS_DLL GEOSCoordSeq_setOrdinate(GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_setOrdinate(GEOSCoordSequence* s,
unsigned int idx, unsigned int dim, double val);
/*
* Get ordinate values from a Coordinate Sequence.
* Return 0 on exception.
*/
-extern int GEOS_DLL GEOSCoordSeq_getX(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getX(const GEOSCoordSequence* s,
unsigned int idx, double *val);
-extern int GEOS_DLL GEOSCoordSeq_getY(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getY(const GEOSCoordSequence* s,
unsigned int idx, double *val);
-extern int GEOS_DLL GEOSCoordSeq_getZ(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getZ(const GEOSCoordSequence* s,
unsigned int idx, double *val);
-extern int GEOS_DLL GEOSCoordSeq_getOrdinate(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getOrdinate(const GEOSCoordSequence* s,
unsigned int idx, unsigned int dim, double *val);
/*
* Get size and dimensions info from a Coordinate Sequence.
* Return 0 on exception.
*/
-extern int GEOS_DLL GEOSCoordSeq_getSize(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getSize(const GEOSCoordSequence* s,
unsigned int *size);
-extern int GEOS_DLL GEOSCoordSeq_getDimensions(const GEOSCoordSeq s,
+extern int GEOS_DLL GEOSCoordSeq_getDimensions(const GEOSCoordSequence* s,
unsigned int *dims);
/************************************************************************
*
* Geometry Constructors.
- * GEOSCoordSeq arguments will become ownership of the returned object.
+ * GEOSCoordSequence* arguments will become ownership of the returned object.
* All functions return NULL on exception.
*
***********************************************************************/
-extern GEOSGeom GEOS_DLL GEOSGeom_createPoint(GEOSCoordSeq s);
-extern GEOSGeom GEOS_DLL GEOSGeom_createLinearRing(GEOSCoordSeq s);
-extern GEOSGeom GEOS_DLL GEOSGeom_createLineString(GEOSCoordSeq s);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_createPoint(GEOSCoordSequence* s);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_createLinearRing(GEOSCoordSequence* s);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_createLineString(GEOSCoordSequence* s);
/*
- * Second argument is an array of GEOSGeom objects.
+ * Second argument is an array of GEOSGeometry* objects.
* The caller remains owner of the array, but pointed-to
- * objects become ownership of the returned GEOSGeom.
+ * objects become ownership of the returned GEOSGeometry.
*/
-extern GEOSGeom GEOS_DLL GEOSGeom_createPolygon(GEOSGeom shell,
- GEOSGeom *holes, unsigned int nholes);
-extern GEOSGeom GEOS_DLL GEOSGeom_createCollection(int type,
- GEOSGeom *geoms, unsigned int ngeoms);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_createPolygon(GEOSGeometry* shell,
+ GEOSGeometry* *holes, unsigned int nholes);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_createCollection(int type,
+ GEOSGeometry* *geoms, unsigned int ngeoms);
-extern GEOSGeom GEOS_DLL GEOSGeom_clone(const GEOSGeom g);
+extern GEOSGeometry* GEOS_DLL GEOSGeom_clone(const GEOSGeometry* g);
/************************************************************************
*
@@ -237,7 +243,7 @@
*
***********************************************************************/
-extern void GEOS_DLL GEOSGeom_destroy(GEOSGeom g);
+extern void GEOS_DLL GEOSGeom_destroy(GEOSGeometry* g);
/************************************************************************
@@ -246,24 +252,24 @@
*
***********************************************************************/
-extern GEOSGeom GEOS_DLL GEOSEnvelope(const GEOSGeom g1);
-extern GEOSGeom GEOS_DLL GEOSIntersection(const GEOSGeom g1, const GEOSGeom g2);
-extern GEOSGeom GEOS_DLL GEOSBuffer(const GEOSGeom g1,
+extern GEOSGeometry* GEOS_DLL GEOSEnvelope(const GEOSGeometry* g1);
+extern GEOSGeometry* GEOS_DLL GEOSIntersection(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern GEOSGeometry* GEOS_DLL GEOSBuffer(const GEOSGeometry* g1,
double width, int quadsegs);
-extern GEOSGeom GEOS_DLL GEOSConvexHull(const GEOSGeom g1);
-extern GEOSGeom GEOS_DLL GEOSDifference(const GEOSGeom g1, const GEOSGeom g2);
-extern GEOSGeom GEOS_DLL GEOSSymDifference(const GEOSGeom g1,
- const GEOSGeom g2);
-extern GEOSGeom GEOS_DLL GEOSBoundary(const GEOSGeom g1);
-extern GEOSGeom GEOS_DLL GEOSUnion(const GEOSGeom g1, const GEOSGeom g2);
-extern GEOSGeom GEOS_DLL GEOSPointOnSurface(const GEOSGeom g1);
-extern GEOSGeom GEOS_DLL GEOSGetCentroid(const GEOSGeom g);
-extern char GEOS_DLL *GEOSRelate(const GEOSGeom g1, const GEOSGeom g2);
-extern GEOSGeom GEOS_DLL GEOSPolygonize(const GEOSGeom geoms[],
+extern GEOSGeometry* GEOS_DLL GEOSConvexHull(const GEOSGeometry* g1);
+extern GEOSGeometry* GEOS_DLL GEOSDifference(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern GEOSGeometry* GEOS_DLL GEOSSymDifference(const GEOSGeometry* g1,
+ const GEOSGeometry* g2);
+extern GEOSGeometry* GEOS_DLL GEOSBoundary(const GEOSGeometry* g1);
+extern GEOSGeometry* GEOS_DLL GEOSUnion(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern GEOSGeometry* GEOS_DLL GEOSPointOnSurface(const GEOSGeometry* g1);
+extern GEOSGeometry* GEOS_DLL GEOSGetCentroid(const GEOSGeometry* g);
+extern char GEOS_DLL *GEOSRelate(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern GEOSGeometry* GEOS_DLL GEOSPolygonize(const GEOSGeometry* geoms[],
unsigned int ngeoms);
-extern GEOSGeom GEOS_DLL GEOSLineMerge(const GEOSGeom g);
-extern GEOSGeom GEOS_DLL GEOSSimplify(const GEOSGeom g1, double tolerance);
-extern GEOSGeom GEOS_DLL GEOSTopologyPreserveSimplify(const GEOSGeom g1,
+extern GEOSGeometry* GEOS_DLL GEOSLineMerge(const GEOSGeometry* g);
+extern GEOSGeometry* GEOS_DLL GEOSSimplify(const GEOSGeometry* g1, double tolerance);
+extern GEOSGeometry* GEOS_DLL GEOSTopologyPreserveSimplify(const GEOSGeometry* g1,
double tolerance);
/************************************************************************
@@ -272,17 +278,17 @@
*
***********************************************************************/
-extern char GEOS_DLL GEOSRelatePattern(const GEOSGeom g1, const GEOSGeom g2,
+extern char GEOS_DLL GEOSRelatePattern(const GEOSGeometry* g1, const GEOSGeometry* g2,
const char *pat);
-extern char GEOS_DLL GEOSDisjoint(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSTouches(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSIntersects(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSCrosses(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSWithin(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSContains(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSOverlaps(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSEquals(const GEOSGeom g1, const GEOSGeom g2);
-extern char GEOS_DLL GEOSEqualsExact(const GEOSGeom g1, const GEOSGeom g2, double tolerance);
+extern char GEOS_DLL GEOSDisjoint(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSTouches(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSIntersects(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSCrosses(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSWithin(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSContains(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSOverlaps(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSEquals(const GEOSGeometry* g1, const GEOSGeometry* g2);
+extern char GEOS_DLL GEOSEqualsExact(const GEOSGeometry* g1, const GEOSGeometry* g2, double tolerance);
/************************************************************************
@@ -291,11 +297,11 @@
*
***********************************************************************/
-extern char GEOS_DLL GEOSisEmpty(const GEOSGeom g1);
-extern char GEOS_DLL GEOSisValid(const GEOSGeom g1);
-extern char GEOS_DLL GEOSisSimple(const GEOSGeom g1);
-extern char GEOS_DLL GEOSisRing(const GEOSGeom g1);
-extern char GEOS_DLL GEOSHasZ(const GEOSGeom g1);
+extern char GEOS_DLL GEOSisEmpty(const GEOSGeometry* g1);
+extern char GEOS_DLL GEOSisValid(const GEOSGeometry* g1);
+extern char GEOS_DLL GEOSisSimple(const GEOSGeometry* g1);
+extern char GEOS_DLL GEOSisRing(const GEOSGeometry* g1);
+extern char GEOS_DLL GEOSHasZ(const GEOSGeometry* g1);
/************************************************************************
@@ -305,15 +311,15 @@
***********************************************************************/
/* Return NULL on exception, result must be freed by caller. */
-extern char GEOS_DLL *GEOSGeomType(const GEOSGeom g1);
+extern char GEOS_DLL *GEOSGeomType(const GEOSGeometry* g1);
/* Return -1 on exception */
-extern int GEOS_DLL GEOSGeomTypeId(const GEOSGeom g1);
+extern int GEOS_DLL GEOSGeomTypeId(const GEOSGeometry* g1);
/* Return 0 on exception */
-extern int GEOS_DLL GEOSGetSRID(const GEOSGeom g1);
+extern int GEOS_DLL GEOSGetSRID(const GEOSGeometry* g1);
-extern void GEOS_DLL GEOSSetSRID(GEOSGeom g, int SRID);
+extern void GEOS_DLL GEOSSetSRID(GEOSGeometry* g, int SRID);
/* May be called on all geometries in GEOS 3.x, returns -1 on error and 1
* for non-multi geometries. Older GEOS versions only accept
@@ -321,48 +327,48 @@
* when feeded simple geometries, so beware if you need compatibility with
* old GEOS versions.
*/
-extern int GEOS_DLL GEOSGetNumGeometries(const GEOSGeom g1);
+extern int GEOS_DLL GEOSGetNumGeometries(const GEOSGeometry* g1);
/*
* Return NULL on exception, Geometry must be a Collection.
* Returned object is a pointer to internal storage:
* it must NOT be destroyed directly.
*/
-extern const GEOSGeom GEOS_DLL GEOSGetGeometryN(const GEOSGeom g, int n);
+extern const GEOSGeometry* GEOS_DLL GEOSGetGeometryN(const GEOSGeometry* g, int n);
/* Return -1 on exception */
-extern int GEOS_DLL GEOSNormalize(GEOSGeom g1);
+extern int GEOS_DLL GEOSNormalize(GEOSGeometry* g1);
/* Return -1 on exception */
-extern int GEOS_DLL GEOSGetNumInteriorRings(const GEOSGeom g1);
+extern int GEOS_DLL GEOSGetNumInteriorRings(const GEOSGeometry* g1);
/*
* Return NULL on exception, Geometry must be a Polygon.
* Returned object is a pointer to internal storage:
* it must NOT be destroyed directly.
*/
-extern const GEOSGeom GEOS_DLL GEOSGetInteriorRingN(const GEOSGeom g, int n);
+extern const GEOSGeometry* GEOS_DLL GEOSGetInteriorRingN(const GEOSGeometry* g, int n);
/*
* Return NULL on exception, Geometry must be a Polygon.
* Returned object is a pointer to internal storage:
* it must NOT be destroyed directly.
*/
-extern const GEOSGeom GEOS_DLL GEOSGetExteriorRing(const GEOSGeom g);
+extern const GEOSGeometry* GEOS_DLL GEOSGetExteriorRing(const GEOSGeometry* g);
/* Return -1 on exception */
-extern int GEOS_DLL GEOSGetNumCoordinates(const GEOSGeom g1);
+extern int GEOS_DLL GEOSGetNumCoordinates(const GEOSGeometry* g1);
/*
* Return NULL on exception.
* Geometry must be a LineString, LinearRing or Point.
*/
-extern const GEOSCoordSeq GEOS_DLL GEOSGeom_getCoordSeq(const GEOSGeom g);
+extern const GEOSCoordSequence* GEOS_DLL GEOSGeom_getCoordSeq(const GEOSGeometry* g);
/*
* Return 0 on exception (or empty geometry)
*/
-extern int GEOS_DLL GEOSGeom_getDimensions(const GEOSGeom g);
+extern int GEOS_DLL GEOSGeom_getDimensions(const GEOSGeometry* g);
/************************************************************************
*
@@ -371,9 +377,9 @@
***********************************************************************/
/* Return 0 on exception, 1 otherwise */
-extern int GEOS_DLL GEOSArea(const GEOSGeom g1, double *area);
-extern int GEOS_DLL GEOSLength(const GEOSGeom g1, double *length);
-extern int GEOS_DLL GEOSDistance(const GEOSGeom g1, const GEOSGeom g2,
+extern int GEOS_DLL GEOSArea(const GEOSGeometry* g1, double *area);
+extern int GEOS_DLL GEOSLength(const GEOSGeometry* g1, double *length);
+extern int GEOS_DLL GEOSDistance(const GEOSGeometry* g1, const GEOSGeometry* g2,
double *dist);
#ifdef __cplusplus
More information about the geos-devel
mailing list