deep_clone/
std_impls.rs

1use {
2    crate::{from_clone, DeepClone},
3    std::{
4        collections::{HashMap, HashSet},
5        hash::Hash,
6        ops::Deref,
7        rc::Rc,
8        sync::Arc,
9        sync::Mutex,
10    },
11};
12
13from_clone!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128);
14from_clone!(f32, f64);
15
16impl<T: DeepClone> DeepClone for Rc<T> {
17    fn deep_clone(&self) -> Self {
18        Rc::new(self.deref().deep_clone())
19    }
20}
21
22impl<T: DeepClone> DeepClone for Arc<T> {
23    fn deep_clone(&self) -> Self {
24        Arc::new(self.deref().deep_clone())
25    }
26}
27
28impl<T: DeepClone> DeepClone for Mutex<T> {
29    fn deep_clone(&self) -> Self {
30        Mutex::new(self.lock().unwrap().deep_clone())
31    }
32
33    fn deep_clone_from(&mut self, source: &Self) {
34        self.get_mut()
35            .unwrap()
36            .deep_clone_from(&mut source.lock().unwrap())
37    }
38}
39
40impl<T: DeepClone> DeepClone for Vec<T> {
41    fn deep_clone(&self) -> Self {
42        self.iter().map(DeepClone::deep_clone).collect()
43    }
44
45    fn deep_clone_from(&mut self, source: &Self) {
46        let mut source = source.iter();
47
48        let mut i = 0;
49        while i < self.len() {
50            if let Some(n) = source.next() {
51                self[i].deep_clone_from(n);
52            } else {
53                self.drain(i..);
54                break;
55            }
56            i += 1;
57        }
58        self.extend(source.map(DeepClone::deep_clone));
59    }
60}
61
62impl<T: DeepClone + Hash + Eq> DeepClone for HashSet<T> {
63    fn deep_clone(&self) -> Self {
64        self.iter().map(DeepClone::deep_clone).collect()
65    }
66    fn deep_clone_from(&mut self, other: &Self) {
67        // TODO (performance): This can use deep_clone_from on some items
68        self.clear();
69        self.extend(other.iter().map(DeepClone::deep_clone));
70    }
71}
72
73impl<K: DeepClone + Hash + Eq, V: DeepClone> DeepClone for HashMap<K, V> {
74    fn deep_clone(&self) -> Self {
75        self.iter()
76            .map(|(k, v)| (k.deep_clone(), v.deep_clone()))
77            .collect()
78    }
79    fn deep_clone_from(&mut self, other: &Self) {
80        // TODO (performance): This can use deep_clone_from on some items
81        self.clear();
82        self.extend(other.iter().map(|(k, v)| (k.deep_clone(), v.deep_clone())));
83    }
84}