use crate::traits::Scalar;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BorderMode<T> {
Zero,
Constant(T),
Replicate,
Reflect,
}
#[inline]
pub fn fetch_border<T: Scalar>(slice: &[T], idx: isize, border: BorderMode<T>) -> T {
let n = slice.len() as isize;
if idx >= 0 && idx < n {
return slice[idx as usize];
}
match border {
BorderMode::Zero => T::zero(),
BorderMode::Constant(c) => c,
BorderMode::Replicate => {
if idx < 0 {
slice[0]
} else {
slice[(n - 1) as usize]
}
}
BorderMode::Reflect => {
if n <= 1 {
return slice[0];
}
let period = 2 * (n - 1);
let mut m = idx.rem_euclid(period);
if m >= n {
m = period - m;
}
slice[m as usize]
}
}
}