1use crate::CircularBuffer;
5use std::cmp;
6use std::io::BufRead;
7use std::io::Read;
8use std::io::Result;
9use std::io::Write;
10
11impl<const N: usize> Write for CircularBuffer<N, u8> {
12 #[inline]
13 fn write(&mut self, src: &[u8]) -> Result<usize> {
14 self.extend_from_slice(src);
15 Ok(src.len())
16 }
17
18 #[inline]
19 fn flush(&mut self) -> Result<()> {
20 Ok(())
21 }
22}
23
24impl<const N: usize> Read for CircularBuffer<N, u8> {
25 fn read(&mut self, dst: &mut [u8]) -> Result<usize> {
26 let (mut front, mut back) = self.as_slices();
27 let mut count = front.read(dst)?;
28 count += back.read(&mut dst[count..])?;
29 self.truncate_front(self.len() - count);
30 Ok(count)
31 }
32}
33
34impl<const N: usize> BufRead for CircularBuffer<N, u8> {
35 fn fill_buf(&mut self) -> Result<&[u8]> {
36 let (front, back) = self.as_slices();
37 if !front.is_empty() {
38 Ok(front)
39 } else {
40 Ok(back)
41 }
42 }
43
44 fn consume(&mut self, amt: usize) {
45 let amt = cmp::min(amt, self.len());
46 self.drain(..amt);
47 }
48}