use molrs::types::F;
pub trait ComputeResult {
fn finalize(&mut self) {}
}
pub trait DescriptorRow {
fn as_row(&self) -> &[F];
}
impl<T: ComputeResult + Clone + Send + Sync + 'static> ComputeResult for Vec<T> {
fn finalize(&mut self) {
for item in self.iter_mut() {
item.finalize();
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Clone)]
struct NoopResult;
impl ComputeResult for NoopResult {}
#[derive(Clone)]
struct Counter {
raw: f64,
norm: f64,
finalized: bool,
}
impl ComputeResult for Counter {
fn finalize(&mut self) {
if !self.finalized {
self.norm = self.raw / 10.0;
self.finalized = true;
}
}
}
#[derive(Clone)]
struct Row(Vec<F>);
impl DescriptorRow for Row {
fn as_row(&self) -> &[F] {
&self.0
}
}
#[test]
fn default_finalize_is_noop() {
let mut x = NoopResult;
x.finalize();
x.finalize();
}
#[test]
fn finalize_is_idempotent() {
let mut c = Counter {
raw: 50.0,
norm: 0.0,
finalized: false,
};
c.finalize();
assert!((c.norm - 5.0).abs() < 1e-12);
c.finalize();
assert!((c.norm - 5.0).abs() < 1e-12);
}
#[test]
fn descriptor_row_as_row() {
let r = Row(vec![1.0, 2.0, 3.0]);
assert_eq!(r.as_row(), &[1.0, 2.0, 3.0]);
}
}