[geos-commits] r3283 - in trunk: include/geos/operation/overlay src/operation/overlay

svn_geos at osgeo.org svn_geos at osgeo.org
Mon Apr 18 11:08:55 EDT 2011


Author: strk
Date: 2011-04-18 08:08:55 -0700 (Mon, 18 Apr 2011)
New Revision: 3283

Modified:
   trunk/include/geos/operation/overlay/PolygonBuilder.h
   trunk/src/operation/overlay/PolygonBuilder.cpp
Log:
Reduce heap allocations in PolygonBuilder, rewrite some private interfaces to deal with refs rather than pointers

Modified: trunk/include/geos/operation/overlay/PolygonBuilder.h
===================================================================
--- trunk/include/geos/operation/overlay/PolygonBuilder.h	2011-04-18 15:08:36 UTC (rev 3282)
+++ trunk/include/geos/operation/overlay/PolygonBuilder.h	2011-04-18 15:08:55 UTC (rev 3283)
@@ -100,17 +100,21 @@
 	/**
 	 * For all DirectedEdges in result, form them into MaximalEdgeRings
 	 *
-	 * Ownership of the returned vector *and* it's elements is
-	 * transferred to caller.
+	 * @param maxEdgeRings
+	 *   Formed MaximalEdgeRings will be pushed to this vector.
+	 *   Ownership of the elements is transferred to caller.
 	 */
-	std::vector<MaximalEdgeRing*>* buildMaximalEdgeRings(
-		const std::vector<geomgraph::DirectedEdge*> *dirEdges);
+	void buildMaximalEdgeRings(
+		const std::vector<geomgraph::DirectedEdge*> *dirEdges,
+		std::vector<MaximalEdgeRing*> &maxEdgeRings);
 			// throw(const TopologyException &)
 
-	std::vector<MaximalEdgeRing*>* buildMinimalEdgeRings(
-		std::vector<MaximalEdgeRing*> *maxEdgeRings,
-		std::vector<geomgraph::EdgeRing*> *newShellList,
-		std::vector<geomgraph::EdgeRing*> *freeHoleList);
+	void buildMinimalEdgeRings(
+		std::vector<MaximalEdgeRing*> &maxEdgeRings,
+		std::vector<geomgraph::EdgeRing*> &newShellList,
+		std::vector<geomgraph::EdgeRing*> &freeHoleList,
+		std::vector<MaximalEdgeRing*> &edgeRings);
+
 	/**
 	 * This method takes a list of MinimalEdgeRings derived from a
 	 * MaximalEdgeRing, and tests whether they form a Polygon. 
@@ -145,9 +149,9 @@
 	 * Due to the way the DirectedEdges were linked,
 	 * a ring is a shell if it is oriented CW, a hole otherwise.
 	 */
-	void sortShellsAndHoles(std::vector<MaximalEdgeRing*> *edgeRings,
-		std::vector<geomgraph::EdgeRing*> *newShellList,
-		std::vector<geomgraph::EdgeRing*> *freeHoleList);
+	void sortShellsAndHoles(std::vector<MaximalEdgeRing*> &edgeRings,
+		std::vector<geomgraph::EdgeRing*> &newShellList,
+		std::vector<geomgraph::EdgeRing*> &freeHoleList);
 
 	/** \brief
 	 * This method determines finds a containing shell for all holes

Modified: trunk/src/operation/overlay/PolygonBuilder.cpp
===================================================================
--- trunk/src/operation/overlay/PolygonBuilder.cpp	2011-04-18 15:08:36 UTC (rev 3282)
+++ trunk/src/operation/overlay/PolygonBuilder.cpp	2011-04-18 15:08:55 UTC (rev 3283)
@@ -108,16 +108,16 @@
 {
 	PlanarGraph::linkResultDirectedEdges(nodes->begin(), nodes->end());
 
-	vector<MaximalEdgeRing*>* maxEdgeRings=buildMaximalEdgeRings(dirEdges);
+	vector<MaximalEdgeRing*> maxEdgeRings;
+	buildMaximalEdgeRings(dirEdges, maxEdgeRings);
+
 	vector<EdgeRing*> freeHoleList;
-	vector<MaximalEdgeRing*> *edgeRings;
-	edgeRings= buildMinimalEdgeRings(maxEdgeRings,&shellList,&freeHoleList);
+	vector<MaximalEdgeRing*> edgeRings;
+	buildMinimalEdgeRings(maxEdgeRings, shellList, freeHoleList, edgeRings);
 
-	sortShellsAndHoles(edgeRings,&shellList,&freeHoleList);
+	sortShellsAndHoles(edgeRings, shellList, freeHoleList);
 
 	placeFreeHoles(shellList, freeHoleList);
-	delete maxEdgeRings;
-	delete edgeRings;
 	//Assert: every hole on freeHoleList has a shell assigned to it
 }
 
@@ -131,14 +131,17 @@
 
 
 /*private*/
