Skip to content

Commit

Permalink
Drop the cached coordinate sequence from abstract geometries
Browse files Browse the repository at this point in the history
This cache was added to speed up expensive QgsAbstractGeometry::coordinateSequence
calls, when we were relying on coordinateSequence() for a whole
bunch of stuff like counting the number of points in a geometry.

Now it's used almost no-where in the code, so this cache is unlikely
to get filled and just makes geometries more memory heavy than
they need to be.
  • Loading branch information
nyalldawson committed Nov 14, 2017
1 parent 0c35dde commit 507a93c
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 33 deletions.
13 changes: 5 additions & 8 deletions src/core/geometry/qgscurve.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -45,14 +45,12 @@ bool QgsCurve::isRing() const


QgsCoordinateSequence QgsCurve::coordinateSequence() const QgsCoordinateSequence QgsCurve::coordinateSequence() const
{ {
if ( !mCoordinateSequence.isEmpty() ) QgsCoordinateSequence sequence;
return mCoordinateSequence; sequence.append( QgsRingSequence() );
sequence.back().append( QgsPointSequence() );
points( sequence.back().back() );


mCoordinateSequence.append( QgsRingSequence() ); return sequence;
mCoordinateSequence.back().append( QgsPointSequence() );
points( mCoordinateSequence.back().back() );

return mCoordinateSequence;
} }


bool QgsCurve::nextVertex( QgsVertexId &id, QgsPoint &vertex ) const bool QgsCurve::nextVertex( QgsVertexId &id, QgsPoint &vertex ) const
Expand Down Expand Up @@ -191,7 +189,6 @@ QPolygonF QgsCurve::asQPolygonF() const
void QgsCurve::clearCache() const void QgsCurve::clearCache() const
{ {
mBoundingBox = QgsRectangle(); mBoundingBox = QgsRectangle();
mCoordinateSequence.clear();
QgsAbstractGeometry::clearCache(); QgsAbstractGeometry::clearCache();
} }


Expand Down
1 change: 0 additions & 1 deletion src/core/geometry/qgscurve.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@ class CORE_EXPORT QgsCurve: public QgsAbstractGeometry
private: private:


mutable QgsRectangle mBoundingBox; mutable QgsRectangle mBoundingBox;
mutable QgsCoordinateSequence mCoordinateSequence;
}; };


#endif // QGSCURVEV2_H #endif // QGSCURVEV2_H
19 changes: 7 additions & 12 deletions src/core/geometry/qgscurvepolygon.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -724,32 +724,27 @@ void QgsCurvePolygon::transform( const QTransform &t )


QgsCoordinateSequence QgsCurvePolygon::coordinateSequence() const QgsCoordinateSequence QgsCurvePolygon::coordinateSequence() const
{ {
if ( !mCoordinateSequence.isEmpty() ) QgsCoordinateSequence sequence;
return mCoordinateSequence; sequence.append( QgsRingSequence() );

mCoordinateSequence.append( QgsRingSequence() );


if ( mExteriorRing ) if ( mExteriorRing )
{ {
mCoordinateSequence.back().append( QgsPointSequence() ); sequence.back().append( QgsPointSequence() );
mExteriorRing->points( mCoordinateSequence.back().back() ); mExteriorRing->points( sequence.back().back() );
} }


QList<QgsCurve *>::const_iterator it = mInteriorRings.constBegin(); QList<QgsCurve *>::const_iterator it = mInteriorRings.constBegin();
for ( ; it != mInteriorRings.constEnd(); ++it ) for ( ; it != mInteriorRings.constEnd(); ++it )
{ {
mCoordinateSequence.back().append( QgsPointSequence() ); sequence.back().append( QgsPointSequence() );
( *it )->points( mCoordinateSequence.back().back() ); ( *it )->points( sequence.back().back() );
} }


return mCoordinateSequence; return sequence;
} }


int QgsCurvePolygon::nCoordinates() const int QgsCurvePolygon::nCoordinates() const
{ {
if ( !mCoordinateSequence.isEmpty() )
return QgsAbstractGeometry::nCoordinates();

int count = 0; int count = 0;


if ( mExteriorRing ) if ( mExteriorRing )
Expand Down
12 changes: 3 additions & 9 deletions src/core/geometry/qgsgeometrycollection.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -421,15 +421,12 @@ QgsRectangle QgsGeometryCollection::calculateBoundingBox() const
void QgsGeometryCollection::clearCache() const void QgsGeometryCollection::clearCache() const
{ {
mBoundingBox = QgsRectangle(); mBoundingBox = QgsRectangle();
mCoordinateSequence.clear();
QgsAbstractGeometry::clearCache(); QgsAbstractGeometry::clearCache();
} }


QgsCoordinateSequence QgsGeometryCollection::coordinateSequence() const QgsCoordinateSequence QgsGeometryCollection::coordinateSequence() const
{ {
if ( !mCoordinateSequence.isEmpty() ) QgsCoordinateSequence sequence;
return mCoordinateSequence;

QVector< QgsAbstractGeometry * >::const_iterator geomIt = mGeometries.constBegin(); QVector< QgsAbstractGeometry * >::const_iterator geomIt = mGeometries.constBegin();
for ( ; geomIt != mGeometries.constEnd(); ++geomIt ) for ( ; geomIt != mGeometries.constEnd(); ++geomIt )
{ {
Expand All @@ -438,18 +435,15 @@ QgsCoordinateSequence QgsGeometryCollection::coordinateSequence() const
QgsCoordinateSequence::const_iterator cIt = geomCoords.constBegin(); QgsCoordinateSequence::const_iterator cIt = geomCoords.constBegin();
for ( ; cIt != geomCoords.constEnd(); ++cIt ) for ( ; cIt != geomCoords.constEnd(); ++cIt )
{ {
mCoordinateSequence.push_back( *cIt ); sequence.push_back( *cIt );
} }
} }


return mCoordinateSequence; return sequence;
} }


int QgsGeometryCollection::nCoordinates() const int QgsGeometryCollection::nCoordinates() const
{ {
if ( !mCoordinateSequence.isEmpty() )
return QgsAbstractGeometry::nCoordinates();

int count = 0; int count = 0;


QVector< QgsAbstractGeometry * >::const_iterator geomIt = mGeometries.constBegin(); QVector< QgsAbstractGeometry * >::const_iterator geomIt = mGeometries.constBegin();
Expand Down
1 change: 0 additions & 1 deletion src/core/geometry/qgsgeometrycollection.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
private: private:


mutable QgsRectangle mBoundingBox; mutable QgsRectangle mBoundingBox;
mutable QgsCoordinateSequence mCoordinateSequence;
}; };


// clazy:excludeall=qstring-allocations // clazy:excludeall=qstring-allocations
Expand Down
3 changes: 1 addition & 2 deletions src/core/geometry/qgssurface.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -75,9 +75,8 @@ class CORE_EXPORT QgsSurface: public QgsAbstractGeometry
#endif #endif
protected: protected:


virtual void clearCache() const override { mBoundingBox = QgsRectangle(); mCoordinateSequence.clear(); QgsAbstractGeometry::clearCache(); } virtual void clearCache() const override { mBoundingBox = QgsRectangle(); QgsAbstractGeometry::clearCache(); }


mutable QgsCoordinateSequence mCoordinateSequence;
mutable QgsRectangle mBoundingBox; mutable QgsRectangle mBoundingBox;
}; };


Expand Down

0 comments on commit 507a93c

Please sign in to comment.