rill_core/buffer/
registry.rs1use std::collections::HashMap;
14
15use super::tape::{tape_handles, TapeReader, TapeWriter};
16use super::TapeLoop;
17
18pub struct ResourceRegistry<T> {
23 writers: HashMap<String, TapeWriter<T>>,
25 readers: HashMap<String, TapeReader<T>>,
27}
28
29impl<T> ResourceRegistry<T> {
30 pub fn new() -> Self {
32 Self {
33 writers: HashMap::new(),
34 readers: HashMap::new(),
35 }
36 }
37
38 pub fn register_tape(&mut self, name: impl Into<String>, tape: TapeLoop<T>) {
40 let name = name.into();
41 let (writer, reader) = tape_handles(tape);
42 self.writers.insert(name.clone(), writer);
43 self.readers.insert(name, reader);
44 }
45
46 pub fn reader(&self, name: &str) -> Option<TapeReader<T>> {
48 self.readers.get(name).cloned()
49 }
50
51 pub fn writer(&mut self, name: &str) -> Option<TapeWriter<T>> {
56 self.writers.remove(name)
57 }
58
59 pub fn len(&self) -> usize {
61 self.readers.len()
62 }
63
64 pub fn is_empty(&self) -> bool {
66 self.readers.is_empty()
67 }
68}
69
70impl<T> Default for ResourceRegistry<T> {
71 fn default() -> Self {
72 Self::new()
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test_registry_writer_is_unique() {
82 let mut reg = ResourceRegistry::<f32>::new();
83 reg.register_tape("tape_0", TapeLoop::new(1024).unwrap());
84 assert_eq!(reg.len(), 1);
85 assert!(reg.reader("tape_0").is_some());
86 assert!(reg.reader("nonexistent").is_none());
87
88 assert!(reg.writer("tape_0").is_some());
90 assert!(reg.writer("tape_0").is_none());
91 }
92
93 #[test]
94 fn test_registry_reader_writer_share_tape() {
95 let mut reg = ResourceRegistry::<f32>::new();
96 reg.register_tape("t", TapeLoop::new(64).unwrap());
97 let mut writer = reg.writer("t").unwrap();
98 let reader = reg.reader("t").unwrap();
99 writer.write(1.0);
100 writer.write(2.0);
101 assert_eq!(reader.read(0), 2.0);
102 assert_eq!(reader.read(1), 1.0);
103 }
104}