1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
//! Reading and writing sequentially from buffers. //! //! This is called buffered I/O, and allow buffers to support sequential reading //! and writing to and from buffer. /// A buffer that can keep track of how much has been read from it. pub trait ReadBuf { /// Test if there are any remaining frames to read. /// /// # Examples /// /// ```rust /// use rotary::ReadBuf as _; /// /// let mut buffer = rotary::wrap::interleaved(&[0, 1, 2, 3, 4, 5, 6, 7][..], 2); /// /// assert!(buffer.has_remaining()); /// assert_eq!(buffer.remaining(), 4); /// buffer.advance(4); /// assert_eq!(buffer.remaining(), 0); /// ``` fn has_remaining(&self) -> bool { self.remaining() > 0 } /// Get the number of frames remaining that can be read from the buffer. /// /// # Examples /// /// ```rust /// use rotary::ReadBuf as _; /// /// let buffer = rotary::wrap::interleaved(&[0, 1, 2, 3, 4, 5, 6, 7][..], 2); /// /// assert_eq!(buffer.remaining(), 4); /// ``` fn remaining(&self) -> usize; /// Advance the read number of frames by `n`. /// /// # Examples /// /// ```rust /// use rotary::ReadBuf as _; /// /// let mut buffer = rotary::wrap::interleaved(&[0, 1, 2, 3, 4, 5, 6, 7][..], 2); /// /// assert_eq!(buffer.remaining(), 4); /// buffer.advance(2); /// assert_eq!(buffer.remaining(), 2); /// ``` fn advance(&mut self, n: usize); } impl<B> ReadBuf for &'_ mut B where B: ReadBuf, { fn has_remaining(&self) -> bool { (**self).has_remaining() } fn remaining(&self) -> usize { (**self).remaining() } fn advance(&mut self, n: usize) { (**self).advance(n); } } /// A buffer that can be written to. pub trait WriteBuf { /// Test if this buffer has remaining mutable frames. fn has_remaining_mut(&self) -> bool { self.remaining_mut() > 0 } /// Remaining number of frames that can be written. fn remaining_mut(&self) -> usize; /// Advance the number of frames that has been written. fn advance_mut(&mut self, n: usize); } impl<B> WriteBuf for &'_ mut B where B: WriteBuf, { fn has_remaining_mut(&self) -> bool { (**self).has_remaining_mut() } fn remaining_mut(&self) -> usize { (**self).remaining_mut() } fn advance_mut(&mut self, n: usize) { (**self).advance_mut(n); } }