Skip to content

Commit ac7fede

Browse files
committed
Modernize some geometry code
1 parent cc4fb39 commit ac7fede

10 files changed

+46
-77
lines changed

src/core/geometry/qgscircularstring.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qgslogger.h"
2727
#include <QPainter>
2828
#include <QPainterPath>
29+
#include <memory>
2930

3031
QgsCircularString::QgsCircularString(): QgsCurve()
3132
{
@@ -301,9 +302,8 @@ QString QgsCircularString::asWkt( int precision ) const
301302
QDomElement QgsCircularString::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
302303
{
303304
// GML2 does not support curves
304-
QgsLineString *line = curveToLine();
305+
std::unique_ptr< QgsLineString > line( curveToLine() );
305306
QDomElement gml = line->asGML2( doc, precision, ns );
306-
delete line;
307307
return gml;
308308
}
309309

@@ -324,9 +324,8 @@ QDomElement QgsCircularString::asGML3( QDomDocument &doc, int precision, const Q
324324
QString QgsCircularString::asJSON( int precision ) const
325325
{
326326
// GeoJSON does not support curves
327-
QgsLineString *line = curveToLine();
327+
std::unique_ptr< QgsLineString > line( curveToLine() );
328328
QString json = line->asJSON( precision );
329-
delete line;
330329
return json;
331330
}
332331

src/core/geometry/qgscompoundcurve.cpp

+6-9
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "qgswkbptr.h"
2424
#include <QPainter>
2525
#include <QPainterPath>
26-
26+
#include <memory>
2727

2828
QgsCompoundCurve::QgsCompoundCurve(): QgsCurve()
2929
{
@@ -263,9 +263,8 @@ QString QgsCompoundCurve::asWkt( int precision ) const
263263
QDomElement QgsCompoundCurve::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
264264
{
265265
// GML2 does not support curves
266-
QgsLineString *line = curveToLine();
266+
std::unique_ptr< QgsLineString > line( curveToLine() );
267267
QDomElement gml = line->asGML2( doc, precision, ns );
268-
delete line;
269268
return gml;
270269
}
271270

@@ -286,9 +285,8 @@ QDomElement QgsCompoundCurve::asGML3( QDomDocument &doc, int precision, const QS
286285
QString QgsCompoundCurve::asJSON( int precision ) const
287286
{
288287
// GeoJSON does not support curves
289-
QgsLineString *line = curveToLine();
288+
std::unique_ptr< QgsLineString > line( curveToLine() );
290289
QString json = line->asJSON( precision );
291-
delete line;
292290
return json;
293291
}
294292

@@ -373,12 +371,11 @@ QgsLineString *QgsCompoundCurve::curveToLine( double tolerance, SegmentationTole
373371
{
374372
QList< QgsCurve * >::const_iterator curveIt = mCurves.constBegin();
375373
QgsLineString *line = new QgsLineString();
376-
QgsLineString *currentLine = nullptr;
374+
std::unique_ptr< QgsLineString > currentLine;
377375
for ( ; curveIt != mCurves.constEnd(); ++curveIt )
378376
{
379-
currentLine = ( *curveIt )->curveToLine( tolerance, toleranceType );
380-
line->append( currentLine );
381-
delete currentLine;
377+
currentLine.reset( ( *curveIt )->curveToLine( tolerance, toleranceType ) );
378+
line->append( currentLine.get() );
382379
}
383380
return line;
384381
}

src/core/geometry/qgscurvepolygon.cpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -333,20 +333,19 @@ QDomElement QgsCurvePolygon::asGML2( QDomDocument &doc, int precision, const QSt
333333
// GML2 does not support curves
334334
QDomElement elemPolygon = doc.createElementNS( ns, QStringLiteral( "Polygon" ) );
335335
QDomElement elemOuterBoundaryIs = doc.createElementNS( ns, QStringLiteral( "outerBoundaryIs" ) );
336-
QgsLineString *exteriorLineString = exteriorRing()->curveToLine();
336+
std::unique_ptr< QgsLineString > exteriorLineString( exteriorRing()->curveToLine() );
337337
QDomElement outerRing = exteriorLineString->asGML2( doc, precision, ns );
338338
outerRing.toElement().setTagName( QStringLiteral( "LinearRing" ) );
339339
elemOuterBoundaryIs.appendChild( outerRing );
340-
delete exteriorLineString;
341340
elemPolygon.appendChild( elemOuterBoundaryIs );
341+
std::unique_ptr< QgsLineString > interiorLineString;
342342
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
343343
{
344344
QDomElement elemInnerBoundaryIs = doc.createElementNS( ns, QStringLiteral( "innerBoundaryIs" ) );
345-
QgsLineString *interiorLineString = interiorRing( i )->curveToLine();
345+
interiorLineString.reset( interiorRing( i )->curveToLine() );
346346
QDomElement innerRing = interiorLineString->asGML2( doc, precision, ns );
347347
innerRing.toElement().setTagName( QStringLiteral( "LinearRing" ) );
348348
elemInnerBoundaryIs.appendChild( innerRing );
349-
delete interiorLineString;
350349
elemPolygon.appendChild( elemInnerBoundaryIs );
351350
}
352351
return elemPolygon;
@@ -383,19 +382,18 @@ QString QgsCurvePolygon::asJSON( int precision ) const
383382
// GeoJSON does not support curves
384383
QString json = QStringLiteral( "{\"type\": \"Polygon\", \"coordinates\": [" );
385384

386-
QgsLineString *exteriorLineString = exteriorRing()->curveToLine();
385+
std::unique_ptr< QgsLineString > exteriorLineString( exteriorRing()->curveToLine() );
387386
QgsPointSequence exteriorPts;
388387
exteriorLineString->points( exteriorPts );
389388
json += QgsGeometryUtils::pointsToJSON( exteriorPts, precision ) + ", ";
390-
delete exteriorLineString;
391389

390+
std::unique_ptr< QgsLineString > interiorLineString;
392391
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
393392
{
394-
QgsLineString *interiorLineString = interiorRing( i )->curveToLine();
393+
interiorLineString.reset( interiorRing( i )->curveToLine() );
395394
QgsPointSequence interiorPts;
396395
interiorLineString->points( interiorPts );
397396
json += QgsGeometryUtils::pointsToJSON( interiorPts, precision ) + ", ";
398-
delete interiorLineString;
399397
}
400398
if ( json.endsWith( QLatin1String( ", " ) ) )
401399
{

src/core/geometry/qgsgeometryeditutils.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -274,15 +274,14 @@ std::unique_ptr<QgsAbstractGeometry> QgsGeometryEditUtils::avoidIntersections( c
274274
}
275275

276276

277-
QgsAbstractGeometry *combinedGeometries = geomEngine->combine( nearGeometries );
277+
std::unique_ptr< QgsAbstractGeometry > combinedGeometries( geomEngine->combine( nearGeometries ) );
278278
qDeleteAll( nearGeometries );
279279
if ( !combinedGeometries )
280280
{
281281
return nullptr;
282282
}
283283

284-
std::unique_ptr< QgsAbstractGeometry > diffGeom( geomEngine->difference( combinedGeometries ) );
284+
std::unique_ptr< QgsAbstractGeometry > diffGeom( geomEngine->difference( combinedGeometries.get() ) );
285285

286-
delete combinedGeometries;
287286
return diffGeom;
288287
}

src/core/geometry/qgsgeos.cpp

+8-15
Original file line numberDiff line numberDiff line change
@@ -708,14 +708,14 @@ GEOSGeometry *QgsGeos::linePointDifference( GEOSGeometry *GEOSsplitPoint ) const
708708
{
709709
int type = GEOSGeomTypeId_r( geosinit.ctxt, mGeos );
710710

711-
QgsMultiCurve *multiCurve = nullptr;
711+
std::unique_ptr< QgsMultiCurve > multiCurve;
712712
if ( type == GEOS_MULTILINESTRING )
713713
{
714-
multiCurve = qgsgeometry_cast<QgsMultiCurve *>( mGeometry->clone() );
714+
multiCurve.reset( qgsgeometry_cast<QgsMultiCurve *>( mGeometry->clone() ) );
715715
}
716716
else if ( type == GEOS_LINESTRING )
717717
{
718-
multiCurve = new QgsMultiCurve();
718+
multiCurve.reset( new QgsMultiCurve() );
719719
multiCurve->addGeometry( mGeometry->clone() );
720720
}
721721
else
@@ -729,11 +729,10 @@ GEOSGeometry *QgsGeos::linePointDifference( GEOSGeometry *GEOSsplitPoint ) const
729729
}
730730

731731

732-
QgsAbstractGeometry *splitGeom = fromGeos( GEOSsplitPoint );
733-
QgsPoint *splitPoint = qgsgeometry_cast<QgsPoint *>( splitGeom );
732+
std::unique_ptr< QgsAbstractGeometry > splitGeom( fromGeos( GEOSsplitPoint ) );
733+
QgsPoint *splitPoint = qgsgeometry_cast<QgsPoint *>( splitGeom.get() );
734734
if ( !splitPoint )
735735
{
736-
delete splitGeom;
737736
return nullptr;
738737
}
739738

@@ -765,8 +764,6 @@ GEOSGeometry *QgsGeos::linePointDifference( GEOSGeometry *GEOSsplitPoint ) const
765764
}
766765
}
767766

768-
delete splitGeom;
769-
delete multiCurve;
770767
return asGeos( &lines, mPrecision );
771768
}
772769

@@ -1698,13 +1695,13 @@ bool QgsGeos::isSimple( QString *errorMsg ) const
16981695

16991696
GEOSCoordSequence *QgsGeos::createCoordinateSequence( const QgsCurve *curve, double precision, bool forceClose )
17001697
{
1701-
bool segmentize = false;
1698+
std::unique_ptr< QgsLineString > segmentized;
17021699
const QgsLineString *line = qgsgeometry_cast<const QgsLineString *>( curve );
17031700

17041701
if ( !line )
17051702
{
1706-
line = curve->curveToLine();
1707-
segmentize = true;
1703+
segmentized.reset( curve->curveToLine() );
1704+
line = segmentized.get();
17081705
}
17091706

17101707
if ( !line )
@@ -1776,10 +1773,6 @@ GEOSCoordSequence *QgsGeos::createCoordinateSequence( const QgsCurve *curve, dou
17761773
}
17771774
CATCH_GEOS( nullptr )
17781775

1779-
if ( segmentize )
1780-
{
1781-
delete line;
1782-
}
17831776
return coordSeq;
17841777
}
17851778

src/core/geometry/qgsinternalgeometryengine.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,22 @@ QgsGeometry QgsInternalGeometryEngine::extrude( double x, double y ) const
6464

6565
if ( !linesToProcess.empty() )
6666
{
67+
std::unique_ptr< QgsLineString > secondline;
6768
for ( QgsLineString *line : qgsAsConst( linesToProcess ) )
6869
{
6970
QTransform transform = QTransform::fromTranslate( x, y );
7071

71-
QgsLineString *secondline = line->reversed();
72+
secondline.reset( line->reversed() );
7273
secondline->transform( transform );
7374

74-
line->append( secondline );
75+
line->append( secondline.get() );
7576
line->addVertex( line->pointN( 0 ) );
7677

7778
polygon = new QgsPolygonV2();
7879
polygon->setExteriorRing( line );
7980

8081
if ( multipolygon )
8182
multipolygon->addGeometry( polygon );
82-
83-
delete secondline;
8483
}
8584

8685
if ( multipolygon )

src/core/geometry/qgsmulticurve.cpp

+5-8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ email : marco.hugentobler at sourcepole dot com
2121
#include "qgsgeometryutils.h"
2222
#include "qgslinestring.h"
2323
#include "qgsmultipoint.h"
24+
#include <memory>
2425

2526
QgsMultiCurve::QgsMultiCurve()
2627
: QgsGeometryCollection()
@@ -64,13 +65,11 @@ QDomElement QgsMultiCurve::asGML2( QDomDocument &doc, int precision, const QStri
6465
{
6566
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )
6667
{
67-
QgsLineString *lineString = static_cast<const QgsCurve *>( geom )->curveToLine();
68+
std::unique_ptr< QgsLineString > lineString( static_cast<const QgsCurve *>( geom )->curveToLine() );
6869

6970
QDomElement elemLineStringMember = doc.createElementNS( ns, QStringLiteral( "lineStringMember" ) );
7071
elemLineStringMember.appendChild( lineString->asGML2( doc, precision, ns ) );
7172
elemMultiLineString.appendChild( elemLineStringMember );
72-
73-
delete lineString;
7473
}
7574
}
7675

@@ -103,11 +102,10 @@ QString QgsMultiCurve::asJSON( int precision ) const
103102
{
104103
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )
105104
{
106-
QgsLineString *lineString = static_cast<const QgsCurve *>( geom )->curveToLine();
105+
std::unique_ptr< QgsLineString > lineString( static_cast<const QgsCurve *>( geom )->curveToLine() );
107106
QgsPointSequence pts;
108107
lineString->points( pts );
109108
json += QgsGeometryUtils::pointsToJSON( pts, precision ) + ", ";
110-
delete lineString;
111109
}
112110
}
113111
if ( json.endsWith( QLatin1String( ", " ) ) )
@@ -168,7 +166,7 @@ QgsMultiCurve *QgsMultiCurve::reversed() const
168166

169167
QgsAbstractGeometry *QgsMultiCurve::boundary() const
170168
{
171-
QgsMultiPointV2 *multiPoint = new QgsMultiPointV2();
169+
std::unique_ptr< QgsMultiPointV2 > multiPoint( new QgsMultiPointV2() );
172170
for ( int i = 0; i < mGeometries.size(); ++i )
173171
{
174172
if ( QgsCurve *curve = qgsgeometry_cast<QgsCurve *>( mGeometries.at( i ) ) )
@@ -182,8 +180,7 @@ QgsAbstractGeometry *QgsMultiCurve::boundary() const
182180
}
183181
if ( multiPoint->numGeometries() == 0 )
184182
{
185-
delete multiPoint;
186183
return nullptr;
187184
}
188-
return multiPoint;
185+
return multiPoint.release();
189186
}

src/core/geometry/qgsmultipolygon.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,18 @@ QString QgsMultiPolygonV2::asJSON( int precision ) const
9494

9595
const QgsPolygonV2 *polygon = static_cast<const QgsPolygonV2 *>( geom );
9696

97-
QgsLineString *exteriorLineString = polygon->exteriorRing()->curveToLine();
97+
std::unique_ptr< QgsLineString > exteriorLineString( polygon->exteriorRing()->curveToLine() );
9898
QgsPointSequence exteriorPts;
9999
exteriorLineString->points( exteriorPts );
100100
json += QgsGeometryUtils::pointsToJSON( exteriorPts, precision ) + ", ";
101-
delete exteriorLineString;
102101

102+
std::unique_ptr< QgsLineString > interiorLineString;
103103
for ( int i = 0, n = polygon->numInteriorRings(); i < n; ++i )
104104
{
105-
QgsLineString *interiorLineString = polygon->interiorRing( i )->curveToLine();
105+
interiorLineString.reset( polygon->interiorRing( i )->curveToLine() );
106106
QgsPointSequence interiorPts;
107107
interiorLineString->points( interiorPts );
108108
json += QgsGeometryUtils::pointsToJSON( interiorPts, precision ) + ", ";
109-
delete interiorLineString;
110109
}
111110
if ( json.endsWith( QLatin1String( ", " ) ) )
112111
{
@@ -171,7 +170,7 @@ QgsMultiSurface *QgsMultiPolygonV2::toCurveType() const
171170

172171
QgsAbstractGeometry *QgsMultiPolygonV2::boundary() const
173172
{
174-
QgsMultiLineString *multiLine = new QgsMultiLineString();
173+
std::unique_ptr< QgsMultiLineString > multiLine( new QgsMultiLineString() );
175174
for ( int i = 0; i < mGeometries.size(); ++i )
176175
{
177176
if ( QgsPolygonV2 *polygon = qgsgeometry_cast<QgsPolygonV2 *>( mGeometries.at( i ) ) )
@@ -198,10 +197,9 @@ QgsAbstractGeometry *QgsMultiPolygonV2::boundary() const
198197
}
199198
if ( multiLine->numGeometries() == 0 )
200199
{
201-
delete multiLine;
202200
return nullptr;
203201
}
204-
return multiLine;
202+
return multiLine.release();
205203
}
206204

207205
bool QgsMultiPolygonV2::wktOmitChildType() const

0 commit comments

Comments
 (0)