Skip to content

Commit 53fb055

Browse files
committed
fix(qgsrange): consider include/exclude limits on both range for overlaps
1 parent e583eda commit 53fb055

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

src/core/qgsrange.h

+19-19
Original file line numberDiff line numberDiff line change
@@ -175,23 +175,23 @@ class QgsRange
175175
*/
176176
bool overlaps( const QgsRange<T> &other ) const
177177
{
178-
if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
179-
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
178+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower <= other.mLower ) || ( ( !mIncludeLower || !other.mIncludeLower ) && mLower < other.mLower ) )
179+
&& ( ( mIncludeUpper && other.mIncludeUpper && mUpper >= other.mUpper ) || ( ( !mIncludeUpper || !other.mIncludeUpper ) && mUpper > other.mUpper ) ) )
180180
return true;
181181

182-
if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
183-
&& ( ( mIncludeUpper && mUpper >= other.mLower ) || ( !mIncludeUpper && mUpper > other.mLower ) ) )
182+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower <= other.mLower ) || ( ( !mIncludeLower || !other.mIncludeLower ) && mLower < other.mLower ) )
183+
&& ( ( mIncludeUpper && other.mIncludeLower && mUpper >= other.mLower ) || ( ( !mIncludeUpper || !other.mIncludeLower ) && mUpper > other.mLower ) ) )
184184
return true;
185185

186-
if ( ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) )
187-
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
186+
if ( ( ( mIncludeLower && other.mIncludeUpper && mLower <= other.mUpper ) || ( ( !mIncludeLower || !other.mIncludeUpper ) && mLower < other.mUpper ) )
187+
&& ( ( mIncludeUpper && other.mIncludeUpper && mUpper >= other.mUpper ) || ( ( !mIncludeUpper || !other.mIncludeUpper ) && mUpper > other.mUpper ) ) )
188188
return true;
189189

190-
if ( ( ( mIncludeLower && mLower >= other.mLower ) || ( !mIncludeLower && mLower > other.mLower ) )
191-
&& ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
190+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower >= other.mLower ) || ( ( !mIncludeLower || !other.mIncludeLower ) && mLower > other.mLower ) )
191+
&& ( ( mIncludeLower && other.mIncludeUpper && mLower <= other.mUpper ) || ( ( !mIncludeLower || !other.mIncludeUpper ) && mLower < other.mUpper ) ) )
192192
return true;
193193

194-
if ( mLower == other.mLower && mUpper == other.mUpper )
194+
if ( mIncludeLower && mIncludeUpper && other.mIncludeLower && other.mIncludeUpper && mLower == other.mLower && mUpper == other.mUpper )
195195
return true;
196196

197197
return false;
@@ -574,26 +574,26 @@ class QgsTemporalRange
574574
*/
575575
bool overlaps( const QgsTemporalRange<T> &other ) const
576576
{
577-
if ( !mUpper.isValid() && ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
577+
if ( !mUpper.isValid() && ( ( mIncludeLower && other.mIncludeUpper && mLower <= other.mUpper ) || ( ( !mIncludeLower || !other.mIncludeUpper ) && mLower < other.mUpper ) ) )
578578
return true;
579579

580-
if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
581-
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
580+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower <= other.mLower ) || ( ( !mIncludeLower || !other.mIncludeLower ) && mLower < other.mLower ) )
581+
&& ( ( mIncludeUpper && other.mIncludeUpper && mUpper >= other.mUpper ) || ( ( !mIncludeUpper || !other.mIncludeUpper ) && mUpper > other.mUpper ) ) )
582582
return true;
583583

584-
if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
585-
&& ( ( mIncludeUpper && mUpper >= other.mLower ) || ( !mIncludeUpper && mUpper > other.mLower ) ) )
584+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower <= other.mLower ) || ( ( !mIncludeLower || other.mIncludeLower ) && mLower < other.mLower ) )
585+
&& ( ( mIncludeUpper && other.mIncludeLower && mUpper >= other.mLower ) || ( ( !mIncludeUpper || !other.mIncludeLower ) && mUpper > other.mLower ) ) )
586586
return true;
587587

