use crate::support::PRECISION;
pub(crate) trait SaturateNarrow<J> {
fn saturate_narrow(self, bit_depth: u32) -> J;
}
impl SaturateNarrow<u8> for i32 {
#[inline(always)]
#[allow(clippy::manual_clamp)]
fn saturate_narrow(self, _: u32) -> u8 {
(self >> PRECISION).max(0).min(255) as u8
}
}
impl SaturateNarrow<u8> for i64 {
#[inline(always)]
#[allow(clippy::manual_clamp)]
fn saturate_narrow(self, _: u32) -> u8 {
(self >> PRECISION).max(0).min(255) as u8
}
}
impl SaturateNarrow<u16> for i32 {
#[inline(always)]
#[allow(clippy::manual_clamp)]
fn saturate_narrow(self, bit_depth: u32) -> u16 {
(self >> PRECISION).max(0).min((1 << bit_depth) - 1) as u16
}
}
impl SaturateNarrow<u16> for i64 {
#[inline(always)]
#[allow(clippy::manual_clamp)]
fn saturate_narrow(self, bit_depth: u32) -> u16 {
(self >> PRECISION).max(0).min((1 << bit_depth) - 1) as u16
}
}
impl SaturateNarrow<i16> for i32 {
#[inline(always)]
fn saturate_narrow(self, bit_depth: u32) -> i16 {
let max = (1i32 << (bit_depth - 1)) - 1;
let min = -(1i32 << (bit_depth - 1));
(self >> PRECISION).max(min).min(max) as i16
}
}