[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