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 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 self.clear();
82 self.extend(other.iter().map(|(k, v)| (k.deep_clone(), v.deep_clone())));
83 }
84}