use deku::prelude::*;
use vita49_macros::cif_field;
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DekuRead, DekuWrite,
)]
#[deku(endian = "endian", ctx = "endian: deku::ctx::Endian")]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Cif7(u32);
impl Cif7 {
cif_field!(current, 31);
cif_field!(average, 30);
cif_field!(median, 29);
cif_field!(std_dev, 28);
cif_field!(max, 27);
cif_field!(min, 26);
cif_field!(precision, 25);
cif_field!(accuracy, 24);
cif_field!(first_derivative, 23);
cif_field!(second_derivative, 22);
cif_field!(third_derivative, 21);
cif_field!(probability, 20);
cif_field!(belief, 19);
pub fn num_set(&self) -> usize {
u32::count_ones(self.0) as usize
}
}
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DekuRead, DekuWrite,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub(crate) struct Cif7Opts {
pub(crate) current_val: bool,
pub(crate) num_extra_attrs: usize,
}
impl Cif7Opts {
pub(crate) fn from(cif7: Option<&Cif7>) -> Cif7Opts {
if let Some(c) = cif7 {
Cif7Opts {
current_val: c.current(),
num_extra_attrs: if c.num_set() > 0 { c.num_set() - 1 } else { 0 },
}
} else {
Cif7Opts {
current_val: true,
num_extra_attrs: 0,
}
}
}
}