Starting to think of a stream architecture

This commit is contained in:
2025-10-21 22:36:22 +02:00
parent 3cebc8f3d9
commit 59ded0585b
3 changed files with 86 additions and 14 deletions

7
Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "rdsp"
version = "0.1.0"

View File

@ -1,14 +1 @@
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
mod stream;

78
src/stream.rs Normal file
View File

@ -0,0 +1,78 @@
// Streams moves data from one place to another
// Implementation of double buffered stream interfaces
use std::sync::Arc;
struct StreamInner<T: Sized> {
// Underlying buffer of data
buffer: Box<[T]>,
buffer_size: usize,
// Current half of the buffer that is on the writer's side
current_write: bool,
available: usize,
written: usize,
}
struct StreamReader<T: Sized> {
inner: Arc<StreamInner<T>>,
}
struct StreamWriter<T: Sized> {
inner: Arc<StreamInner<T>>,
}
impl<T: Sized + Clone> StreamInner<T> {
pub fn new(buffer_size: usize, default: T) -> Self {
Self {
buffer: vec![default; buffer_size * 2].into_boxed_slice(),
buffer_size,
current_write: false,
available: 0,
written: 0,
}
}
pub fn get_read_slice(&self) -> &[T] {
let offset = if self.current_write {
0
} else {
self.buffer_size
};
&self.buffer[offset..(offset + self.buffer_size)]
}
pub fn get_write_slice(&mut self) -> &mut [T] {
let offset = if self.current_write {
self.buffer_size
} else {
0
};
&mut self.buffer[offset..offset + self.buffer_size]
}
}
enum StreamWriteError {
BufferFull,
}
impl<T: Sized> StreamWriter<T> {
pub fn write(&mut self, data: T) -> Result<(), StreamWriteError> {
if self.inner.written == self.inner.buffer_size {
Err(StreamWriteError::BufferFull)
} else {
unsafe {
*self.inner.get_write_slice()[self.inner.written].assume_init_mut() = data;
self.inner.a
}
self.inner.written += 1;
Ok(())
}
}
}
pub fn stream<T: Sized>(buffer_size: usize) -> (StreamWriter<T>, StreamReader<T>) {
todo!()
}