trait_theories_std/
pure_clone.rs

1pub trait PureClone {
2    fn pure_clone(&self) -> Self;
3}
4
5#[cfg(pure_clone)]
6mod impls {
7    use super::PureClone;
8
9    macro_rules! impl_copy_pureclone {
10        ($($ty: ty,)*) => {
11            $(
12                impl PureClone for $ty {
13                    fn pure_clone(&self) -> Self {
14                        *self
15                    }
16                }
17            )
18        };
19    }
20
21    impl_copy_pureclone!(
22        u8, u16, u32, u64,
23        i8, i16, i32, i64,
24        char,
25    );
26
27    macro_rules! impl_tuple_pureclone {
28        ($($p: ident $n: tt,)*) => {
29            impl_tuple_pureclone!($($p $n)*);
30
31            impl<$($p)*> PureClone for ($($p)*)
32            where
33                $($p: PureClone,)*
34            {
35                fn pure_clone(&self) -> Self {
36                    ($(self.$n.clone(),)*)
37                }
38            }
39        };
40    }
41
42    macro_rules! impl_tuple_pureclone_rec {
43        () => {};
44        ($p0: ident $n0: tt, $($pr : ident $nr : tt,)*) => {
45            impl_tuple_pureclone_rec!($($pr $nr,)*);
46            impl_tuple_pureclone!($p0 $n0, $($pr $nr,)*);
47        };
48    }
49
50    impl_tuple_pureclone_rec!(E 11, D 10, C 9, B 8, A 7, Z 6, Y 5, X 4, W 3, V 2, U 1, T 0);
51}
52
53#[cfg(not(pure_clone))]
54impl<T> PureClone for T
55where
56    T: Clone,
57{
58    fn pure_clone(&self) -> Self {
59        self.clone()
60    }
61}