Skip to content

Commit 448e769

Browse files
committed
Use std::unique_ptr in QgsGeometryGapCheck
1 parent 1192f94 commit 448e769

File tree

1 file changed

+19
-28
lines changed

1 file changed

+19
-28
lines changed

src/analysis/vector/geometry_checker/qgsgeometrygapcheck.cpp

+19-28
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121

2222
void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors, QStringList &messages, QAtomicInt *progressCounter, const QMap<QString, QgsFeatureIds> &ids ) const
2323
{
24-
if ( progressCounter ) progressCounter->fetchAndAddRelaxed( 1 );
24+
if ( progressCounter )
25+
progressCounter->fetchAndAddRelaxed( 1 );
2526

2627
QVector<QgsAbstractGeometry *> geomList;
2728

@@ -41,7 +42,7 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
4142

4243
// Create union of geometry
4344
QString errMsg;
44-
QgsAbstractGeometry *unionGeom = geomEngine->combine( geomList, &errMsg );
45+
std::unique_ptr<QgsAbstractGeometry> unionGeom( geomEngine->combine( geomList, &errMsg ) );
4546
qDeleteAll( geomList );
4647
if ( !unionGeom )
4748
{
@@ -50,36 +51,32 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
5051
}
5152

5253
// Get envelope of union
53-
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( unionGeom, mContext->tolerance );
54-
QgsAbstractGeometry *envelope = geomEngine->envelope( &errMsg );
54+
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( unionGeom.get(), mContext->tolerance );
55+
std::unique_ptr<QgsAbstractGeometry> envelope( geomEngine->envelope( &errMsg ) );
5556
if ( !envelope )
5657
{
5758
messages.append( tr( "Gap check: %1" ).arg( errMsg ) );
58-
delete unionGeom;
5959
return;
6060
}
6161

6262
// Buffer envelope
63-
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( envelope, mContext->tolerance );
63+
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( envelope.get(), mContext->tolerance );
6464
QgsAbstractGeometry *bufEnvelope = geomEngine->buffer( 2, 0, GEOSBUF_CAP_SQUARE, GEOSBUF_JOIN_MITRE, 4. ); //#spellok //#spellok
65-
delete envelope;
66-
envelope = bufEnvelope;
65+
envelope.reset( bufEnvelope );
6766

6867
// Compute difference between envelope and union to obtain gap polygons
69-
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( envelope, mContext->tolerance );
70-
QgsAbstractGeometry *diffGeom = geomEngine->difference( unionGeom, &errMsg );
68+
geomEngine = QgsGeometryCheckerUtils::createGeomEngine( envelope.get(), mContext->tolerance );
69+
std::unique_ptr<QgsAbstractGeometry> diffGeom( geomEngine->difference( unionGeom.get(), &errMsg ) );
7170
if ( !diffGeom )
7271
{
7372
messages.append( tr( "Gap check: %1" ).arg( errMsg ) );
74-
delete unionGeom;
75-
delete diffGeom;
7673
return;
7774
}
7875

7976
// For each gap polygon which does not lie on the boundary, get neighboring polygons and add error
8077
for ( int iPart = 0, nParts = diffGeom->partCount(); iPart < nParts; ++iPart )
8178
{
82-
QgsAbstractGeometry *gapGeom = QgsGeometryCheckerUtils::getGeomPart( diffGeom, iPart )->clone();
79+
std::unique_ptr<QgsAbstractGeometry> gapGeom( QgsGeometryCheckerUtils::getGeomPart( diffGeom.get(), iPart )->clone() );
8380
// Skip the gap between features and boundingbox
8481
if ( gapGeom->boundingBox() == envelope->boundingBox() )
8582
{
@@ -99,7 +96,7 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
9996
QgsGeometryCheckerUtils::LayerFeatures layerFeatures( mContext->featurePools, featureIds.keys(), gapAreaBBox, mCompatibleGeometryTypes );
10097
for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures )
10198
{
102-
if ( QgsGeometryCheckerUtils::sharedEdgeLength( gapGeom, layerFeature.geometry(), mContext->reducedTolerance ) > 0 )
99+
if ( QgsGeometryCheckerUtils::sharedEdgeLength( gapGeom.get(), layerFeature.geometry(), mContext->reducedTolerance ) > 0 )
103100
{
104101
neighboringIds[layerFeature.layer().id()].insert( layerFeature.feature().id() );
105102
gapAreaBBox.combineExtentWith( layerFeature.geometry()->boundingBox() );
@@ -108,17 +105,14 @@ void QgsGeometryGapCheck::collectErrors( QList<QgsGeometryCheckError *> &errors,
108105

109106
if ( neighboringIds.isEmpty() )
110107
{
111-
delete gapGeom;
112108
continue;
113109
}
114110

115111
// Add error
116-
errors.append( new QgsGeometryGapCheckError( this, "", gapGeom, neighboringIds, gapGeom->area(), gapAreaBBox ) );
112+
double area = gapGeom->area();
113+
errors.append( new QgsGeometryGapCheckError( this, QString(), gapGeom.release(), neighboringIds, area, gapAreaBBox ) );
117114

118115
}
119-
delete unionGeom;
120-
delete envelope;
121-
delete diffGeom;
122116
}
123117

124118
void QgsGeometryGapCheck::fixError( QgsGeometryCheckError *error, int method, const QMap<QString, int> & /*mergeAttributeIndices*/, Changes &changes ) const
@@ -158,7 +152,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
158152
for ( const QString &layerId : err->neighbors().keys() )
159153
{
160154
QgsFeaturePool *featurePool = mContext->featurePools[ layerId ];
161-
QgsAbstractGeometry *errLayerGeom = errGeometry->clone();
155+
std::unique_ptr<QgsAbstractGeometry> errLayerGeom( errGeometry->clone() );
162156
errLayerGeom->transform( featurePool->getLayerToMapTransform(), QgsCoordinateTransform::ReverseTransform );
163157

164158
for ( QgsFeatureId testId : err->neighbors()[layerId] )
@@ -172,7 +166,7 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
172166
const QgsAbstractGeometry *testGeom = featureGeom.constGet();
173167
for ( int iPart = 0, nParts = testGeom->partCount(); iPart < nParts; ++iPart )
174168
{
175-
double len = QgsGeometryCheckerUtils::sharedEdgeLength( errLayerGeom, QgsGeometryCheckerUtils::getGeomPart( testGeom, iPart ), mContext->reducedTolerance );
169+
double len = QgsGeometryCheckerUtils::sharedEdgeLength( errLayerGeom.get(), QgsGeometryCheckerUtils::getGeomPart( testGeom, iPart ), mContext->reducedTolerance );
176170
if ( len > maxVal )
177171
{
178172
maxVal = len;
@@ -182,7 +176,6 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
182176
}
183177
}
184178
}
185-
delete errLayerGeom;
186179
}
187180

188181
if ( maxVal == 0. )
@@ -192,21 +185,19 @@ bool QgsGeometryGapCheck::mergeWithNeighbor( QgsGeometryGapCheckError *err, Chan
192185

193186
// Merge geometries
194187
QgsFeaturePool *featurePool = mContext->featurePools[ mergeLayerId ];
195-
QgsAbstractGeometry *errLayerGeom = errGeometry->clone();
188+
std::unique_ptr<QgsAbstractGeometry> errLayerGeom( errGeometry->clone() );
196189
errLayerGeom->transform( featurePool->getLayerToMapTransform(), QgsCoordinateTransform::ReverseTransform );
197190
QgsGeometry mergeFeatureGeom = mergeFeature.geometry();
198191
const QgsAbstractGeometry *mergeGeom = mergeFeatureGeom.constGet();
199-
std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine( errLayerGeom, mContext->reducedTolerance );
200-
QgsAbstractGeometry *combinedGeom = geomEngine->combine( QgsGeometryCheckerUtils::getGeomPart( mergeGeom, mergePartIdx ), &errMsg );
201-
delete errLayerGeom;
192+
std::unique_ptr< QgsGeometryEngine > geomEngine = QgsGeometryCheckerUtils::createGeomEngine( errLayerGeom.get(), mContext->reducedTolerance );
193+
std::unique_ptr<QgsAbstractGeometry> combinedGeom( geomEngine->combine( QgsGeometryCheckerUtils::getGeomPart( mergeGeom, mergePartIdx ), &errMsg ) );
202194
if ( !combinedGeom || combinedGeom->isEmpty() || !QgsWkbTypes::isSingleType( combinedGeom->wkbType() ) )
203195
{
204-
delete combinedGeom;
205196
return false;
206197
}
207198

208199
// Add merged polygon to destination geometry
209-
replaceFeatureGeometryPart( mergeLayerId, mergeFeature, mergePartIdx, combinedGeom, changes );
200+
replaceFeatureGeometryPart( mergeLayerId, mergeFeature, mergePartIdx, combinedGeom.release(), changes );
210201

211202
return true;
212203
}

0 commit comments

Comments
 (0)