588-
if ( ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) )
589-
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
588+
if ( ( ( mIncludeLower && other.mIncludeUpper && mLower <= other.mUpper ) || ( ( !mIncludeLower || other.mIncludeUpper ) && mLower < other.mUpper ) )
589+
&& ( ( mIncludeUpper && other.mIncludeUpper && mUpper >= other.mUpper ) || ( ( !mIncludeUpper || !other.mIncludeUpper ) && mUpper > other.mUpper ) ) )
590590
return true;
591591

592-
if ( ( ( mIncludeLower && mLower >= other.mLower ) || ( !mIncludeLower && mLower > other.mLower ) )
593-
&& ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
592+
if ( ( ( mIncludeLower && other.mIncludeLower && mLower >= other.mLower ) || ( ( !mIncludeLower || !other.mIncludeLower ) && mLower > other.mLower ) )
593+
&& ( ( mIncludeLower && other.mIncludeUpper && mLower <= other.mUpper ) || ( ( !mIncludeLower || !other.mIncludeUpper ) && mLower < other.mUpper ) ) )
594594
return true;
595595

596-
if ( mLower == other.mLower && mUpper == other.mUpper )
596+
if ( mIncludeLower && other.mIncludeLower && mIncludeUpper && other.mIncludeUpper && mLower == other.mLower && mUpper == other.mUpper )
597597
return true;
598598

599599
return false;

tests/src/python/test_qgsrange.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ def testOverlaps(self):
196196
self.assertTrue(range.overlaps(QgsIntRange(-1, 0)))
197197
self.assertFalse(range.overlaps(QgsIntRange(-10, -1)))
198198
self.assertFalse(range.overlaps(QgsIntRange(11, 12)))
199+
self.assertFalse(range.overlaps(QgsIntRange(10, 12, True, False)))
200+
self.assertFalse(QgsIntRange(10, 12, True, False).overlaps(range))
199201

200202
# includes right end
201203
range = QgsIntRange(0, 10, False, True)
@@ -212,14 +214,16 @@ def testOverlaps(self):
212214
self.assertFalse(range.overlaps(QgsIntRange(-1, 0)))
213215
self.assertFalse(range.overlaps(QgsIntRange(-10, -1)))
214216
self.assertFalse(range.overlaps(QgsIntRange(11, 12)))
217+
self.assertFalse(range.overlaps(QgsIntRange(10, 12, False, True)))
218+
self.assertFalse(QgsIntRange(10, 12, False, True).overlaps(range))
215219

216220
# includes neither end
217221
range = QgsIntRange(0, 10, False, False)
218222
self.assertTrue(range.overlaps(QgsIntRange(1, 9)))
219223
self.assertTrue(range.overlaps(QgsIntRange(1, 10)))
220224
self.assertTrue(range.overlaps(QgsIntRange(1, 11)))
221225
self.assertTrue(range.overlaps(QgsIntRange(0, 9)))
222-
self.assertTrue(range.overlaps(QgsIntRange(0, 10)))
226+
self.assertFalse(range.overlaps(QgsIntRange(0, 10)))
223227
self.assertTrue(range.overlaps(QgsIntRange(-1, 10)))
224228
self.assertTrue(range.overlaps(QgsIntRange(-1, 9)))
225229
self.assertTrue(range.overlaps(QgsIntRange(1, 11)))
@@ -228,6 +232,8 @@ def testOverlaps(self):
228232
self.assertFalse(range.overlaps(QgsIntRange(-1, 0)))
229233
self.assertFalse(range.overlaps(QgsIntRange(-10, -1)))
230234
self.assertFalse(range.overlaps(QgsIntRange(11, 12)))
235+
self.assertFalse(range.overlaps(QgsIntRange(10, 12, True, True)))
236+
self.assertFalse(QgsIntRange(-3, 0, True, True).overlaps(range))
231237

232238

233239
class TestQgsDoubleRange(unittest.TestCase):

0 commit comments

Comments
 (0)