From cf7dc0a2a6a3e21173556965d533ed041afde225 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 1 Oct 2004 07:51:00 +0000 Subject: [PATCH] Added runtime cast functions. git-svn-id: http://svn.osgeo.org/postgis/trunk@917 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/liblwgeom.h | 17 ++++++++++++++ lwgeom/lwgeom.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/lwgeom/liblwgeom.h b/lwgeom/liblwgeom.h index bf0ba3e8c..1bc4e0d6c 100644 --- a/lwgeom/liblwgeom.h +++ b/lwgeom/liblwgeom.h @@ -225,6 +225,23 @@ typedef struct LWGEOM **geoms; } LWCOLLECTION; +// Casts LWGEOM->LW* (return NULL if cast is illegal) +LWMPOLY *lwgeom_as_lwmpoly(LWGEOM *lwgeom); +LWMLINE *lwgeom_as_lwmline(LWGEOM *lwgeom); +LWMPOINT *lwgeom_as_lwmpoint(LWGEOM *lwgeom); +LWCOLLECTION *lwgeom_as_lwcollection(LWGEOM *lwgeom); +LWPOLY *lwgeom_as_lwpoly(LWGEOM *lwgeom); +LWLINE *lwgeom_as_lwline(LWGEOM *lwgeom); +LWPOINT *lwgeom_as_lwpoint(LWGEOM *lwgeom); + +// Casts LW*->LWGEOM (always cast) +LWGEOM *lwmpoly_as_lwgeom(LWMPOLY *obj); +LWGEOM *lwmline_as_lwgeom(LWMLINE *obj); +LWGEOM *lwmpoint_as_lwgeom(LWMPOINT *obj); +LWGEOM *lwcollection_as_lwgeom(LWCOLLECTION *obj); +LWGEOM *lwpoly_as_lwgeom(LWPOLY *obj); +LWGEOM *lwline_as_lwgeom(LWLINE *obj); +LWGEOM *lwpoint_as_lwgeom(LWPOINT *obj); //------------------------------------------------------------- // copies a point from the point array into the parameter point diff --git a/lwgeom/lwgeom.c b/lwgeom/lwgeom.c index 6f01ad70e..bc96c4418 100644 --- a/lwgeom/lwgeom.c +++ b/lwgeom/lwgeom.c @@ -185,3 +185,60 @@ lwgeom_compute_bbox(LWGEOM *lwgeom) if ( lwgeom_compute_bbox_p(lwgeom, result) ) return result; else return NULL; } + +LWPOINT * +lwgeom_as_lwpoint(LWGEOM *lwgeom) +{ + if ( lwgeom->type == POINTTYPE ) return (LWPOINT *)lwgeom; + else return NULL; +} + +LWLINE * +lwgeom_as_lwline(LWGEOM *lwgeom) +{ + if ( lwgeom->type == LINETYPE ) return (LWLINE *)lwgeom; + else return NULL; +} + +LWPOLY * +lwgeom_as_lwpoly(LWGEOM *lwgeom) +{ + if ( lwgeom->type == POLYGONTYPE ) return (LWPOLY *)lwgeom; + else return NULL; +} + +LWCOLLECTION * +lwgeom_as_lwcollection(LWGEOM *lwgeom) +{ + if ( lwgeom->type >= MULTIPOINTTYPE ) return (LWCOLLECTION *)lwgeom; + else return NULL; +} + +LWMPOINT * +lwgeom_as_lwmpoint(LWGEOM *lwgeom) +{ + if ( lwgeom->type == MULTIPOINTTYPE ) return (LWMPOINT *)lwgeom; + else return NULL; +} + +LWMLINE * +lwgeom_as_lwmline(LWGEOM *lwgeom) +{ + if ( lwgeom->type == MULTILINETYPE ) return (LWMLINE *)lwgeom; + else return NULL; +} + +LWMPOLY * +lwgeom_as_lwmpoly(LWGEOM *lwgeom) +{ + if ( lwgeom->type == MULTIPOLYGONTYPE ) return (LWMPOLY *)lwgeom; + else return NULL; +} + +LWGEOM *lwmpoly_as_lwgeom(LWMPOLY *obj) { return (LWGEOM *)obj; } +LWGEOM *lwmline_as_lwgeom(LWMLINE *obj) { return (LWGEOM *)obj; } +LWGEOM *lwmpoint_as_lwgeom(LWMPOINT *obj) { return (LWGEOM *)obj; } +LWGEOM *lwcollection_as_lwgeom(LWCOLLECTION *obj) { return (LWGEOM *)obj; } +LWGEOM *lwpoly_as_lwgeom(LWPOLY *obj) { return (LWGEOM *)obj; } +LWGEOM *lwline_as_lwgeom(LWLINE *obj) { return (LWGEOM *)obj; } +LWGEOM *lwpoint_as_lwgeom(LWPOINT *obj) { return (LWGEOM *)obj; } -- 2.40.0