quill_sql/utils/
ring_buffer.rs1#[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}