#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Eval {
Cp(i16),
Special(i16),
}
impl Eval {
pub const CP_MIN: i16 = -32000;
pub const CP_MAX: i16 = 32000;
#[must_use]
pub const fn from_raw(raw: i16) -> Self {
if raw >= Self::CP_MIN && raw <= Self::CP_MAX { Self::Cp(raw) } else { Self::Special(raw) }
}
#[must_use]
pub const fn from_cp(value: i32) -> Option<Self> {
if value < Self::CP_MIN as i32 || value > Self::CP_MAX as i32 {
return None;
}
Some(Self::Cp(value as i16))
}
#[must_use]
pub const fn from_i32(value: i32) -> Self {
let clamped = if value < i16::MIN as i32 {
i16::MIN
} else if value > i16::MAX as i32 {
i16::MAX
} else {
value as i16
};
Self::from_raw(clamped)
}
#[must_use]
pub const fn raw(self) -> i16 {
match self {
Self::Cp(value) | Self::Special(value) => value,
}
}
#[must_use]
pub const fn to_i32(self) -> i32 {
self.raw() as i32
}
#[must_use]
pub const fn is_special(self) -> bool {
matches!(self, Self::Special(_))
}
}