quill_sql/utils/
ring_buffer.rs

1#[derive(Debug)]
2pub struct RingBuffer<T> {
3    buf: Vec<Option<T>>,
4    head: usize,
5    len: usize,
6}
7
8impl<T> RingBuffer<T> {
9    pub fn with_capacity(cap: usize) -> Self {
10        assert!(cap > 0);
11        let mut buf = Vec::with_capacity(cap);
12        buf.resize_with(cap, || None);
13        Self {
14            buf,
15            head: 0,
16            len: 0,
17        }
18    }
19
20    pub fn len(&self) -> usize {
21        self.len
22    }
23    pub fn is_empty(&self) -> bool {
24        self.len == 0
25    }
26    pub fn capacity(&self) -> usize {
27        self.buf.len()
28    }
29
30    pub fn push(&mut self, item: T) {
31        let cap = self.buf.len();
32        if self.len < cap {
33            let tail = (self.head + self.len) % cap;
34            self.buf[tail] = Some(item);
35            self.len += 1;
36        } else {
37            self.buf[self.head] = Some(item);
38            self.head = (self.head + 1) % cap;
39        }
40    }
41
42    pub fn pop(&mut self) -> Option<T> {
43        if self.len == 0 {
44            return None;
45        }
46        let idx = self.head;
47        let item = self.buf[idx].take();
48        self.head = (self.head + 1) % self.buf.len();
49        self.len -= 1;
50        item
51    }
52}