use std::fmt::Debug;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MomentData {
scale: f32,
offset: f32,
values: Vec<u8>,
}
impl MomentData {
pub fn from_fixed_point(scale: f32, offset: f32, values: Vec<u8>) -> Self {
Self {
scale,
offset,
values,
}
}
pub fn values(&self) -> Vec<MomentValue> {
let copied_values = self.values.iter().copied();
if self.scale == 0.0 {
return copied_values
.map(|raw_value| MomentValue::Value(raw_value as f32))
.collect();
}
copied_values
.map(|raw_value| match raw_value {
0 => MomentValue::BelowThreshold,
1 => MomentValue::RangeFolded,
_ => MomentValue::Value((raw_value as f32 - self.offset) / self.scale),
})
.collect()
}
}
impl Debug for MomentData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MomentData")
.field("values", &self.values())
.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MomentValue {
Value(f32),
BelowThreshold,
RangeFolded,
}