use std::collections::HashMap;
use super::Buffer;
pub struct BufferRegistry<T> {
buffers: HashMap<String, Box<dyn Buffer<T> + Send>>,
}
impl<T> BufferRegistry<T> {
pub fn new() -> Self {
Self {
buffers: HashMap::new(),
}
}
pub fn register(&mut self, name: impl Into<String>, buffer: Box<dyn Buffer<T> + Send>) {
self.buffers.insert(name.into(), buffer);
}
pub fn get_ptr(&self, name: &str) -> Option<*const (dyn Buffer<T> + Send)> {
self.buffers
.get(name)
.map(|b| &**b as *const (dyn Buffer<T> + Send))
}
pub fn take(&mut self, name: &str) -> Option<Box<dyn Buffer<T> + Send>> {
self.buffers.remove(name)
}
pub fn leak(&mut self, name: &str) -> Option<*mut (dyn Buffer<T> + Send)> {
self.buffers.remove(name).map(Box::into_raw)
}
pub fn into_inner(self) -> Vec<Box<dyn Buffer<T> + Send>> {
self.buffers.into_values().collect()
}
pub fn len(&self) -> usize {
self.buffers.len()
}
pub fn is_empty(&self) -> bool {
self.buffers.is_empty()
}
}
impl<T> Default for BufferRegistry<T> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::buffer::HeapBuffer;
#[test]
fn test_registry() {
let mut reg = BufferRegistry::<f32>::new();
reg.register("tape_0", Box::new(HeapBuffer::new(1024)));
assert_eq!(reg.len(), 1);
assert!(reg.get_ptr("tape_0").is_some());
assert!(reg.get_ptr("nonexistent").is_none());
}
}