circular_buffer/
io.rs

1// Copyright © 2023-2025 Andrea Corbellini and contributors
2// SPDX-License-Identifier: BSD-3-Clause
3
4use 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}