minlin/
large_type.rs

1/// Represents type that has larger type for operations that may be outside of normal values.
2pub trait LargeType {
3    type Large;
4
5    /// Convert this type to its larger type.
6    fn to_large(self) -> Self::Large;
7
8    /// Covert the large type from this type.
9    fn from_large(l: Self::Large) -> Self;
10}
11
12macro_rules! impl_large_type {
13    ($($s:ident -> $l:ident),* $(,)?) => {
14        $(impl LargeType for $s {
15            type Large = $l;
16
17            fn to_large(self) -> Self::Large {
18                self as $l
19            }
20
21            fn from_large(l: Self::Large) -> Self {
22                l as $s
23            }
24        })*
25    };
26}
27
28impl_large_type!(
29    u128 -> f64, i128 -> f64, u64 -> u128, i64 -> i128, f64 -> f64, u32 -> u64,
30    i32 -> i64, f32 -> f64, u16 -> u32, i16 -> i32, u8 -> u16, i8 -> i16,
31);