Skip to content

Commit

Permalink
Cleanup api to avoid a potential dangling pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Apr 15, 2023
1 parent de171ac commit ca3a0bd
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 35 deletions.
49 changes: 22 additions & 27 deletions src/analysis/processing/qgsalgorithmfuzzifyraster.cpp
Expand Up @@ -94,11 +94,12 @@ QVariantMap QgsFuzzifyRasterAlgorithmBase::processAlgorithm( const QVariantMap &
throw QgsProcessingException( QObject::tr( "Could not create raster output %1: %2" ).arg( outputFile, provider->error().message( QgsErrorMessage::Text ) ) );

provider->setNoDataValue( 1, mNoDataValue );
mDestinationRasterProvider = provider.get();
mDestinationRasterProvider->setEditable( true );
provider->setEditable( true );
const qgssize layerSize = static_cast< qgssize >( mLayerWidth ) * static_cast< qgssize >( mLayerHeight );

fuzzify( feedback );
fuzzify( provider.get(), feedback );

provider->setEditable( false );

QVariantMap outputs;
outputs.insert( QStringLiteral( "EXTENT" ), mExtent.toString() );
Expand Down Expand Up @@ -165,7 +166,7 @@ bool QgsFuzzifyRasterLinearMembershipAlgorithm::prepareAlgorithmFuzzificationPar
return true;
}

void QgsFuzzifyRasterLinearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterLinearMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -185,7 +186,7 @@ void QgsFuzzifyRasterLinearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand Down Expand Up @@ -229,9 +230,8 @@ void QgsFuzzifyRasterLinearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}


Expand Down Expand Up @@ -292,7 +292,7 @@ bool QgsFuzzifyRasterPowerMembershipAlgorithm::prepareAlgorithmFuzzificationPara
return true;
}

void QgsFuzzifyRasterPowerMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterPowerMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -312,7 +312,7 @@ void QgsFuzzifyRasterPowerMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand Down Expand Up @@ -356,9 +356,8 @@ void QgsFuzzifyRasterPowerMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}

//
Expand Down Expand Up @@ -414,7 +413,7 @@ bool QgsFuzzifyRasterLargeMembershipAlgorithm::prepareAlgorithmFuzzificationPara
return true;
}

void QgsFuzzifyRasterLargeMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterLargeMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -434,7 +433,7 @@ void QgsFuzzifyRasterLargeMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand All @@ -460,9 +459,8 @@ void QgsFuzzifyRasterLargeMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}


Expand Down Expand Up @@ -519,7 +517,7 @@ bool QgsFuzzifyRasterSmallMembershipAlgorithm::prepareAlgorithmFuzzificationPara
return true;
}

void QgsFuzzifyRasterSmallMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterSmallMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -539,7 +537,7 @@ void QgsFuzzifyRasterSmallMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand All @@ -565,9 +563,8 @@ void QgsFuzzifyRasterSmallMembershipAlgorithm::fuzzify( QgsProcessingFeedback *f
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}


Expand Down Expand Up @@ -624,7 +621,7 @@ bool QgsFuzzifyRasterGaussianMembershipAlgorithm::prepareAlgorithmFuzzificationP
return true;
}

void QgsFuzzifyRasterGaussianMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterGaussianMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -644,7 +641,7 @@ void QgsFuzzifyRasterGaussianMembershipAlgorithm::fuzzify( QgsProcessingFeedback
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand All @@ -670,9 +667,8 @@ void QgsFuzzifyRasterGaussianMembershipAlgorithm::fuzzify( QgsProcessingFeedback
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}


Expand Down Expand Up @@ -730,7 +726,7 @@ bool QgsFuzzifyRasterNearMembershipAlgorithm::prepareAlgorithmFuzzificationParam
return true;
}

void QgsFuzzifyRasterNearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *feedback )
void QgsFuzzifyRasterNearMembershipAlgorithm::fuzzify( QgsRasterDataProvider *destinationProvider, QgsProcessingFeedback *feedback )
{
const int maxWidth = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_WIDTH;
const int maxHeight = QgsRasterIterator::DEFAULT_MAXIMUM_TILE_HEIGHT;
Expand All @@ -750,7 +746,7 @@ void QgsFuzzifyRasterNearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *fe
{
if ( feedback )
feedback->setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( mDestinationRasterProvider->dataType( 1 ), iterCols, iterRows );
std::unique_ptr< QgsRasterBlock > fuzzifiedBlock = std::make_unique< QgsRasterBlock >( destinationProvider->dataType( 1 ), iterCols, iterRows );

for ( int row = 0; row < iterRows; row++ )
{
Expand All @@ -776,9 +772,8 @@ void QgsFuzzifyRasterNearMembershipAlgorithm::fuzzify( QgsProcessingFeedback *fe
fuzzifiedBlock->setValue( row, column, fuzzifiedValue );
}
}
mDestinationRasterProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
destinationProvider->writeBlock( fuzzifiedBlock.get(), mBand, iterLeft, iterTop );
}
mDestinationRasterProvider->setEditable( false );
}


Expand Down
15 changes: 7 additions & 8 deletions src/analysis/processing/qgsalgorithmfuzzifyraster.h
Expand Up @@ -59,7 +59,7 @@ class QgsFuzzifyRasterAlgorithmBase : public QgsProcessingAlgorithm
/**
* Pure virtual method fuzzify() performs subclass specific fuzzification.
*/
virtual void fuzzify( QgsProcessingFeedback *feedback ) = 0;
virtual void fuzzify( QgsRasterDataProvider* destinationProvider, QgsProcessingFeedback *feedback ) = 0;

QgsRasterLayer *mInputRaster = nullptr;
int mBand = 1;
Expand All @@ -73,7 +73,6 @@ class QgsFuzzifyRasterAlgorithmBase : public QgsProcessingAlgorithm

Qgis::DataType mDataType = Qgis::DataType::Float32;
const double mNoDataValue = -9999;
QgsRasterDataProvider *mDestinationRasterProvider = nullptr;
};


Expand All @@ -95,7 +94,7 @@ class QgsFuzzifyRasterLinearMembershipAlgorithm : public QgsFuzzifyRasterAlgorit
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider, QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyLowBound = 0;
Expand All @@ -120,7 +119,7 @@ class QgsFuzzifyRasterPowerMembershipAlgorithm : public QgsFuzzifyRasterAlgorith
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider,QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyLowBound = 0;
Expand All @@ -146,7 +145,7 @@ class QgsFuzzifyRasterLargeMembershipAlgorithm : public QgsFuzzifyRasterAlgorith
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider,QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyMidpoint = 0;
Expand All @@ -171,7 +170,7 @@ class QgsFuzzifyRasterSmallMembershipAlgorithm : public QgsFuzzifyRasterAlgorith
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider,QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyMidpoint = 0;
Expand All @@ -196,7 +195,7 @@ class QgsFuzzifyRasterGaussianMembershipAlgorithm : public QgsFuzzifyRasterAlgor
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider,QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyMidpoint = 0;
Expand All @@ -221,7 +220,7 @@ class QgsFuzzifyRasterNearMembershipAlgorithm : public QgsFuzzifyRasterAlgorithm
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmFuzzificationParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsProcessingFeedback *feedback ) override;
void fuzzify( QgsRasterDataProvider* destinationProvider,QgsProcessingFeedback *feedback ) override;

private:
double mFuzzifyMidpoint = 0;
Expand Down

0 comments on commit ca3a0bd

Please sign in to comment.