splinter_rs/splinter/
merge.rs1use crate::{cow::CowSplinter, ops::Merge};
2
3use super::{Splinter, SplinterRef};
4
5impl Merge for Splinter {
7 fn merge(&mut self, rhs: &Self) {
8 self.partitions.merge(&rhs.partitions);
9 }
10}
11
12impl<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
19impl<T1: AsRef<[u8]>> Merge<Splinter> for CowSplinter<T1> {
21 fn merge(&mut self, rhs: &Splinter) {
22 self.to_mut().merge(rhs);
23 }
24}
25
26impl<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}