trait_theories_std/
pure_clone.rs1pub 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}