diff --git a/src/lib.rs b/src/lib.rs index 46d13f5..4fd1c29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,10 @@ impl ReadWriteBuf { self.read_cursor == self.write_cursor && !self.full } + pub fn is_full(&self) -> bool { + self.full + } + pub fn for_reading(&mut self) -> Option<&mut [u8]> { let (start, stop) = if self.read_cursor < self.write_cursor { (self.read_cursor, self.write_cursor) @@ -64,7 +68,7 @@ impl ReadWriteBuf { pub fn advance_write(&mut self, count: usize) { self.write_cursor = (self.write_cursor + count) % N; - if self.write_cursor != self.read_cursor { + if count > 0 { self.full = false; } } @@ -74,6 +78,32 @@ impl ReadWriteBuf { mod tests { use super::ReadWriteBuf; + #[test] + fn read_exact_length_works() { + let mut buf = ReadWriteBuf::<10>::new(); + assert!(buf.is_empty()); + assert!(buf.for_writing().is_none()); + + let read_into = buf.for_reading().unwrap(); + assert_eq!(read_into.len(), 10); + buf.advance_read(10); + + assert!(buf.is_full()); + assert_eq!(buf.read_cursor, buf.write_cursor); + + let write_from = buf.for_writing().unwrap(); + assert_eq!(write_from.len(), 10); + buf.advance_write(10); + + assert!(!buf.full); + assert_eq!(buf.read_cursor, buf.write_cursor); + + let read_from = buf.for_reading().unwrap(); + assert_eq!(read_from.len(), 10); + + assert!(buf.for_writing().is_none()); + } + #[test] fn from_0_0_reads_whole_len() { let mut buf = ReadWriteBuf::<16>::new();