queue_rs/queue/
queue_vec.rs1use std::collections::VecDeque;
2use std::fmt::Debug;
3use std::sync::{Arc, Mutex};
4
5use anyhow::Result;
6
7use crate::queue::{Element, HasPeekBehavior, QueueBehavior, QueueError, QueueSize};
8
9#[derive(Debug, Clone)]
10pub struct QueueVec<E> {
11 values: Arc<Mutex<VecDeque<E>>>,
12 pub(crate) capacity: QueueSize,
13}
14
15impl<E: Element> QueueVec<E> {
16 pub fn new() -> Self {
17 Self {
18 values: Arc::new(Mutex::new(VecDeque::new())),
19 capacity: QueueSize::Limitless,
20 }
21 }
22
23 pub fn with_num_elements(num_elements: usize) -> Self {
24 Self {
25 values: Arc::new(Mutex::new(VecDeque::new())),
26 capacity: QueueSize::Limited(num_elements),
27 }
28 }
29
30 pub fn with_elements(values: impl IntoIterator<Item = E> + ExactSizeIterator) -> Self {
31 let num_elements = values.len();
32 let vec = values.into_iter().collect::<VecDeque<E>>();
33 Self {
34 values: Arc::new(Mutex::new(vec)),
35 capacity: QueueSize::Limited(num_elements),
36 }
37 }
38}
39
40impl<E: Element + 'static> QueueBehavior<E> for QueueVec<E> {
41 fn len(&self) -> QueueSize {
42 let mg = self.values.lock().unwrap();
43 let len = mg.len();
44 QueueSize::Limited(len)
45 }
46
47 fn capacity(&self) -> QueueSize {
48 self.capacity.clone()
49 }
50
51 fn offer(&mut self, e: E) -> Result<()> {
52 if self.non_full() {
53 let mut mg = self.values.lock().unwrap();
54 mg.push_back(e);
55 Ok(())
56 } else {
57 Err(anyhow::Error::new(QueueError::OfferError(e)))
58 }
59 }
60
61 fn poll(&mut self) -> Result<Option<E>> {
62 let mut mg = self.values.lock().unwrap();
63 Ok(mg.pop_front())
64 }
65}
66
67impl<E: Element + 'static> HasPeekBehavior<E> for QueueVec<E> {
68 fn peek(&self) -> Result<Option<E>> {
69 let mg = self.values.lock().unwrap();
70 Ok(mg.front().map(|e| e.clone()))
71 }
72}