fast_pull/base/
progress.rs

1use core::ops::Range;
2
3pub type ProgressEntry = Range<u64>;
4
5pub trait Mergeable {
6    fn can_merge(&self, other: &Self) -> bool;
7}
8
9impl Mergeable for ProgressEntry {
10    #[inline(always)]
11    fn can_merge(&self, b: &Self) -> bool {
12        self.start == b.end || b.start == self.end
13    }
14}
15
16#[cfg(test)]
17mod tests {
18    use super::*;
19
20    #[test]
21    fn test_can_merge_adjacent() {
22        let a = 0..5;
23        let b = 5..10;
24        assert!(a.can_merge(&b));
25        assert!(b.can_merge(&a));
26    }
27
28    #[test]
29    fn test_cannot_merge_non_adjacent_non_overlapping() {
30        let a = 0..5;
31        let b = 7..10;
32        assert!(!a.can_merge(&b));
33        assert!(!b.can_merge(&a));
34    }
35
36    #[test]
37    fn test_cannot_merge_disjoint() {
38        let a = 0..5;
39        let b = 6..15;
40        assert!(!a.can_merge(&b));
41        assert!(!b.can_merge(&a));
42    }
43}