-vector<MaximalEdgeRing*> *
-PolygonBuilder::buildMaximalEdgeRings(const vector<DirectedEdge*> *dirEdges)
+void
+PolygonBuilder::buildMaximalEdgeRings(const vector<DirectedEdge*> *dirEdges,
+  vector<MaximalEdgeRing*> &maxEdgeRings)
 	// throw(const TopologyException &)
 {
 #if GEOS_DEBUG
 	cerr<<"PolygonBuilder::buildMaximalEdgeRings got "<<dirEdges->size()<<" dirEdges"<<endl;
 #endif
-	vector<MaximalEdgeRing*> *maxEdgeRings=new vector<MaximalEdgeRing*>();
+
+	vector<MaximalEdgeRing*>::size_type oldSize = maxEdgeRings.size();
+
 	for(size_t i=0, n=dirEdges->size(); i<n; i++)
 	{
 		DirectedEdge *de=(*dirEdges)[i];
@@ -158,36 +161,34 @@
 	{ // MaximalEdgeRing constructor may throw
 				er=new MaximalEdgeRing(de,geometryFactory);
 	}
-	catch (util::GEOSException& e)
+	catch (util::GEOSException&)
 	{ // cleanup if that happens (see stmlf-cases-20061020.xml)
-		for(size_t i=0, n=maxEdgeRings->size(); i<n; i++)
-			delete (*maxEdgeRings)[i];
-		delete maxEdgeRings;
+		for(size_t i=oldSize, n=maxEdgeRings.size(); i<n; i++)
+			delete maxEdgeRings[i];
 		//cerr << "Exception! " << e.what() << endl;
-        ::geos::ignore_unused_variable_warning(e);
 		throw;
 	}
-				maxEdgeRings->push_back(er);
+				maxEdgeRings.push_back(er);
 				er->setInResult();
 				//System.out.println("max node degree=" + er.getMaxDegree());
 			}
 		}
 	}
 #if GEOS_DEBUG
-	cerr<<"  returning "<<maxEdgeRings->size()<<" maxEdgeRings"<<endl;
+	cerr<<"  pushed "<<maxEdgeRings.size()-oldSize<<" maxEdgeRings"<<endl;
 #endif
-	return maxEdgeRings;
 }
 
 /*private*/
-vector<MaximalEdgeRing*> *
-PolygonBuilder::buildMinimalEdgeRings(vector<MaximalEdgeRing*> *maxEdgeRings,
-	vector<EdgeRing*> *newShellList, vector<EdgeRing*> *freeHoleList)
+void
+PolygonBuilder::buildMinimalEdgeRings(
+  vector<MaximalEdgeRing*> &maxEdgeRings,
+	vector<EdgeRing*> &newShellList, vector<EdgeRing*> &freeHoleList,
+	vector<MaximalEdgeRing*> &edgeRings)
 {
-	vector<MaximalEdgeRing*> *edgeRings=new vector<MaximalEdgeRing*>();
-	for(size_t i=0, n=maxEdgeRings->size(); i<n; ++i)
+	for(size_t i=0, n=maxEdgeRings.size(); i<n; ++i)
 	{
-		MaximalEdgeRing *er=(*maxEdgeRings)[i];
+		MaximalEdgeRing *er = maxEdgeRings[i];
 #if GEOS_DEBUG
 	cerr<<"buildMinimalEdgeRings: maxEdgeRing "<<i<<" has "<<er->getMaxNodeDegree()<<" maxNodeDegree"<<endl;
 #endif
@@ -201,12 +202,11 @@
 			if(shell != NULL)
 			{
 				placePolygonHoles(shell, minEdgeRings);
-				newShellList->push_back(shell);
+				newShellList.push_back(shell);
 			}
 			else
 			{
-				freeHoleList->insert(
-						freeHoleList->end(),
+				freeHoleList.insert(freeHoleList.end(),
 						minEdgeRings->begin(),
 						minEdgeRings->end() );
 			}
@@ -215,10 +215,9 @@
 		}
 		else
 		{
-			edgeRings->push_back(er);
+			edgeRings.push_back(er);
 		}
 	}
-	return edgeRings;
 }
 
 /*private*/
@@ -266,20 +265,18 @@
 
 /*private*/
 void
-PolygonBuilder::sortShellsAndHoles(vector<MaximalEdgeRing*> *edgeRings,
-	vector<EdgeRing*> *newShellList, vector<EdgeRing*> *freeHoleList)
+PolygonBuilder::sortShellsAndHoles(vector<MaximalEdgeRing*> &edgeRings,
+	vector<EdgeRing*> &newShellList, vector<EdgeRing*> &freeHoleList)
 {
-	for(size_t i=0, n=edgeRings->size(); i<n; i++)
+	for(size_t i=0, n=edgeRings.size(); i<n; i++)
 	{
-		EdgeRing *er=(*edgeRings)[i];
+		EdgeRing *er = edgeRings[i];
 		//er->setInResult();
-		if (er->isHole() )
-		{
-			freeHoleList->push_back(er);
+		if (er->isHole() ) {
+			freeHoleList.push_back(er);
 		}
-		else
-		{
-			newShellList->push_back(er);
+		else {
+			newShellList.push_back(er);
 		}
 	}
 }



More information about the geos-commits mailing list