use std::ops::Index;
#[repr(C)]
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Default)]
pub enum BorderMode {
#[default]
Clamp,
Wrap,
Reflect,
Reflect101,
Constant,
}
#[inline]
pub(crate) fn reflect_index(i: isize, n: isize) -> usize {
(n - i.rem_euclid(n) - 1) as usize
}
#[inline(always)]
pub(crate) fn reflect_index_101(i: isize, n: isize) -> usize {
let n_r = n - 1;
if n_r == 0 {
return 0;
}
(n_r - i.rem_euclid(n_r)) as usize
}
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)]
pub struct MorphScalar {
pub v0: f64,
pub v1: f64,
pub v2: f64,
pub v3: f64,
}
impl MorphScalar {
pub fn new(v0: f64, v1: f64, v2: f64, v3: f64) -> Self {
Self { v0, v1, v2, v3 }
}
pub fn dup(v: f64) -> Self {
Self {
v0: v,
v1: v,
v2: v,
v3: v,
}
}
}
impl Default for MorphScalar {
fn default() -> Self {
Self::new(0.0, 0.0, 0.0, 0.0)
}
}
impl Index<usize> for MorphScalar {
type Output = f64;
fn index(&self, index: usize) -> &Self::Output {
match index {
0 => &self.v0,
1 => &self.v1,
2 => &self.v2,
3 => &self.v3,
_ => {
unimplemented!("Index out of bounds: {index}");
}
}
}
}