use std::collections::HashMap;
use super::tape::{tape_handles, TapeReader, TapeWriter};
use super::TapeLoop;
pub struct ResourceRegistry<T> {
writers: HashMap<String, TapeWriter<T>>,
readers: HashMap<String, TapeReader<T>>,
}
impl<T> ResourceRegistry<T> {
pub fn new() -> Self {
Self {
writers: HashMap::new(),
readers: HashMap::new(),
}
}
pub fn register_tape(&mut self, name: impl Into<String>, tape: TapeLoop<T>) {
let name = name.into();
let (writer, reader) = tape_handles(tape);
self.writers.insert(name.clone(), writer);
self.readers.insert(name, reader);
}
pub fn reader(&self, name: &str) -> Option<TapeReader<T>> {
self.readers.get(name).cloned()
}
pub fn writer(&mut self, name: &str) -> Option<TapeWriter<T>> {
self.writers.remove(name)
}
pub fn len(&self) -> usize {
self.readers.len()
}
pub fn is_empty(&self) -> bool {
self.readers.is_empty()
}
}
impl<T> Default for ResourceRegistry<T> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_registry_writer_is_unique() {
let mut reg = ResourceRegistry::<f32>::new();
reg.register_tape("tape_0", TapeLoop::new(1024).unwrap());
assert_eq!(reg.len(), 1);
assert!(reg.reader("tape_0").is_some());
assert!(reg.reader("nonexistent").is_none());
assert!(reg.writer("tape_0").is_some());
assert!(reg.writer("tape_0").is_none());
}
#[test]
fn test_registry_reader_writer_share_tape() {
let mut reg = ResourceRegistry::<f32>::new();
reg.register_tape("t", TapeLoop::new(64).unwrap());
let mut writer = reg.writer("t").unwrap();
let reader = reg.reader("t").unwrap();
writer.write(1.0);
writer.write(2.0);
assert_eq!(reader.read(0), 2.0);
assert_eq!(reader.read(1), 1.0);
}
}