autd3_core/link/
buffer_pool.rs

1use zerocopy::FromZeros;
2
3use crate::geometry::Geometry;
4
5use super::TxMessage;
6
7/// A tx buffer pool for single-threaded use
8pub struct TxBufferPoolSync {
9    num_devices: usize,
10    buffer: Option<Vec<TxMessage>>,
11}
12
13impl TxBufferPoolSync {
14    /// Creates a new [`TxBufferPoolSync`].
15    pub const fn new() -> Self {
16        Self {
17            num_devices: 0,
18            buffer: None,
19        }
20    }
21
22    /// Sets the number of devices.
23    pub fn init(&mut self, geometry: &Geometry) {
24        self.num_devices = geometry.len();
25    }
26
27    /// Borrows a buffer from the pool.
28    pub fn borrow(&mut self) -> Vec<TxMessage> {
29        self.buffer
30            .take()
31            .unwrap_or_else(|| vec![TxMessage::new_zeroed(); self.num_devices])
32    }
33
34    /// Returns a buffer to the pool.
35    pub fn return_buffer(&mut self, buffer: Vec<TxMessage>) {
36        assert_eq!(buffer.len(), self.num_devices);
37        self.buffer = Some(buffer);
38    }
39}
40
41impl Default for TxBufferPoolSync {
42    fn default() -> Self {
43        Self::new()
44    }
45}