diff --git a/python/core/auto_generated/raster/qgsrasterrange.sip.in b/python/core/auto_generated/raster/qgsrasterrange.sip.in index d47380ceea5..cad71f4850f 100644 --- a/python/core/auto_generated/raster/qgsrasterrange.sip.in +++ b/python/core/auto_generated/raster/qgsrasterrange.sip.in @@ -97,6 +97,13 @@ in the range. bool operator==( QgsRasterRange o ) const; + bool contains( double value ) const; +%Docstring +Returns true if this range contains the specified ``value``. + +.. versionadded:: 3.2 +%End + static bool contains( double value, const QgsRasterRangeList &rangeList ); %Docstring Tests if a ``value`` is within the list of ranges diff --git a/src/core/raster/qgsrasterrange.cpp b/src/core/raster/qgsrasterrange.cpp index c671f2d43f2..f7339d46a08 100644 --- a/src/core/raster/qgsrasterrange.cpp +++ b/src/core/raster/qgsrasterrange.cpp @@ -24,13 +24,22 @@ QgsRasterRange::QgsRasterRange( double min, double max, BoundsType bounds ) { } +bool QgsRasterRange::contains( double value ) const +{ + return ( value > mMin + || ( !std::isnan( mMin ) && qgsDoubleNear( value, mMin ) && ( mType == IncludeMinAndMax || mType == IncludeMin ) ) + || std::isnan( mMin ) ) + && + ( value < mMax + || ( !std::isnan( mMax ) && qgsDoubleNear( value, mMax ) && ( mType == IncludeMinAndMax || mType == IncludeMax ) ) + || std::isnan( mMax ) ); +} + bool QgsRasterRange::contains( double value, const QgsRasterRangeList &rangeList ) { - Q_FOREACH ( QgsRasterRange range, rangeList ) + for ( QgsRasterRange range : rangeList ) { - if ( ( value >= range.mMin && value <= range.mMax ) || - qgsDoubleNear( value, range.mMin ) || - qgsDoubleNear( value, range.mMax ) ) + if ( range.contains( value ) ) { return true; } diff --git a/src/core/raster/qgsrasterrange.h b/src/core/raster/qgsrasterrange.h index 92cd2a698c4..65b5291feab 100644 --- a/src/core/raster/qgsrasterrange.h +++ b/src/core/raster/qgsrasterrange.h @@ -107,6 +107,12 @@ class CORE_EXPORT QgsRasterRange && mType == o.mType; } + /** + * Returns true if this range contains the specified \a value. + * \since QGIS 3.2 + */ + bool contains( double value ) const; + /** * \brief Tests if a \a value is within the list of ranges * \param value value diff --git a/tests/src/python/test_qgsrasterrange.py b/tests/src/python/test_qgsrasterrange.py index f3dc2063a92..1cf7c131cf6 100644 --- a/tests/src/python/test_qgsrasterrange.py +++ b/tests/src/python/test_qgsrasterrange.py @@ -62,6 +62,53 @@ class TestQgsRasterRange(unittest.TestCase): range2.setMax(5) self.assertEqual(range, range2) + def testContains(self): + range = QgsRasterRange(1, 5) + self.assertTrue(range.contains(1)) + self.assertTrue(range.contains(5)) + self.assertTrue(range.contains(4)) + self.assertTrue(range.contains(1.00001)) + self.assertTrue(range.contains(4.99999)) + self.assertFalse(range.contains(0.99999)) + self.assertFalse(range.contains(5.00001)) + + # with nan min/maxs + range = QgsRasterRange() + self.assertTrue(range.contains(1)) + self.assertTrue(range.contains(-909999999)) + self.assertTrue(range.contains(999999999)) + range.setMin(5) + self.assertFalse(range.contains(0)) + self.assertTrue(range.contains(5)) + self.assertTrue(range.contains(10000000)) + + range = QgsRasterRange() + range.setMax(5) + self.assertFalse(range.contains(6)) + self.assertTrue(range.contains(5)) + self.assertTrue(range.contains(-99999)) + + range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMax) + self.assertFalse(range.contains(0)) + self.assertFalse(range.contains(1)) + self.assertTrue(range.contains(2)) + self.assertTrue(range.contains(5)) + self.assertFalse(range.contains(6)) + + range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMin) + self.assertFalse(range.contains(0)) + self.assertTrue(range.contains(1)) + self.assertTrue(range.contains(2)) + self.assertFalse(range.contains(5)) + self.assertFalse(range.contains(6)) + + range = QgsRasterRange(1, 5, QgsRasterRange.Exclusive) + self.assertFalse(range.contains(0)) + self.assertFalse(range.contains(1)) + self.assertTrue(range.contains(2)) + self.assertFalse(range.contains(5)) + self.assertFalse(range.contains(6)) + if __name__ == '__main__': unittest.main()