diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3d8e749 --- /dev/null +++ b/Cargo.lock @@ -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" diff --git a/src/lib.rs b/src/lib.rs index b93cf3f..683e0b9 100644 --- a/src/lib.rs +++ b/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; diff --git a/src/stream.rs b/src/stream.rs new file mode 100644 index 0000000..27cf766 --- /dev/null +++ b/src/stream.rs @@ -0,0 +1,78 @@ +// Streams moves data from one place to another +// Implementation of double buffered stream interfaces + +use std::sync::Arc; + +struct StreamInner { + // 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 { + inner: Arc>, +} + +struct StreamWriter { + inner: Arc>, +} + +impl StreamInner { + 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 StreamWriter { + 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(buffer_size: usize) -> (StreamWriter, StreamReader) { + todo!() +}