Starting to think of a stream architecture
This commit is contained in:
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal 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"
|
||||
15
src/lib.rs
15
src/lib.rs
@ -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
78
src/stream.rs
Normal 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!()
|
||||
}
|
||||
Reference in New Issue
Block a user