Skip to main content

rill_core/buffer/
registry.rs

1//! # Buffer registry — named buffers
2//!
3//! [`BufferRegistry`] — a temporary registry used during graph assembly.
4//! Each node that requires a resource buffer receives a pointer through
5//! the registry during `GraphBuilder::build()`.
6//! After assembly the registry is retained in `SignalGraph` to manage
7//! buffer lifetimes.
8
9use std::collections::HashMap;
10
11use super::Buffer;
12
13/// Registry of named buffers.
14///
15/// Used in `GraphBuilder::build()` to allocate resources and distribute
16/// pointers to graph nodes.
17pub struct BufferRegistry<T> {
18    buffers: HashMap<String, Box<dyn Buffer<T>>>,
19}
20
21impl<T> BufferRegistry<T> {
22    /// Create an empty registry.
23    pub fn new() -> Self {
24        Self {
25            buffers: HashMap::new(),
26        }
27    }
28
29    /// Register a named buffer.
30    pub fn register(&mut self, name: impl Into<String>, buffer: Box<dyn Buffer<T>>) {
31        self.buffers.insert(name.into(), buffer);
32    }
33
34    /// Get a raw pointer to a buffer by name.
35    ///
36    /// Used to distribute pointers to graph nodes during build.
37    pub fn get_ptr(&self, name: &str) -> Option<*const dyn Buffer<T>> {
38        self.buffers.get(name).map(|b| &**b as *const dyn Buffer<T>)
39    }
40
41    /// Number of registered buffers.
42    pub fn len(&self) -> usize {
43        self.buffers.len()
44    }
45
46    /// Whether no buffers are registered.
47    pub fn is_empty(&self) -> bool {
48        self.buffers.is_empty()
49    }
50}
51
52impl<T> Default for BufferRegistry<T> {
53    fn default() -> Self {
54        Self::new()
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use crate::buffer::HeapBuffer;
62
63    #[test]
64    fn test_registry() {
65        let mut reg = BufferRegistry::<f32>::new();
66        reg.register("tape_0", Box::new(HeapBuffer::new(1024)));
67        assert_eq!(reg.len(), 1);
68        assert!(reg.get_ptr("tape_0").is_some());
69        assert!(reg.get_ptr("nonexistent").is_none());
70    }
71}