use super::node::{MAX_BLOCK_SIZE, SignalBuffer};
pub struct BufferPool {
buffers: Vec<SignalBuffer>,
}
impl BufferPool {
pub fn new(count: usize, block_size: usize) -> Self {
assert!(block_size <= MAX_BLOCK_SIZE);
let mut buffers = Vec::with_capacity(count);
for _ in 0..count {
let mut buf = SignalBuffer::new();
buf.resize(block_size);
buffers.push(buf);
}
Self { buffers }
}
pub fn get(&self, index: usize) -> &SignalBuffer {
&self.buffers[index]
}
pub fn get_mut(&mut self, index: usize) -> &mut SignalBuffer {
&mut self.buffers[index]
}
pub fn len(&self) -> usize {
self.buffers.len()
}
pub fn is_empty(&self) -> bool {
self.buffers.is_empty()
}
pub fn clear_all(&mut self) {
for buf in &mut self.buffers {
buf.clear();
}
}
pub fn resize_all(&mut self, block_size: usize) {
for buf in &mut self.buffers {
buf.resize(block_size);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_buffer_pool_creation() {
let pool = BufferPool::new(4, 64);
assert_eq!(pool.len(), 4);
for i in 0..4 {
assert_eq!(pool.get(i).len(), 64);
}
}
#[test]
fn test_buffer_pool_clear() {
let mut pool = BufferPool::new(2, 32);
pool.get_mut(0).as_mut_slice()[0] = 1.0;
pool.clear_all();
assert_eq!(pool.get(0).as_slice()[0], 0.0);
}
}