refclone 0.3.0

Mark a type, whose clone operation does not changes it's deref value. Ex Rc,Arc
Documentation
use crate::RefClone;


macro_rules! impl_tuple {
    ($($param: ident),*) => {
        unsafe impl<$($param: RefClone,)*> RefClone for ($($param,)*) {
            fn ref_clone(&self) -> ($($param,)*) {
                #[allow(non_snake_case)]
                let ($($param,)*) = self;
                (
                $(
                    $param.ref_clone(),
                )*
                )
            }
        }
    }
}
impl_tuple!(R0);
impl_tuple!(R0, R1);
impl_tuple!(R0, R1, R2);
impl_tuple!(R0, R1, R2, R3);
impl_tuple!(R0, R1, R2, R3, R4);
impl_tuple!(R0, R1, R2, R3, R4, R5);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14);
impl_tuple!(R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15);

mod assert {
    use std::rc::Rc;

    use crate::RefClone;
    fn _a4<A,B,C,D>(v: (A, B, C, D)) -> (A, B, C, D)
    where
        A: RefClone,
        B: RefClone,
        C: RefClone,
        D: RefClone,
    {
        v.ref_clone()
    }
    fn _a4_rc() {
        _a4((
            Rc::new(1),
            Rc::new(2),
            Rc::new(3),
            Rc::new(4),
            ));
    }
}