wiggle/
region.rs

1/// Represents a contiguous region in memory.
2#[derive(Debug, Copy, Clone, PartialEq, Eq)]
3pub struct Region {
4    pub start: u32,
5    pub len: u32,
6}
7
8impl Region {
9    pub fn new(start: u32, len: u32) -> Self {
10        Self { start, len }
11    }
12
13    /// Checks if this `Region` overlaps with `rhs` `Region`.
14    pub fn overlaps(&self, rhs: Region) -> bool {
15        // Zero-length regions can never overlap!
16        if self.len == 0 || rhs.len == 0 {
17            return false;
18        }
19
20        let self_start = self.start as u64;
21        let self_end = self_start + (self.len - 1) as u64;
22
23        let rhs_start = rhs.start as u64;
24        let rhs_end = rhs_start + (rhs.len - 1) as u64;
25
26        if self_start <= rhs_start {
27            self_end >= rhs_start
28        } else {
29            rhs_end >= self_start
30        }
31    }
32
33    pub fn extend(&self, times: u32) -> Self {
34        let len = self.len * times;
35        Self {
36            start: self.start,
37            len,
38        }
39    }
40}
41
42#[cfg(test)]
43mod test {
44    use super::*;
45
46    #[test]
47    fn zero_length() {
48        let r1 = Region::new(0, 0);
49        let r2 = Region::new(0, 1);
50        assert!(!r1.overlaps(r2));
51
52        let r1 = Region::new(0, 1);
53        let r2 = Region::new(0, 0);
54        assert!(!r1.overlaps(r2));
55    }
56
57    #[test]
58    fn nonoverlapping() {
59        let r1 = Region::new(0, 10);
60        let r2 = Region::new(10, 10);
61        assert!(!r1.overlaps(r2));
62
63        let r1 = Region::new(10, 10);
64        let r2 = Region::new(0, 10);
65        assert!(!r1.overlaps(r2));
66    }
67
68    #[test]
69    fn overlapping() {
70        let r1 = Region::new(0, 10);
71        let r2 = Region::new(9, 10);
72        assert!(r1.overlaps(r2));
73
74        let r1 = Region::new(0, 10);
75        let r2 = Region::new(2, 5);
76        assert!(r1.overlaps(r2));
77
78        let r1 = Region::new(9, 10);
79        let r2 = Region::new(0, 10);
80        assert!(r1.overlaps(r2));
81
82        let r1 = Region::new(2, 5);
83        let r2 = Region::new(0, 10);
84        assert!(r1.overlaps(r2));
85    }
86}