better-as 0.1.0

Explicit type casting
Documentation
pub trait WrappingCast {
    type Target;
    fn wrapping_cast(self) -> Self::Target;
}

macro_rules! impl_cast {
    ($($lhs:ty => $rhs:ty, $f:ident;)+) => {
        $(
        impl WrappingCast for $lhs {
            type Target = $rhs;

            #[inline]
            fn wrapping_cast(self) -> Self::Target {
                $f(self)
            }
        }
        )+

        #[test]
        fn size_eq(){
            use core::mem;
            $(
                assert_eq!(mem::size_of::<$lhs>(), mem::size_of::<$rhs>());
            )+
        }

        $(
            #[inline]
            #[must_use]
            pub const fn $f(x: $lhs)->$rhs{
                x as $rhs
            }
        )+
    };
}

impl_cast!(
    u8 => i8,       u8_to_i8;
    u16 => i16,     u16_to_i16;
    u32 => i32,     u32_to_i32;
    u64 => i64,     u64_to_i64;
    u128 => i128,   u128_to_i128;
    usize => isize, usize_to_isize;

    i8 => u8,       i8_to_u8;
    i16 => u16,     i16_to_u16;
    i32 => u32,     i32_to_u32;
    i64 => u64,     i64_to_u64;
    i128 => u128,   i128_to_u128;
    isize => usize, isize_to_usize;
);