]> granicus.if.org Git - postgis/commitdiff
Add in lwfree_* deep memory clean-up routines for multi-objects.
authorPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 19 Dec 2008 19:20:34 +0000 (19:20 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 19 Dec 2008 19:20:34 +0000 (19:20 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@3454 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/lwcollection.c
liblwgeom/lwmline.c
liblwgeom/lwmpoint.c
liblwgeom/lwmpoly.c

index 851ab66ac83ea48de643712389e04d83822453f8..0f73a35da5b348ec22f43b2d5901749c02acd1ea 100644 (file)
@@ -948,7 +948,10 @@ extern void lwfree_point    (LWPOINT *pt);
 extern void lwfree_line     (LWLINE  *line);
 extern void lwfree_polygon  (LWPOLY  *poly);
 extern void lwfree_pointarray(POINTARRAY *pa);
-
+extern void lwfree_mpoint   (LWMPOINT *mpt);
+extern void lwfree_mline   (LWMLINE *mline);
+extern void lwfree_mpolygon   (LWMPOLY *mpoly);
+extern void lwfree_collection   (LWCOLLECTION *col);
 
 /****************************************************************
  * utility
index 9f7374b62317b7d7c767c4bf9c135d4bf471f193..fecbcf19a1b3e10b8cf99857a5b6c2bf9049d9a6 100644 (file)
@@ -354,3 +354,48 @@ lwcollection_same(const LWCOLLECTION *c1, const LWCOLLECTION *c2)
        }
        return 1;
 }
+
+
+void lwfree_collection(LWCOLLECTION *col) 
+{
+       int i;
+       if( col->bbox ) 
+       {
+               lwfree(col->bbox);
+       }
+       for ( i = 0; i < col->ngeoms; i++ ) 
+       {
+               if( col->geoms[i] ) {
+                       switch( TYPE_GETTYPE(col->geoms[i]->type) )
+                       {
+                               case POINTTYPE:
+                                       lwfree_point((LWPOINT*)col->geoms[i]);
+                                       break;
+                               case LINETYPE:
+                                       lwfree_line((LWLINE*)col->geoms[i]);
+                                       break;
+                               case POLYGONTYPE:
+                                       lwfree_polygon((LWPOLY*)col->geoms[i]);
+                                       break;
+                               case MULTIPOINTTYPE:
+                                       lwfree_mpoint((LWMPOINT*)col->geoms[i]);
+                                       break;
+                               case MULTILINETYPE:
+                                       lwfree_mline((LWMLINE*)col->geoms[i]);
+                                       break;
+                               case MULTIPOLYGONTYPE:
+                                       lwfree_mpolygon((LWMPOLY*)col->geoms[i]);
+                                       break;
+                               case COLLECTIONTYPE:
+                                       lwfree_collection((LWCOLLECTION*)col->geoms[i]);
+                                       break;
+                       }
+               }
+       }
+       if( col->geoms ) 
+       {
+               lwfree(col->geoms);
+       }
+       lwfree(col);
+       
+};
\ No newline at end of file
index ba6a861661deb66340b6b47468cf91281491ba2b..099264db1c23c9a4b68b5e00c1e94822cab2be18 100644 (file)
@@ -108,3 +108,24 @@ lwmline_add(const LWMLINE *to, uint32 where, const LWGEOM *what)
        return (LWGEOM *)col;
 
 }
+
+void lwfree_mline(LWMLINE *mline) 
+{
+       int i;
+       if( mline->bbox ) 
+       {
+               lwfree(mline->bbox);
+       }
+       for ( i = 0; i < mline->ngeoms; i++ ) 
+       {
+               if( mline->geoms[i] ) {
+                       lwfree_line(mline->geoms[i]);
+               }
+       }
+       if( mline->geoms ) 
+       {
+               lwfree(mline->geoms);
+       }
+       lwfree(mline);
+       
+};
index 7421454e9b5540e768721358d45f5e6135625b32..30b6ab151d2fa31567f24803001d7c705d86ce9a 100644 (file)
@@ -107,3 +107,24 @@ lwmpoint_add(const LWMPOINT *to, uint32 where, const LWGEOM *what)
        return (LWGEOM *)col;
 
 }
+
+void lwfree_mpoint(LWMPOINT *mpt) 
+{
+       int i;
+       if( mpt->bbox ) 
+       {
+               lwfree(mpt->bbox);
+       }
+       for ( i = 0; i < mpt->ngeoms; i++ ) 
+       {
+               if( mpt->geoms[i] ) {
+                       lwfree_point(mpt->geoms[i]);
+               }
+       }
+       if( mpt->geoms ) 
+       {
+               lwfree(mpt->geoms);
+       }
+       lwfree(mpt);
+       
+};
\ No newline at end of file
index b94baa62b35ccaf31663cabbb59482cf0f1a4c11..2ef1b5a438aa6674346f0b47c8a56f9501634611 100644 (file)
@@ -110,3 +110,24 @@ lwmpoly_add(const LWMPOLY *to, uint32 where, const LWGEOM *what)
        return (LWGEOM *)col;
 
 }
+
+void lwfree_mpolygon(LWMPOLY *mpoly) 
+{
+       int i;
+       if( mpoly->bbox ) 
+       {
+               lwfree(mpoly->bbox);
+       }
+       for ( i = 0; i < mpoly->ngeoms; i++ ) 
+       {
+               if( mpoly->geoms[i] ) {
+                       lwfree_polygon(mpoly->geoms[i]);
+               }
+       }
+       if( mpoly->geoms ) 
+       {
+               lwfree(mpoly->geoms);
+       }
+       lwfree(mpoly);
+       
+};
\ No newline at end of file