1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/// Similar to `core::convert::From`
pub trait Cast<T> {
    /// Convert value from `T`
    fn cast(value: T) -> Self;
}

macro_rules! cast_impl {
    ($TYPE: ty, $FROM: ty) => {
        impl Cast<$FROM> for $TYPE {
            fn cast(value: $FROM) -> Self {
                value as Self
            }
        }
    };

    ($TYPE: ty) => {
        cast_impl!($TYPE, u8);
        cast_impl!($TYPE, u16);
        cast_impl!($TYPE, u32);
        cast_impl!($TYPE, u64);
        #[cfg(feature = "i128")]
        cast_impl!($TYPE, u128);
        cast_impl!($TYPE, usize);

        cast_impl!($TYPE, i8);
        cast_impl!($TYPE, i16);
        cast_impl!($TYPE, i32);
        cast_impl!($TYPE, i64);
        #[cfg(feature = "i128")]
        cast_impl!($TYPE, i128);
        cast_impl!($TYPE, isize);

        cast_impl!($TYPE, f32);
        cast_impl!($TYPE, f64);
    };
}

cast_impl!(u8);
cast_impl!(u16);
cast_impl!(u32);
cast_impl!(u64);
#[cfg(feature = "i128")]
cast_impl!(u128);
cast_impl!(usize);

cast_impl!(i8);
cast_impl!(i16);
cast_impl!(i32);
cast_impl!(i64);
#[cfg(feature = "i128")]
cast_impl!(i128);
cast_impl!(isize);

cast_impl!(f32);
cast_impl!(f64);