diff --git a/src/rangemap.rs b/src/rangemap.rs index 2d5466856e627469c494a0e348ee45c84f501bc8..d29f757637dc773688d28dca59f6e65cd0816d55 100644 --- a/src/rangemap.rs +++ b/src/rangemap.rs @@ -100,6 +100,25 @@ impl<RK: Ord + Copy, V> RangeMap<RK, V> { None } + /// Checks whether the provided range has any overlaps. + pub fn overlaps(&self, start: RK, end: RK) -> bool { + if let Some((&_existing_start, &(existing_end, _))) = + self.ranges.range(..=start).next_back() + { + if existing_end >= start { + return true; + } + } + + if let Some((&existing_start, &(_, _))) = self.ranges.range(start..).next() { + if existing_start <= end { + return true; + } + } + + false + } + /// Looks up a value at the specified key and removes it from the /// dictionary. /// @@ -261,4 +280,24 @@ mod tests { Ok(()) } + + #[test] + pub fn test_overlaps() -> anyhow::Result<()> { + let mut rm: RangeMap<i64, &str> = RangeMap::new(); + + rm.insert(0, 10, "A")?; + + assert!(rm.overlaps(10, 13)); + assert!(rm.overlaps(5, 7)); + assert!(rm.overlaps(-20, 0)); + assert!(rm.overlaps(-20, 20)); + assert!(!rm.overlaps(50, 70)); + assert!(!rm.overlaps(-50, -10)); + + rm.insert(400, 500, "B")?; + + assert!(rm.overlaps(40, 450)); + + Ok(()) + } }