1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use super::TQueueLike;
use crate::test_queue_mod;
use crate::{retry, StmResult, TVar};
use std::any::Any;
#[derive(Clone)]
pub struct TQueue<T> {
read: TVar<Vec<T>>,
write: TVar<Vec<T>>,
}
impl<T> TQueue<T>
where
T: Any + Sync + Send + Clone,
{
pub fn new() -> TQueue<T> {
TQueue {
read: TVar::new(Vec::new()),
write: TVar::new(Vec::new()),
}
}
}
impl<T: Any + Send + Sync + Clone> Default for TQueue<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> TQueueLike<T> for TQueue<T>
where
T: Any + Sync + Send + Clone,
{
fn write(&self, value: T) -> StmResult<()> {
let mut v = self.write.read_clone()?;
v.push(value);
self.write.write(v)
}
fn read(&self) -> StmResult<T> {
let mut rv = self.read.read_clone()?;
match rv.pop() {
Some(value) => {
self.read.write(rv)?;
Ok(value)
}
None => {
let mut wv = self.write.read_clone()?;
if wv.is_empty() {
retry()
} else {
wv.reverse();
let value = wv.pop().unwrap();
self.read.write(wv)?;
self.write.write(Vec::new())?;
Ok(value)
}
}
}
}
fn is_empty(&self) -> StmResult<bool> {
if self.read.read()?.is_empty() {
Ok(self.write.read()?.is_empty())
} else {
Ok(false)
}
}
}
test_queue_mod!(|| { crate::queues::tqueue::TQueue::<i32>::new() });