orx_split_vec/common_traits/
clone.rs1use crate::{Growth, SplitVec};
2use alloc::vec::Vec;
3use orx_pinned_vec::PinnedVec;
4
5impl<T, G> Clone for SplitVec<T, G>
6where
7 T: Clone,
8 G: Growth,
9{
10 fn clone(&self) -> Self {
11 let mut fragments = Vec::with_capacity(self.fragments.capacity());
12
13 for fragment in &self.fragments {
14 let mut vec = Vec::with_capacity(fragment.capacity());
15 vec.extend_from_slice(fragment);
16 fragments.push(vec.into());
17 }
18
19 Self::from_raw_parts(self.len(), fragments, self.growth().clone())
20 }
21}
22
23#[cfg(test)]
24mod tests {
25 use crate::*;
26
27 #[test]
28 fn clone() {
29 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
30 for i in 0..57 {
31 vec.push(i);
32 }
33
34 let clone = vec.clone();
35
36 assert_eq!(vec.len(), clone.len());
37 assert_eq!(vec.fragments().len(), clone.fragments().len());
38 assert_eq!(vec.capacity(), clone.capacity());
39 assert_eq!(vec.capacity_state(), clone.capacity_state());
40 assert_eq!(
41 vec.maximum_concurrent_capacity(),
42 clone.maximum_concurrent_capacity()
43 );
44
45 for (a, b) in vec.fragments().iter().zip(clone.fragments().iter()) {
46 assert_eq!(a.len(), b.len());
47 assert_eq!(a.capacity(), b.capacity());
48
49 for (x, y) in a.iter().zip(b.iter()) {
50 assert_eq!(x, y);
51 }
52 }
53 }
54
55 test_all_growth_types!(test);
56 }
57}