1#[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 pub fn overlaps(&self, rhs: Region) -> bool {
15 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}