Changeset 2731


Ignore:
Timestamp:
Nov 19, 2009, 1:06:16 PM (15 years ago)
Author:
strk
Message:

Don't force heap allocation when building edge rings for isValidOp

Location:
trunk/source
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/headers/geos/operation/overlay/MaximalEdgeRing.h

    r2557 r2731  
    8383        /// pointers to newly allocated MinimalEdgeRing objects.
    8484        ///
     85        /// @deprecated pass the vector yourself instead
     86        ///
    8587        std::vector<MinimalEdgeRing*>* buildMinimalRings();
    8688
     
    9092        ///
    9193        void buildMinimalRings(std::vector<MinimalEdgeRing*>& minEdgeRings);
     94        void buildMinimalRings(std::vector<EdgeRing*>& minEdgeRings);
    9295
    9396        /// \brief
  • trunk/source/headers/geos/operation/valid/ConnectedInteriorTester.h

    r2572 r2731  
    9292       
    9393        /**
     94         * \brief
    9495         * Form DirectedEdges in graph into Minimal EdgeRings.
    95          * (Minimal Edgerings must be used, because only they are guaranteed to provide
    96          * a correct isHole computation)
    9796         *
    98          * The returned vector and its contents are allocated on the
    99          * heap; deletion responsibility is left to caller.
     97         * Minimal Edgerings must be used, because only they are
     98         * guaranteed to provide a correct isHole computation.
     99         *
     100         * @param minEdgeRings : newly allocated minimal edge rings will
     101         *                       be push_back'ed here.
     102         *                       deletion responsibility is left to caller.
    100103         */
    101         std::vector<geomgraph::EdgeRing*>* buildEdgeRings(
    102                         std::vector<geomgraph::EdgeEnd*> *dirEdges);
     104        void buildEdgeRings(std::vector<geomgraph::EdgeEnd*> *dirEdges,
     105                            std::vector<geomgraph::EdgeRing*>& minEdgeRings);
    103106
    104107        /**
  • trunk/source/operation/overlay/MaximalEdgeRing.cpp

    r2550 r2731  
    125125}
    126126
     127/*public*/
     128void
     129MaximalEdgeRing::buildMinimalRings(vector<EdgeRing*>& minEdgeRings)
     130{
     131        DirectedEdge *de=startDe;
     132        do {
     133                if(de->getMinEdgeRing()==NULL) {
     134                        MinimalEdgeRing *minEr=new MinimalEdgeRing(de, geometryFactory);
     135                        minEdgeRings.push_back(minEr);
     136                }
     137                de=de->getNext();
     138        } while(de!=startDe);
     139}
     140
    127141} // namespace geos.operation.overlay
    128142} // namespace geos.operation
  • trunk/source/operation/valid/ConnectedInteriorTester.cpp

    r2572 r2731  
    5454#endif
    5555
     56//#define GEOS_CAST_PARANOIA 1
     57
    5658#if GEOS_DEBUG
    5759#include <iostream>
     
    115117        graph.linkResultDirectedEdges();
    116118
    117         // Someone has to delete the returned vector and its contents
    118         std::vector<EdgeRing*>* edgeRings=buildEdgeRings(graph.getEdgeEnds());
    119         assert(edgeRings);
    120 
    121 #if GEOS_DEBUG
    122         cerr << "buildEdgeRings constructed " << edgeRings->size() << " edgeRings." << endl;
     119        std::vector<EdgeRing*> edgeRings;
     120        buildEdgeRings(graph.getEdgeEnds(), edgeRings);
     121
     122#if GEOS_DEBUG
     123        cerr << "buildEdgeRings constructed " << edgeRings.size() << " edgeRings." << endl;
    123124#endif
    124125
     
    133134
    134135#if GEOS_DEBUG
    135         cerr << "after visitShellInteriors edgeRings are " << edgeRings->size() << " edgeRings." << endl;
     136        cerr << "after visitShellInteriors edgeRings are " << edgeRings.size() << " edgeRings." << endl;
    136137#endif
    137138
     
    143144         * polygon into at least two pieces.  The polygon is thus invalid.
    144145         */
    145         bool res=!hasUnvisitedShellEdge(edgeRings);
    146 
    147         assert(edgeRings);
    148 #if GEOS_DEBUG
    149         cerr << "releasing " << edgeRings->size() << " edgeRings." << endl;
     146        bool res=!hasUnvisitedShellEdge(&edgeRings);
     147
     148#if GEOS_DEBUG
     149        cerr << "releasing " << edgeRings.size() << " edgeRings." << endl;
    150150#endif
    151151        // Release memory allocated by buildEdgeRings
    152         for(size_t i=0, n=edgeRings->size(); i<n; ++i)
    153         {
    154                 EdgeRing* er = (*edgeRings)[i];
     152        for(size_t i=0, n=edgeRings.size(); i<n; ++i)
     153        {
     154                EdgeRing* er = edgeRings[i];
    155155#if GEOS_DEBUG
    156156                cerr<<*er<<endl;
     
    162162#endif
    163163        }
    164         delete edgeRings;
     164        edgeRings.clear();
    165165
    166166        // Release memory allocated by MaximalEdgeRings
     
    194194
    195195/*private*/
    196 std::vector<EdgeRing*>*
    197 ConnectedInteriorTester::buildEdgeRings(std::vector<EdgeEnd*> *dirEdges)
     196void
     197ConnectedInteriorTester::buildEdgeRings(std::vector<EdgeEnd*> *dirEdges,
     198                                        std::vector<EdgeRing*>& minEdgeRings)
    198199{
    199200#if GEOS_DEBUG
    200201        cerr << __FUNCTION__ << " got " << dirEdges->size() << " EdgeEnd vector" << endl;
    201202#endif
    202         std::vector<MinimalEdgeRing*> minEdgeRings;
    203         for(size_t i=0, n=dirEdges->size(); i<n; ++i)
    204         {
     203
     204        typedef std::vector<EdgeEnd*> EdgeEnds;
     205
     206        //std::vector<MinimalEdgeRing*> minEdgeRings;
     207        for(EdgeEnds::size_type i=0, n=dirEdges->size(); i<n; ++i)
     208        {
     209#ifdef GEOS_CAST_PARANOIA
    205210                assert(dynamic_cast<DirectedEdge*>((*dirEdges)[i]));
     211#endif
    206212                DirectedEdge *de=static_cast<DirectedEdge*>((*dirEdges)[i]);
    207213
     
    213219                if(de->isInResult() && de->getEdgeRing()==NULL)
    214220                {
    215                         //EdgeRing *er=new MaximalEdgeRing(de,geometryFactory);
    216                         //edgeRings->push_back(er);
    217 
    218                         MaximalEdgeRing* er=new MaximalEdgeRing(de, geometryFactory);
     221                        MaximalEdgeRing* er = new MaximalEdgeRing(de,
     222                                                           geometryFactory);
    219223                        // We track MaximalEdgeRings allocations
    220224                        // using the private maximalEdgeRings vector
     
    225229                }
    226230        }
     231/*
    227232        std::vector<EdgeRing*> *edgeRings=new std::vector<EdgeRing*>();
    228233        edgeRings->assign(minEdgeRings.begin(), minEdgeRings.end());
    229234        return edgeRings;
     235*/
    230236}
    231237
Note: See TracChangeset for help on using the changeset viewer.