Skip to content
Permalink
Browse files

Use pointers and not references to QgsAbstractGeometry

because using this more consistently throughout the codebase makes it
easier to maintain code.
We also do not want to call the copy constructor on them, using pointers
just makes this more obvious. Further, casting is also something
that's commonly done on pointers and not references.

And if you want a value or a reference, just use QgsGeometry, it's meant
to be handled like this.
  • Loading branch information
m-kuhn committed Aug 13, 2017
1 parent 4c6c74c commit 581b89e0ecd9653a3b157c5824b7abfb7deeb63a
@@ -26,23 +26,23 @@ class QgsGeometryEngine
virtual void geometryChanged() = 0;
virtual void prepareGeometry() = 0;

virtual QgsAbstractGeometry *intersection( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0 /Factory/;
virtual QgsAbstractGeometry *intersection( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0 /Factory/;
%Docstring
:rtype: QgsAbstractGeometry
%End
virtual QgsAbstractGeometry *difference( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0 /Factory/;
virtual QgsAbstractGeometry *difference( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0 /Factory/;
%Docstring
:rtype: QgsAbstractGeometry
%End
virtual QgsAbstractGeometry *combine( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0 /Factory/;
virtual QgsAbstractGeometry *combine( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0 /Factory/;
%Docstring
:rtype: QgsAbstractGeometry
%End
virtual QgsAbstractGeometry *combine( const QList< QgsAbstractGeometry * > &, QString *errorMsg = 0 ) const = 0 /Factory/;
%Docstring
:rtype: QgsAbstractGeometry
%End
virtual QgsAbstractGeometry *symDifference( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0 /Factory/;
virtual QgsAbstractGeometry *symDifference( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0 /Factory/;
%Docstring
:rtype: QgsAbstractGeometry
%End
@@ -78,40 +78,40 @@ class QgsGeometryEngine
%Docstring
:rtype: QgsAbstractGeometry
%End
virtual double distance( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual double distance( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: float
%End
virtual bool intersects( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool intersects( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool touches( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool touches( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool crosses( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool crosses( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool within( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool within( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool overlaps( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool overlaps( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool contains( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool contains( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
virtual bool disjoint( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool disjoint( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End

virtual QString relate( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual QString relate( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
Returns the Dimensional Extended 9 Intersection Model (DE-9IM) representation of the
relationship between the geometries.
@@ -122,7 +122,7 @@ class QgsGeometryEngine
:rtype: str
%End

virtual bool relatePattern( const QgsAbstractGeometry &geom, const QString &pattern, QString *errorMsg = 0 ) const = 0;
virtual bool relatePattern( const QgsAbstractGeometry *geom, const QString &pattern, QString *errorMsg = 0 ) const = 0;
%Docstring
Tests whether two geometries are related by a specified Dimensional Extended 9 Intersection Model (DE-9IM)
pattern.
@@ -146,7 +146,7 @@ class QgsGeometryEngine
%Docstring
:rtype: bool
%End
virtual bool isEqual( const QgsAbstractGeometry &geom, QString *errorMsg = 0 ) const = 0;
virtual bool isEqual( const QgsAbstractGeometry *geom, QString *errorMsg = 0 ) const = 0;
%Docstring
:rtype: bool
%End
@@ -2373,14 +2373,14 @@ static QVariant fcnRelate( const QVariantList &values, const QgsExpressionContex
if ( values.length() == 2 )
{
//two geometry arguments, return relation
QString result = engine->relate( *sGeom.geometry() );
QString result = engine->relate( sGeom.geometry() );
return QVariant::fromValue( result );
}
else
{
//three arguments, test pattern
QString pattern = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
bool result = engine->relatePattern( *sGeom.geometry(), pattern );
bool result = engine->relatePattern( sGeom.geometry(), pattern );
return QVariant::fromValue( result );
}
}
@@ -845,7 +845,7 @@ int QgsGeometry::makeDifferenceInPlace( const QgsGeometry &other )

QgsGeos geos( d->geometry );

QgsAbstractGeometry *diffGeom = geos.intersection( *other.geometry() );
QgsAbstractGeometry *diffGeom = geos.intersection( other.geometry() );
if ( !diffGeom )
{
return 1;
@@ -867,7 +867,7 @@ QgsGeometry QgsGeometry::makeDifference( const QgsGeometry &other ) const

QgsGeos geos( d->geometry );

QgsAbstractGeometry *diffGeom = geos.intersection( *other.geometry() );
QgsAbstractGeometry *diffGeom = geos.intersection( other.geometry() );
if ( !diffGeom )
{
return QgsGeometry();
@@ -965,7 +965,7 @@ bool QgsGeometry::intersects( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.intersects( *geometry.d->geometry );
return geos.intersects( geometry.d->geometry );
}

bool QgsGeometry::contains( const QgsPointXY *p ) const
@@ -977,7 +977,7 @@ bool QgsGeometry::contains( const QgsPointXY *p ) const

QgsPoint pt( p->x(), p->y() );
QgsGeos geos( d->geometry );
return geos.contains( pt );
return geos.contains( &pt );
}

bool QgsGeometry::contains( const QgsGeometry &geometry ) const
@@ -988,7 +988,7 @@ bool QgsGeometry::contains( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.contains( *( geometry.d->geometry ) );
return geos.contains( geometry.d->geometry );
}

bool QgsGeometry::disjoint( const QgsGeometry &geometry ) const
@@ -999,7 +999,7 @@ bool QgsGeometry::disjoint( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.disjoint( *( geometry.d->geometry ) );
return geos.disjoint( geometry.d->geometry );
}

bool QgsGeometry::equals( const QgsGeometry &geometry ) const
@@ -1010,7 +1010,7 @@ bool QgsGeometry::equals( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.isEqual( *( geometry.d->geometry ) );
return geos.isEqual( geometry.d->geometry );
}

bool QgsGeometry::touches( const QgsGeometry &geometry ) const
@@ -1021,7 +1021,7 @@ bool QgsGeometry::touches( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.touches( *( geometry.d->geometry ) );
return geos.touches( geometry.d->geometry );
}

bool QgsGeometry::overlaps( const QgsGeometry &geometry ) const
@@ -1032,7 +1032,7 @@ bool QgsGeometry::overlaps( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.overlaps( *( geometry.d->geometry ) );
return geos.overlaps( geometry.d->geometry );
}

bool QgsGeometry::within( const QgsGeometry &geometry ) const
@@ -1043,7 +1043,7 @@ bool QgsGeometry::within( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.within( *( geometry.d->geometry ) );
return geos.within( geometry.d->geometry );
}

bool QgsGeometry::crosses( const QgsGeometry &geometry ) const
@@ -1054,7 +1054,7 @@ bool QgsGeometry::crosses( const QgsGeometry &geometry ) const
}

QgsGeos geos( d->geometry );
return geos.crosses( *( geometry.d->geometry ) );
return geos.crosses( geometry.d->geometry );
}

QString QgsGeometry::exportToWkt( int precision ) const
@@ -1394,7 +1394,7 @@ double QgsGeometry::distance( const QgsGeometry &geom ) const
}

QgsGeos g( d->geometry );
return g.distance( *( geom.d->geometry ) );
return g.distance( geom.d->geometry );
}

QgsGeometry QgsGeometry::buffer( double distance, int segments ) const
@@ -1405,12 +1405,8 @@ QgsGeometry QgsGeometry::buffer( double distance, int segments ) const
}

QgsGeos g( d->geometry );
QgsAbstractGeometry *geom = g.buffer( distance, segments );
if ( !geom )
{
return QgsGeometry();
}
return QgsGeometry( geom );
std::unique_ptr<QgsAbstractGeometry> geom( g.buffer( distance, segments ) );
return QgsGeometry( geom.release() );
}

QgsGeometry QgsGeometry::buffer( double distance, int segments, EndCapStyle endCapStyle, JoinStyle joinStyle, double miterLimit ) const
@@ -1797,7 +1793,7 @@ QgsGeometry QgsGeometry::intersection( const QgsGeometry &geometry ) const
QgsGeos geos( d->geometry );

QString error;
QgsAbstractGeometry *resultGeom = geos.intersection( *( geometry.d->geometry ), &error );
QgsAbstractGeometry *resultGeom = geos.intersection( geometry.d->geometry, &error );

if ( !resultGeom )
{
@@ -1819,7 +1815,7 @@ QgsGeometry QgsGeometry::combine( const QgsGeometry &geometry ) const
QgsGeos geos( d->geometry );
QString error;

QgsAbstractGeometry *resultGeom = geos.combine( *( geometry.d->geometry ), &error );
QgsAbstractGeometry *resultGeom = geos.combine( geometry.d->geometry, &error );
if ( !resultGeom )
{
QgsGeometry geom;
@@ -1856,7 +1852,7 @@ QgsGeometry QgsGeometry::difference( const QgsGeometry &geometry ) const
QgsGeos geos( d->geometry );

QString error;
QgsAbstractGeometry *resultGeom = geos.difference( *( geometry.d->geometry ), &error );
QgsAbstractGeometry *resultGeom = geos.difference( geometry.d->geometry, &error );
if ( !resultGeom )
{
QgsGeometry geom;
@@ -1877,7 +1873,7 @@ QgsGeometry QgsGeometry::symDifference( const QgsGeometry &geometry ) const

QString error;

QgsAbstractGeometry *resultGeom = geos.symDifference( *( geometry.d->geometry ), &error );
QgsAbstractGeometry *resultGeom = geos.symDifference( geometry.d->geometry, &error );
if ( !resultGeom )
{
QgsGeometry geom;
@@ -2051,7 +2047,7 @@ bool QgsGeometry::isGeosEqual( const QgsGeometry &g ) const
}

QgsGeos geos( d->geometry );
return geos.isEqual( *( g.d->geometry ) );
return geos.isEqual( g.d->geometry );
}

QgsGeometry QgsGeometry::unaryUnion( const QList<QgsGeometry> &geometries )
@@ -70,16 +70,16 @@ int QgsGeometryEditUtils::addRing( QgsAbstractGeometry *geom, QgsCurve *ring )
ringGeom->prepareGeometry();

//for each polygon, test if inside outer ring and no intersection with other interior ring
QList< QgsCurvePolygon * >::iterator polyIter = polygonList.begin();
for ( ; polyIter != polygonList.end(); ++polyIter )
QList< QgsCurvePolygon * >::const_iterator polyIter = polygonList.constBegin();
for ( ; polyIter != polygonList.constEnd(); ++polyIter )
{
if ( ringGeom->within( **polyIter ) )
if ( ringGeom->within( *polyIter ) )
{
//check if disjoint with other interior rings
int nInnerRings = ( *polyIter )->numInteriorRings();
for ( int i = 0; i < nInnerRings; ++i )
{
if ( !ringGeom->disjoint( *( *polyIter )->interiorRing( i ) ) )
if ( !ringGeom->disjoint( ( *polyIter )->interiorRing( i ) ) )
{
delete ring;
return 4;
@@ -284,7 +284,7 @@ QgsAbstractGeometry *QgsGeometryEditUtils::avoidIntersections( const QgsAbstract
return nullptr;
}

QgsAbstractGeometry *diffGeom = geomEngine->difference( *combinedGeometries );
QgsAbstractGeometry *diffGeom = geomEngine->difference( combinedGeometries );

delete combinedGeometries;
return diffGeom;
@@ -36,11 +36,11 @@ class CORE_EXPORT QgsGeometryEngine
virtual void geometryChanged() = 0;
virtual void prepareGeometry() = 0;

virtual QgsAbstractGeometry *intersection( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *difference( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *combine( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *intersection( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *difference( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *combine( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *combine( const QList< QgsAbstractGeometry * > &, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *symDifference( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *symDifference( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *buffer( double distance, int segments, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *buffer( double distance, int segments, int endCapStyle, int joinStyle, double miterLimit, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual QgsAbstractGeometry *simplify( double tolerance, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
@@ -49,14 +49,14 @@ class CORE_EXPORT QgsGeometryEngine
virtual bool centroid( QgsPoint &pt, QString *errorMsg = nullptr ) const = 0;
virtual bool pointOnSurface( QgsPoint &pt, QString *errorMsg = nullptr ) const = 0;
virtual QgsAbstractGeometry *convexHull( QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
virtual double distance( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool intersects( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool touches( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool crosses( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool within( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool overlaps( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool contains( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool disjoint( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual double distance( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool intersects( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool touches( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool crosses( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool within( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool overlaps( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool contains( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool disjoint( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;

/** Returns the Dimensional Extended 9 Intersection Model (DE-9IM) representation of the
* relationship between the geometries.
@@ -65,7 +65,7 @@ class CORE_EXPORT QgsGeometryEngine
* \returns DE-9IM string for relationship, or an empty string if an error occurred
* \since QGIS 2.12
*/
virtual QString relate( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual QString relate( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;

/** Tests whether two geometries are related by a specified Dimensional Extended 9 Intersection Model (DE-9IM)
* pattern.
@@ -75,12 +75,12 @@ class CORE_EXPORT QgsGeometryEngine
* \returns true if geometry relationship matches with pattern
* \since QGIS 2.14
*/
virtual bool relatePattern( const QgsAbstractGeometry &geom, const QString &pattern, QString *errorMsg = nullptr ) const = 0;
virtual bool relatePattern( const QgsAbstractGeometry *geom, const QString &pattern, QString *errorMsg = nullptr ) const = 0;

virtual double area( QString *errorMsg = nullptr ) const = 0;
virtual double length( QString *errorMsg = nullptr ) const = 0;
virtual bool isValid( QString *errorMsg = nullptr ) const = 0;
virtual bool isEqual( const QgsAbstractGeometry &geom, QString *errorMsg = nullptr ) const = 0;
virtual bool isEqual( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0;
virtual bool isEmpty( QString *errorMsg ) const = 0;

/** Determines whether the geometry is simple (according to OGC definition).

0 comments on commit 581b89e

Please sign in to comment.
You can’t perform that action at this time.