Skip to content

Commit 270c45d

Browse files
authored
Merge pull request #5254 from nyalldawson/geometry_coverage
Geometry unit test coverage
2 parents 7705179 + ac7fede commit 270c45d

26 files changed

+2919
-227
lines changed

python/core/geometry/qgsgeometrycollection.sip

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Adds a geometry and takes ownership. Returns true in case of success.
6060
:rtype: bool
6161
%End
6262

63-
virtual bool insertGeometry( QgsAbstractGeometry *g, int index /Transfer/ );
63+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
6464
%Docstring
6565
Inserts a geometry before a specified index and takes ownership. Returns true in case of success.
6666
\param g geometry to insert. Ownership is transferred to the collection.

python/core/geometry/qgsmulticurve.sip

+4-7
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,22 @@ class QgsMultiCurve: QgsGeometryCollection
2424

2525
virtual QgsMultiCurve *clone() const /Factory/;
2626

27-
virtual QgsMultiCurve *toCurveType() const /Factory/;
27+
virtual void clear();
2828

29+
virtual QgsMultiCurve *toCurveType() const /Factory/;
2930

3031
virtual bool fromWkt( const QString &wkt );
3132

32-
3333
virtual QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3434

3535
virtual QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3636

3737
virtual QString asJSON( int precision = 17 ) const;
3838

39-
4039
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
4140

42-
%Docstring
43-
Adds a geometry and takes ownership. Returns true in case of success
44-
:rtype: bool
45-
%End
41+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
42+
4643

4744
QgsMultiCurve *reversed() const /Factory/;
4845
%Docstring

python/core/geometry/qgsmultilinestring.sip

+4-6
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,25 @@ class QgsMultiLineString: QgsMultiCurve
2020
%End
2121
public:
2222
QgsMultiLineString();
23+
2324
virtual QString geometryType() const;
2425

2526
virtual QgsMultiLineString *clone() const /Factory/;
2627

28+
virtual void clear();
2729

2830
virtual bool fromWkt( const QString &wkt );
2931

30-
3132
virtual QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3233

3334
virtual QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3435

3536
virtual QString asJSON( int precision = 17 ) const;
3637

37-
3838
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
3939

40-
%Docstring
41-
Adds a geometry and takes ownership. Returns true in case of success
42-
:rtype: bool
43-
%End
40+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
41+
4442

4543
virtual QgsMultiCurve *toCurveType() const /Factory/;
4644

python/core/geometry/qgsmultipoint.sip

+3-7
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,28 @@ class QgsMultiPointV2: QgsGeometryCollection
2020
%End
2121
public:
2222
QgsMultiPointV2();
23+
2324
virtual QString geometryType() const;
2425

2526
virtual QgsMultiPointV2 *clone() const /Factory/;
2627

2728
virtual QgsMultiPointV2 *toCurveType() const /Factory/;
2829

29-
3030
virtual bool fromWkt( const QString &wkt );
3131

32+
virtual void clear();
3233

3334
virtual QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3435

3536
virtual QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3637

3738
virtual QString asJSON( int precision = 17 ) const;
3839

39-
4040
virtual int nCoordinates() const;
4141

42-
4342
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
4443

45-
%Docstring
46-
Adds a geometry and takes ownership. Returns true in case of success
47-
:rtype: bool
48-
%End
44+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
4945

5046
virtual QgsAbstractGeometry *boundary() const /Factory/;
5147

python/core/geometry/qgsmultipolygon.sip

+4-7
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,22 @@ class QgsMultiPolygonV2: QgsMultiSurface
2222
QgsMultiPolygonV2();
2323
virtual QString geometryType() const;
2424

25-
virtual QgsMultiPolygonV2 *clone() const /Factory/;
25+
virtual void clear();
2626

27+
virtual QgsMultiPolygonV2 *clone() const /Factory/;
2728

2829
virtual bool fromWkt( const QString &wkt );
2930

30-
3131
virtual QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3232

3333
virtual QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3434

3535
virtual QString asJSON( int precision = 17 ) const;
3636

37-
3837
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
3938

40-
%Docstring
41-
Adds a geometry and takes ownership. Returns true in case of success
42-
:rtype: bool
43-
%End
39+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
40+
4441

4542
virtual QgsMultiSurface *toCurveType() const /Factory/;
4643

python/core/geometry/qgsmultisurface.sip

+3-8
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,23 @@ class QgsMultiSurface: QgsGeometryCollection
2222
QgsMultiSurface();
2323
virtual QString geometryType() const;
2424

25+
virtual void clear();
26+
2527
virtual QgsMultiSurface *clone() const /Factory/;
2628

2729
virtual QgsMultiSurface *toCurveType() const /Factory/;
2830

29-
3031
virtual bool fromWkt( const QString &wkt );
3132

32-
3333
virtual QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3434

3535
virtual QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
3636

3737
virtual QString asJSON( int precision = 17 ) const;
3838

39-
40-
4139
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
4240

43-
%Docstring
44-
Adds a geometry and takes ownership. Returns true in case of success
45-
:rtype: bool
46-
%End
41+
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );
4742

4843
virtual QgsAbstractGeometry *boundary() const /Factory/;
4944

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/qgsgeometrycollection.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,10 @@ bool QgsGeometryCollection::fromCollectionWkt( const QString &wkt, const QList<Q
530530
QPair<QgsWkbTypes::Type, QString> parts = QgsGeometryUtils::wktReadBlock( wkt );
531531

532532
if ( QgsWkbTypes::flatType( parts.first ) != QgsWkbTypes::flatType( wkbType() ) )
533+
{
534+
qDeleteAll( subtypes );
533535
return false;
536+
}
534537
mWkbType = parts.first;
535538

536539
QString defChildWkbType = QStringLiteral( "%1%2%3 " ).arg( defaultChildWkbType, is3D() ? "Z" : "", isMeasure() ? "M" : "" );

src/core/geometry/qgsgeometrycollection.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
6969
* \param g geometry to insert. Ownership is transferred to the collection.
7070
* \param index position to insert geometry before
7171
*/
72-
virtual bool insertGeometry( QgsAbstractGeometry *g, int index SIP_TRANSFER );
72+
virtual bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index );
7373

7474
/** Removes a geometry from the collection.
7575
* \param nr index of geometry to remove

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

0 commit comments

Comments
 (0)