cds/arraystring/traits/
clone.rs1use crate::{arraystring::ArrayString, len::LengthType, mem::SpareMemoryPolicy};
2use core::{clone::Clone, ptr};
3
4impl<L, SM, const C: usize> Clone for ArrayString<C, L, SM>
5where
6    L: LengthType,
7    SM: SpareMemoryPolicy<u8>,
8{
9    #[inline]
10    fn clone(&self) -> Self {
11        let len = self.len();
12        let mut s = Self::new_raw(len);
13        unsafe {
14            ptr::copy_nonoverlapping(self.as_ptr(), s.as_mut_ptr(), len);
15            SM::init(s.as_mut_ptr().add(len), C - len);
16        }
17        s
18    }
19
20    #[inline]
21    fn clone_from(&mut self, source: &Self) {
22        let old_len = self.len();
23        let len = source.len();
24        unsafe {
25            ptr::copy_nonoverlapping(source.as_ptr(), self.as_mut_ptr(), len);
26            self.set_len(len);
27        }
28
29        let spare_bytes = if old_len > len { old_len - len } else { 0 };
30        unsafe {
31            SM::init(self.as_mut_ptr().add(len), spare_bytes);
32        }
33    }
34}
35
36#[cfg(test)]
37mod testing {
38    use crate as cds;
39    use cds::{
40        arraystring::{test_arraystring::check_spare_memory, ArrayString},
41        len::U8,
42        mem::Pattern,
43    };
44
45    const PATTERN: u8 = 0xBC;
46    type AS = ArrayString<16, U8, Pattern<PATTERN>>;
47
48    #[test]
49    fn test_clone() {
50        let s = AS::try_from("cds").unwrap();
51        let d = s.clone();
52        assert_eq!(d, "cds");
53        check_spare_memory(&s, PATTERN);
54    }
55
56    #[test]
57    fn test_clone_from() {
58        let s = AS::try_from("cds").unwrap();
59        let s2 = AS::try_from("cdscdscds").unwrap();
60
61        let mut d = AS::try_from("onetwo").unwrap();
62        assert_eq!(d, "onetwo");
63        check_spare_memory(&d, PATTERN);
64
65        d.clone_from(&s);
66        assert_eq!(d, "cds");
67        check_spare_memory(&d, PATTERN);
68
69        d.clone_from(&s2);
70        assert_eq!(d, "cdscdscds");
71        check_spare_memory(&d, PATTERN);
72    }
73}