#![allow(dead_code)]
pub struct SnapshotManager {
pub snapshots: Vec<Vec<f32>>,
pub max_snapshots: usize,
}
impl SnapshotManager {
pub fn new(max: usize) -> Self {
SnapshotManager {
snapshots: Vec::new(),
max_snapshots: max,
}
}
}
pub fn new_snapshot_manager(max: usize) -> SnapshotManager {
SnapshotManager::new(max)
}
pub fn snapshot_save(m: &mut SnapshotManager, data: &[f32]) {
if m.snapshots.len() >= m.max_snapshots && m.max_snapshots > 0 {
m.snapshots.remove(0);
}
m.snapshots.push(data.to_vec());
}
pub fn snapshot_count(m: &SnapshotManager) -> usize {
m.snapshots.len()
}
pub fn snapshot_get(m: &SnapshotManager, idx: usize) -> Option<&[f32]> {
m.snapshots.get(idx).map(|v| v.as_slice())
}
pub fn snapshot_latest(m: &SnapshotManager) -> Option<&[f32]> {
m.snapshots.last().map(|v| v.as_slice())
}
pub fn snapshot_clear(m: &mut SnapshotManager) {
m.snapshots.clear();
}
pub fn snapshot_is_full(m: &SnapshotManager) -> bool {
m.max_snapshots > 0 && m.snapshots.len() >= m.max_snapshots
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_empty() {
let m = new_snapshot_manager(5);
assert_eq!(snapshot_count(&m), 0);
}
#[test]
fn test_save_and_count() {
let mut m = new_snapshot_manager(5);
snapshot_save(&mut m, &[1.0, 2.0]);
assert_eq!(snapshot_count(&m), 1);
}
#[test]
fn test_get() {
let mut m = new_snapshot_manager(5);
snapshot_save(&mut m, &[3.0, 4.0]);
let s = snapshot_get(&m, 0).expect("should succeed");
assert_eq!(s, &[3.0f32, 4.0]);
}
#[test]
fn test_latest() {
let mut m = new_snapshot_manager(5);
snapshot_save(&mut m, &[1.0]);
snapshot_save(&mut m, &[9.0]);
assert_eq!(snapshot_latest(&m).expect("should succeed"), &[9.0f32]);
}
#[test]
fn test_eviction() {
let mut m = new_snapshot_manager(2);
snapshot_save(&mut m, &[1.0]);
snapshot_save(&mut m, &[2.0]);
snapshot_save(&mut m, &[3.0]);
assert_eq!(snapshot_count(&m), 2);
assert_eq!(snapshot_get(&m, 0).expect("should succeed"), &[2.0f32]);
}
#[test]
fn test_is_full() {
let mut m = new_snapshot_manager(2);
snapshot_save(&mut m, &[1.0]);
snapshot_save(&mut m, &[2.0]);
assert!(snapshot_is_full(&m));
}
#[test]
fn test_clear() {
let mut m = new_snapshot_manager(5);
snapshot_save(&mut m, &[1.0]);
snapshot_clear(&mut m);
assert_eq!(snapshot_count(&m), 0);
}
#[test]
fn test_get_out_of_bounds() {
let m = new_snapshot_manager(5);
assert!(snapshot_get(&m, 99).is_none());
}
}