Skip to content

Commit 884c3ba

Browse files
committed
Use constGeometry to avoid some QgsFeature detachments
1 parent 31d981c commit 884c3ba

12 files changed

+31
-31
lines changed

src/app/nodetool/qgsmaptoolnodetool.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ void QgsMapToolNodeTool::createTopologyRubberBands()
7878
}
7979
// Get VertexId of snapped vertex
8080
QgsVertexId vid;
81-
if ( !feature.geometry()->vertexIdFromVertexNr( snapResult.snappedVertexNr, vid ) )
81+
if ( !feature.constGeometry()->vertexIdFromVertexNr( snapResult.snappedVertexNr, vid ) )
8282
{
8383
continue;
8484
}
8585
// Add rubberband if not already added
8686
if ( !mMoveRubberBands.contains( snapFeatureId ) )
8787
{
88-
QgsGeometryRubberBand* rb = new QgsGeometryRubberBand( mCanvas, feature.geometry()->type() );
88+
QgsGeometryRubberBand* rb = new QgsGeometryRubberBand( mCanvas, feature.constGeometry()->type() );
8989
QSettings settings;
9090
QColor color(
9191
settings.value( "/qgis/digitizing/line_color_red", 255 ).toInt(),
@@ -96,14 +96,14 @@ void QgsMapToolNodeTool::createTopologyRubberBands()
9696
rb->setOutlineColor( color );
9797
rb->setBrushStyle( Qt::NoBrush );
9898
rb->setOutlineWidth( settings.value( "/qgis/digitizing/line_width", 1 ).toInt() );
99-
QgsAbstractGeometryV2* rbGeom = feature.geometry()->geometry()->clone();
99+
QgsAbstractGeometryV2* rbGeom = feature.constGeometry()->geometry()->clone();
100100
if ( mCanvas->mapSettings().layerTransform( vlayer ) )
101101
rbGeom->transform( *mCanvas->mapSettings().layerTransform( vlayer ) );
102102
rb->setGeometry( rbGeom );
103103
mMoveRubberBands.insert( snapFeatureId, rb );
104104
}
105105
// Add to list of vertices to be moved
106-
mMoveVertices[snapFeatureId].append( qMakePair( vid, toMapCoordinates( vlayer, feature.geometry()->geometry()->vertexAt( vid ) ) ) );
106+
mMoveVertices[snapFeatureId].append( qMakePair( vid, toMapCoordinates( vlayer, feature.constGeometry()->geometry()->vertexAt( vid ) ) ) );
107107
}
108108
}
109109
}
@@ -226,7 +226,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QgsMapMouseEvent* e )
226226
if ( snapResults.size() < 1 )
227227
{
228228
QgsFeature feature = getFeatureAtPoint( e );
229-
if ( !feature.geometry() )
229+
if ( !feature.constGeometry() )
230230
{
231231
emit messageEmitted( tr( "could not snap to a segment on the current layer." ) );
232232
return;
@@ -366,7 +366,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QgsMapMouseEvent* e )
366366
mSelectedFeature->deselectAllVertexes();
367367

368368
QgsFeature feature = getFeatureAtPoint( e );
369-
if ( !feature.geometry() )
369+
if ( !feature.constGeometry() )
370370
return;
371371

372372
mAnother = feature.id();

src/core/geometry/qgsgeometryeditutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,10 @@ QgsAbstractGeometryV2* QgsGeometryEditUtils::avoidIntersections( const QgsAbstra
269269
if ( ignoreIds.contains( f.id() ) )
270270
continue;
271271

272-
if ( !f.geometry() )
272+
if ( !f.constGeometry() )
273273
continue;
274274

275-
nearGeometries << f.geometry()->geometry()->clone();
275+
nearGeometries << f.constGeometry()->geometry()->clone();
276276
}
277277
}
278278
}

src/core/qgstracer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ void resetGraph( QgsTracerGraph& g )
403403
}
404404

405405

