lockfree_ringbuffer/
reference.rs1pub 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}