use num_traits::NumCast;
use crate::*;
pub trait Enlargeable: PixelComponent {
type Larger: PixelComponent;
fn clamp_from(n: Self::Larger) -> Self {
if n > Self::COMPONENT_MAX.to_larger() {
Self::COMPONENT_MAX
} else if n < Self::COMPONENT_MIN.to_larger() {
Self::COMPONENT_MIN
} else {
NumCast::from(n).unwrap()
}
}
fn to_larger(self) -> Self::Larger {
NumCast::from(self).unwrap()
}
}
macro_rules! implement_enlargeable {
($base:ident, $larger:ident) => {
impl Enlargeable for $base {
type Larger = $larger;
}
};
}
implement_enlargeable!(u8, u32);
implement_enlargeable!(u16, u32);
implement_enlargeable!(u32, u64);
implement_enlargeable!(u64, u128);
implement_enlargeable!(usize, u128);
implement_enlargeable!(i8, i32);
implement_enlargeable!(i16, i32);
implement_enlargeable!(i32, i64);
implement_enlargeable!(i64, i128);
implement_enlargeable!(isize, i128);
implement_enlargeable!(f32, f64);
implement_enlargeable!(f64, f64);