406-
void extractLinework( QgsGeometry* g, QgsMultiPolyline& mpl )
406+
void extractLinework( const QgsGeometry* g, QgsMultiPolyline& mpl )
407407
{
408408
switch ( QgsWKBTypes::flatType( g->geometry()->wkbType() ) )
409409
{
@@ -470,7 +470,7 @@ bool QgsTracer::initGraph()
470470
QgsFeatureIterator fi = vl->getFeatures( request );
471471
while ( fi.nextFeature( f ) )
472472
{
473-
if ( !f.geometry() )
473+
if ( !f.constGeometry() )
474474
continue;
475475

476476
if ( !ct.isShortCircuited() )
@@ -485,7 +485,7 @@ bool QgsTracer::initGraph()
485485
}
486486
}
487487

488-
extractLinework( f.geometry(), mpl );
488+
extractLinework( f.constGeometry(), mpl );
489489

490490
++featuresCounted;
491491
if ( mMaxFeatureCount != 0 && featuresCounted >= mMaxFeatureCount )

src/core/qgsvectorfilewriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature )
17961796

17971797
if ( mWkbType != QgsWKBTypes::NoGeometry )
17981798
{
1799-
if ( feature.geometry() && feature.geometry()->geometry() )
1799+
if ( feature.constGeometry() && !feature.constGeometry()->isEmpty() )
18001800
{
18011801
// build geometry from WKB
18021802
QgsGeometry* geom = feature.geometry();

src/core/qgsvectorlayerimport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
361361
{
362362
try
363363
{
364-
if ( fet.geometry() )
364+
if ( fet.constGeometry() )
365365
{
366366
fet.geometry()->transform( *ct );
367367
}

src/core/qgsvectorlayerundocommand.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ void QgsVectorLayerUndoCommandChangeGeometry::undo()
183183
mBuffer->mChangedGeometries.remove( mFid );
184184

185185
QgsFeature f;
186-
if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.geometry() )
186+
if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.constGeometry() )
187187
{
188188
cache()->cacheGeometry( mFid, *f.constGeometry() );
189189
emit mBuffer->geometryChanged( mFid, *f.geometry() );

src/gui/qgsmapcanvas.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,9 +1086,9 @@ void QgsMapCanvas::zoomToFeatureIds( QgsVectorLayer* layer, const QgsFeatureIds&
10861086
int featureCount = 0;
10871087
while ( it.nextFeature( fet ) )
10881088
{
1089-
QgsGeometry* geom = fet.geometry();
1089+
const QgsGeometry* geom = fet.constGeometry();
10901090
QString errorMessage;
1091-
if ( !geom || !geom->geometry() )
1091+
if ( !geom || geom->isEmpty() )
10921092
{
10931093
errorMessage = tr( "Feature does not have a geometry" );
10941094
}

src/providers/grass/qgis.v.in.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ int main( int argc, char **argv )
245245
break;
246246
}
247247

248-
QgsGeometry* geometry = feature.geometry();
248+
const QgsGeometry* geometry = feature.constGeometry();
249249
if ( geometry )
250250
{
251251
// geometry type may be probably different from provider type (e.g. multi x single)
@@ -423,16 +423,16 @@ int main( int argc, char **argv )
423423
{
424424
break;
425425
}
426-
if ( !feature.geometry() )
426+
if ( !feature.constGeometry() )
427427
{
428428
continue;
429429
}
430430

431-
QList<QgsFeatureId> idList = spatialIndex.intersects( feature.geometry()->boundingBox() );
431+
QList<QgsFeatureId> idList = spatialIndex.intersects( feature.constGeometry()->boundingBox() );
432432
Q_FOREACH ( QgsFeatureId id, idList )
433433
{
434434
QgsFeature& centroid = centroids[id];
435-
if ( feature.geometry()->contains( centroid.geometry() ) )
435+
if ( feature.constGeometry()->contains( centroid.constGeometry() ) )
436436
{
437437
QgsAttributes attr = centroid.attributes();
438438
attr.append(( int )feature.id() + fidToCatPlus );
@@ -450,9 +450,9 @@ int main( int argc, char **argv )
450450

451451
int centroidsCount = centroids.size();
452452
count = 0;
453-
Q_FOREACH ( QgsFeature centroid, centroids.values() )
453+
Q_FOREACH ( const QgsFeature& centroid, centroids.values() )
454454
{
455-
QgsPoint point = centroid.geometry()->asPoint();
455+
QgsPoint point = centroid.constGeometry()->asPoint();
456456

457457
if ( centroid.attributes().size() > 0 )
458458
{

src/providers/grass/qgsgrassprovider.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,9 +1245,9 @@ void QgsGrassProvider::onFeatureAdded( QgsFeatureId fid )
12451245
return;
12461246
}
12471247
QgsFeature feature = mEditBuffer->addedFeatures().value( fid );
1248-
if ( feature.geometry() )
1248+
if ( feature.constGeometry() )
12491249
{
1250-
geometry = feature.geometry()->geometry();
1250+
geometry = feature.constGeometry()->geometry();
12511251
}
12521252
else
12531253
{
@@ -1941,7 +1941,7 @@ void QgsGrassProvider::setAddedFeaturesSymbol()
19411941
Q_FOREACH ( QgsFeatureId fid, features.keys() )
19421942
{
19431943
QgsFeature feature = features[fid];
1944-
if ( !feature.geometry() || !feature.geometry()->geometry() )
1944+
if ( !feature.constGeometry() || !feature.constGeometry()->geometry() )
19451945
{
19461946
continue;
19471947
}

src/server/qgswfsserver.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
18641864
fStr += "\"" + mTypeName + "." + QString::number( feat->id() ) + "\"";
18651865
fStr += ",\n";
18661866

1867-
QgsGeometry* geom = feat->geometry();
1867+
const QgsGeometry* geom = feat->constGeometry();
18681868
if ( geom && mWithGeom && mGeometryName != "NONE" )
18691869
{
18701870
QgsRectangle box = geom->boundingBox();
@@ -1948,7 +1948,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
19481948
if ( mWithGeom && mGeometryName != "NONE" )
19491949
{
19501950
//add geometry column (as gml)
1951-
QgsGeometry* geom = feat->geometry();
1951+
const QgsGeometry* geom = feat->constGeometry();
19521952

19531953
QDomElement geomElem = doc.createElement( "qgs:geometry" );
19541954
QDomElement gmlElem;
@@ -2021,7 +2021,7 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
20212021
if ( mWithGeom && mGeometryName != "NONE" )
20222022
{
20232023
//add geometry column (as gml)
2024-
QgsGeometry* geom = feat->geometry();
2024+
const QgsGeometry* geom = feat->constGeometry();
20252025

20262026
QDomElement geomElem = doc.createElement( "qgs:geometry" );
20272027
QDomElement gmlElem;

src/server/qgswmsserver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,7 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
22322232
QgsRectangle box;
22332233
if ( hasGeometry )
22342234
{
2235-
box = mapRender->layerExtentToOutputExtent( layer, feature.geometry()->boundingBox() );
2235+
box = mapRender->layerExtentToOutputExtent( layer, feature.constGeometry()->boundingBox() );
22362236
if ( featureBBox ) //extend feature info bounding box if requested
22372237
{
22382238
if ( !featureBBoxInitialized && featureBBox->isEmpty() )
@@ -3192,7 +3192,7 @@ QDomElement QgsWMSServer::createFeatureGML(
31923192
// always add bounding box info if feature contains geometry
31933193
if ( geom && geom->type() != QGis::UnknownGeometry && geom->type() != QGis::NoGeometry )
31943194
{
3195-
QgsRectangle box = feat->geometry()->boundingBox();
3195+
QgsRectangle box = feat->constGeometry()->boundingBox();
31963196
if ( transform )
31973197
{
31983198
try

tests/src/providers/grass/testqgsgrassprovider.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1479,7 +1479,7 @@ QList<QgsFeature> TestQgsGrassProvider::getFeatures( QgsVectorLayer *layer )
14791479

14801480
bool TestQgsGrassProvider::equal( QgsFeature feature, QgsFeature expectedFeature )
14811481
{
1482-
if ( !feature.geometry()->equals( expectedFeature.geometry() ) )
1482+
if ( !feature.constGeometry()->equals( expectedFeature.constGeometry() ) )
14831483
{
14841484
return false;
14851485
}

0 commit comments

Comments
 (0)