#[inline]
pub const fn distance_on_ring_mod(x: u8, y: u8, n: u8) -> u8 {
debug_assert!(n == 0 || x < n);
debug_assert!(n == 0 || y < n);
let (dl, dr) = if x >= y {
(x.wrapping_sub(y), y.wrapping_add(n).wrapping_sub(x))
} else {
(x.wrapping_add(n).wrapping_sub(y), y.wrapping_sub(x))
};
if dl <= dr {
dl
} else {
dr
}
}
#[cfg(test)]
pub(crate) mod generic {
use core::num::Wrapping;
use num_traits::Unsigned;
#[inline]
pub fn distance_on_ring_mod<T>(x: T, y: T, n: T) -> T
where
T: PartialEq + Ord + Unsigned,
Wrapping<T>: Copy + Ord + Unsigned,
{
debug_assert!(n == T::zero() || x < n);
debug_assert!(n == T::zero() || y < n);
let x = Wrapping(x);
let y = Wrapping(y);
let n = Wrapping(n);
let (dl, dr) = if x >= y {
(x - y, y + n - x)
} else {
(x + n - y, y - x)
};
core::cmp::min(dl.0, dr.0)
}
}
mod tests;