Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wiggle/src/region.rs
1691 views
1
/// Represents a contiguous region in memory.
2
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
3
pub struct Region {
4
pub start: u32,
5
pub len: u32,
6
}
7
8
impl 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)]
43
mod 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
}
87
88