rill_core/buffer/
registry.rs1use std::collections::HashMap;
10
11use super::Buffer;
12
13pub struct BufferRegistry<T> {
18 buffers: HashMap<String, Box<dyn Buffer<T> + Send>>,
19}
20
21impl<T> BufferRegistry<T> {
22 pub fn new() -> Self {
24 Self {
25 buffers: HashMap::new(),
26 }
27 }
28
29 pub fn register(&mut self, name: impl Into<String>, buffer: Box<dyn Buffer<T> + Send>) {
31 self.buffers.insert(name.into(), buffer);
32 }
33
34 pub fn get_ptr(&self, name: &str) -> Option<*const (dyn Buffer<T> + Send)> {
38 self.buffers
39 .get(name)
40 .map(|b| &**b as *const (dyn Buffer<T> + Send))
41 }
42
43 pub fn take(&mut self, name: &str) -> Option<Box<dyn Buffer<T> + Send>> {
45 self.buffers.remove(name)
46 }
47
48 pub fn leak(&mut self, name: &str) -> Option<*mut (dyn Buffer<T> + Send)> {
52 self.buffers.remove(name).map(Box::into_raw)
53 }
54
55 pub fn into_inner(self) -> Vec<Box<dyn Buffer<T> + Send>> {
57 self.buffers.into_values().collect()
58 }
59
60 pub fn len(&self) -> usize {
62 self.buffers.len()
63 }
64
65 pub fn is_empty(&self) -> bool {
67 self.buffers.is_empty()
68 }
69}
70
71impl<T> Default for BufferRegistry<T> {
72 fn default() -> Self {
73 Self::new()
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80 use crate::buffer::HeapBuffer;
81
82 #[test]
83 fn test_registry() {
84 let mut reg = BufferRegistry::<f32>::new();
85 reg.register("tape_0", Box::new(HeapBuffer::new(1024)));
86 assert_eq!(reg.len(), 1);
87 assert!(reg.get_ptr("tape_0").is_some());
88 assert!(reg.get_ptr("nonexistent").is_none());
89 }
90}