lockfree_ringbuffer/
reference.rs

1pub struct BoundedBuffer<T> {
2    size: usize,
3    data: Vec<T>,
4    reading: bool,
5}
6
7pub struct ReadToken;
8
9impl<T> BoundedBuffer<T> {
10    pub fn new(size: usize) -> Self {
11        assert!(size > 0);
12        BoundedBuffer { size, data: vec![], reading: false }
13    }
14
15    pub fn write(&mut self, x: T) -> Result<(), ()> {
16        if self.data.len() < self.size {
17            self.data.push(x);
18            Ok(())
19        } else {
20            if self.reading {
21                Err(())
22            } else {
23                self.data.rotate_left(1);
24                self.data[self.size - 1] = x;
25                Ok(())
26            }
27        }
28    }
29
30    pub fn read(&mut self) -> Result<(), ()> {
31        if self.reading {
32            Err(())
33        } else {
34            self.reading = true;
35            Ok(())
36        }
37    }
38
39    pub fn stop_reading(&mut self) -> Result<(), ()> {
40        if !self.reading {
41            Err(())
42        } else {
43            self.reading = false;
44            Ok(())
45        }
46    }
47
48    pub fn next(&mut self) -> Result<Option<T>, ()> {
49        if !self.reading {
50            Err(())
51        } else {
52            if self.data.is_empty() {
53                Ok(None)
54            } else {
55                self.data.rotate_left(1);
56                Ok(self.data.pop())
57            }
58        }
59    }
60
61}