orx_split_vec/common_traits/
clone.rs

1use 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}