queue_rs/queue/
queue_vec.rs

1use 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}