mod sealed {
pub trait Sealed {}
}
pub trait Number: sealed::Sealed + Copy {
fn to_f64(self) -> f64;
}
pub trait Integer: sealed::Sealed + Copy {
fn to_i128(self) -> i128;
}
macro_rules! impl_number {
($($t:ty),* $(,)?) => {
$(
impl sealed::Sealed for $t {}
impl Number for $t {
#[inline]
fn to_f64(self) -> f64 { self as f64 }
}
)*
};
}
macro_rules! impl_integer {
($($t:ty),* $(,)?) => {
$(
impl Integer for $t {
#[inline]
fn to_i128(self) -> i128 { i128::from(self) }
}
)*
};
}
impl_number!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);
impl_integer!(i8, i16, i32, i64, u8, u16, u32, u64);
impl Integer for i128 {
#[inline]
fn to_i128(self) -> i128 {
self
}
}
impl Integer for u128 {
#[inline]
fn to_i128(self) -> i128 {
i128::try_from(self).unwrap_or(i128::MAX)
}
}
impl Integer for isize {
#[inline]
fn to_i128(self) -> i128 {
self as i128
}
}
impl Integer for usize {
#[inline]
fn to_i128(self) -> i128 {
self as i128
}
}