Skip to content

Commit 9fb7819

Browse files
committed
Add a bit of typesafety to ogr extent handling
1 parent 29a72b5 commit 9fb7819

File tree

2 files changed

+19
-37
lines changed

2 files changed

+19
-37
lines changed

src/providers/ogr/qgsogrprovider.cpp

+18-36
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ QgsVectorLayerImport::ImportError QgsOgrProvider::createEmptyLayer(
272272
QgsOgrProvider::QgsOgrProvider( QString const & uri )
273273
: QgsVectorDataProvider( uri )
274274
, ogrDataSource( nullptr )
275-
, extent_( nullptr )
275+
, mExtent( nullptr )
276276
, ogrLayer( nullptr )
277277
, ogrOrigLayer( nullptr )
278278
, mLayerIndex( 0 )
@@ -456,11 +456,7 @@ bool QgsOgrProvider::setSubsetString( const QString& theSQL, bool updateFeatureC
456456
loadFields();
457457
QgsDebugMsg( "Done checking validity" );
458458

459-
if ( extent_ )
460-
{
461-
free( extent_ );
462-
extent_ = nullptr;
463-
}
459+
updateExtents();
464460

465461
emit dataChanged();
466462

@@ -846,26 +842,24 @@ unsigned char * QgsOgrProvider::getGeometryPointer( OGRFeatureH fet )
846842

847843
QgsRectangle QgsOgrProvider::extent()
848844
{
849-
if ( !extent_ )
845+
if ( !mExtent )
850846
{
851-
extent_ = calloc( sizeof( OGREnvelope ), 1 );
847+
mExtent = new OGREnvelope();
852848

853849
// get the extent_ (envelope) of the layer
854850
QgsDebugMsg( "Starting get extent" );
855851

856852
// TODO: This can be expensive, do we really need it!
857853
if ( ogrLayer == ogrOrigLayer )
858854
{
859-
OGR_L_GetExtent( ogrLayer, ( OGREnvelope * ) extent_, true );
855+
OGR_L_GetExtent( ogrLayer, mExtent, true );
860856
}
861857
else
862858
{
863-
OGREnvelope *bb = static_cast<OGREnvelope*>( extent_ );
864-
865-
bb->MinX = std::numeric_limits<double>::max();
866-
bb->MinY = std::numeric_limits<double>::max();
867-
bb->MaxX = -std::numeric_limits<double>::max();
868-
bb->MaxY = -std::numeric_limits<double>::max();
859+
mExtent->MinX = std::numeric_limits<double>::max();
860+
mExtent->MinY = std::numeric_limits<double>::max();
861+
mExtent->MaxX = -std::numeric_limits<double>::max();
862+
mExtent->MaxY = -std::numeric_limits<double>::max();
869863

870864
OGRFeatureH f;
871865

@@ -878,10 +872,10 @@ QgsRectangle QgsOgrProvider::extent()
878872
OGREnvelope env;
879873
OGR_G_GetEnvelope( g, &env );
880874

881-
if ( env.MinX < bb->MinX ) bb->MinX = env.MinX;
882-
if ( env.MinY < bb->MinY ) bb->MinY = env.MinY;
883-
if ( env.MaxX > bb->MaxX ) bb->MaxX = env.MaxX;
884-
if ( env.MaxY > bb->MaxY ) bb->MaxY = env.MaxY;
875+
mExtent->MinX = qMin( mExtent->MinX, env.MinX );
876+
mExtent->MinY = qMin( mExtent->MinY, env.MinY );
877+
mExtent->MaxX = qMin( mExtent->MaxX, env.MaxX );
878+
mExtent->MaxY = qMin( mExtent->MaxY, env.MaxY );
885879
}
886880

887881
OGR_F_Destroy( f );
@@ -892,18 +886,14 @@ QgsRectangle QgsOgrProvider::extent()
892886
QgsDebugMsg( "Finished get extent" );
893887
}
894888

895-
OGREnvelope *ext = static_cast<OGREnvelope *>( extent_ );
896-
mExtentRect.set( ext->MinX, ext->MinY, ext->MaxX, ext->MaxY );
889+
mExtentRect.set( mExtent->MinX, mExtent->MinY, mExtent->MaxX, mExtent->MaxY );
897890
return mExtentRect;
898891
}
899892

900893
void QgsOgrProvider::updateExtents()
901894
{
902-
if ( extent_ )
903-
{
904-
free( extent_ );
905-
extent_ = nullptr;
906-
}
895+
delete mExtent;
896+
mExtent = nullptr;
907897
}
908898

909899
size_t QgsOgrProvider::layerCount() const
@@ -1409,11 +1399,7 @@ bool QgsOgrProvider::deleteFeatures( const QgsFeatureIds & id )
14091399

14101400
clearMinMaxCache();
14111401

1412-
if ( extent_ )
1413-
{
1414-
free( extent_ );
1415-
extent_ = nullptr;
1416-
}
1402+
updateExtents();
14171403

14181404
return returnvalue;
14191405
}
@@ -2846,11 +2832,7 @@ void QgsOgrProvider::close()
28462832
}
28472833
ogrDataSource = nullptr;
28482834

2849-
if ( extent_ )
2850-
{
2851-
free( extent_ );
2852-
extent_ = nullptr;
2853-
}
2835+
updateExtents();
28542836

28552837
QgsOgrConnPool::unrefS( mFilePath );
28562838
}

src/providers/ogr/qgsogrprovider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
295295
OGRwkbGeometryType ogrWkbGeometryTypeFromName( const QString& typeName ) const;
296296
QgsFields mAttributeFields;
297297
OGRDataSourceH ogrDataSource;
298-
void *extent_;
298+
OGREnvelope* mExtent;
299299

300300
/** This member variable receives the same value as extent_
301301
in the method QgsOgrProvider::extent(). The purpose is to prevent a memory leak*/

0 commit comments

Comments
 (0)