splinter_rs/splinter/
merge.rs

1use crate::{cow::CowSplinter, ops::Merge};
2
3use super::{Splinter, SplinterRef};
4
5// Splinter <> Splinter
6impl Merge for Splinter {
7    fn merge(&mut self, rhs: &Self) {
8        self.partitions.merge(&rhs.partitions);
9    }
10}
11
12// Splinter <> SplinterRef
13impl<T: AsRef<[u8]>> Merge<SplinterRef<T>> for Splinter {
14    fn merge(&mut self, rhs: &SplinterRef<T>) {
15        self.partitions.merge(&rhs.load_partitions());
16    }
17}
18
19// CowSplinter <> Splinter
20impl<T1: AsRef<[u8]>> Merge<Splinter> for CowSplinter<T1> {
21    fn merge(&mut self, rhs: &Splinter) {
22        self.to_mut().merge(rhs);
23    }
24}
25
26// CowSplinter <> SplinterRef
27impl<T1: AsRef<[u8]>, T2: AsRef<[u8]>> Merge<SplinterRef<T2>> for CowSplinter<T1> {
28    fn merge(&mut self, rhs: &SplinterRef<T2>) {
29        self.to_mut().merge(rhs);
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use crate::{
36        Splinter,
37        ops::Merge,
38        testutil::{TestSplinter, mksplinter, mksplinters},
39    };
40
41    impl Merge<TestSplinter> for Splinter {
42        fn merge(&mut self, rhs: &TestSplinter) {
43            use TestSplinter::*;
44            match rhs {
45                Splinter(rhs) => self.merge(rhs),
46                SplinterRef(rhs) => self.merge(rhs),
47            }
48        }
49    }
50
51    fn check_merge<L, R, E>(left: L, right: R, expected: E)
52    where
53        L: IntoIterator<Item = u32> + Clone,
54        R: IntoIterator<Item = u32> + Clone,
55        E: IntoIterator<Item = u32> + Clone,
56    {
57        let left = mksplinter(left);
58        let right = mksplinters(right);
59        let expected = mksplinter(expected);
60        for rhs in right.into_iter() {
61            let mut left = left.clone();
62            let label = format!("lhs: {left:?}, rhs: {rhs:?}");
63            left.merge(&rhs);
64            assert_eq!(left, expected, "merge: {label}");
65        }
66    }
67
68    #[test]
69    fn test_sanity() {
70        check_merge(0..0, 0..0, 0..0);
71        check_merge(0..5, 3..10, 0..10);
72        check_merge(0..5, 0..0, 0..5);
73        check_merge(0..0, 0..5, 0..5);
74        check_merge(0..1, 65535..65536, vec![0, 65535]);
75    }
76}