os/util/
ring_buffer.rs

1//! 环形缓冲区模块
2//!
3//! 该模块实现了一个通用的环形缓冲区数据结构,用于高效的循环数据存储和读取
4const RING_BUFFER_SIZE: usize = 256;
5
6/// 缓冲区状态枚举
7#[derive(Copy, Clone, PartialEq)]
8enum BufferStatus {
9    FULL,
10    EMPTY,
11    NORMAL,
12}
13
14/// 环形缓冲区结构体
15pub struct RingBuffer {
16    arr: [u8; RING_BUFFER_SIZE],
17    head: usize,
18    tail: usize,
19    status: BufferStatus,
20}
21
22impl RingBuffer {
23    /// 创建一个新的环形缓冲区实例
24    pub fn new() -> Self {
25        RingBuffer {
26            arr: [0; RING_BUFFER_SIZE],
27            head: 0,
28            tail: 0,
29            status: BufferStatus::EMPTY,
30        }
31    }
32
33    /// 从环形缓冲区读取一个字节
34    pub fn read_byte(&mut self) -> Option<u8> {
35        if self.status == BufferStatus::EMPTY {
36            return None;
37        }
38        let byte = self.arr[self.tail];
39        self.tail = (self.tail + 1) % RING_BUFFER_SIZE;
40        if self.tail == self.head {
41            self.status = BufferStatus::EMPTY;
42        } else {
43            self.status = BufferStatus::NORMAL;
44        }
45        Some(byte)
46    }
47
48    /// 向环形缓冲区写入一个字节
49    pub fn write_byte(&mut self, byte: u8) -> Result<(), ()> {
50        if self.status == BufferStatus::FULL {
51            return Err(());
52        }
53        self.arr[self.head] = byte;
54        self.head = (self.head + 1) % RING_BUFFER_SIZE;
55        if self.head == self.tail {
56            self.status = BufferStatus::FULL;
57        } else {
58            self.status = BufferStatus::NORMAL;
59        }
60        Ok(())
61    }
62
63    /// 获取环形缓冲区的可用空间
64    pub fn available_space(&self) -> usize {
65        match self.status {
66            BufferStatus::FULL => 0,
67            BufferStatus::EMPTY => RING_BUFFER_SIZE,
68            BufferStatus::NORMAL => {
69                if self.head >= self.tail {
70                    RING_BUFFER_SIZE - (self.head - self.tail)
71                } else {
72                    self.tail - self.head
73                }
74            }
75        }
76    }
77}