adding rotating_queue.rs
This commit is contained in:
parent
7b227d5f69
commit
8020eba325
|
@ -0,0 +1,33 @@
|
|||
use std::{
|
||||
collections::VecDeque,
|
||||
sync::{Arc, RwLock},
|
||||
};
|
||||
|
||||
pub struct RotatingQueue<T> {
|
||||
deque: Arc<RwLock<VecDeque<T>>>,
|
||||
}
|
||||
|
||||
impl<T: Clone> RotatingQueue<T> {
|
||||
pub fn new<F>(size: usize, creator_functor: F) -> Self
|
||||
where
|
||||
F: Fn() -> T,
|
||||
{
|
||||
let item = Self {
|
||||
deque: Arc::new(RwLock::new(VecDeque::<T>::new())),
|
||||
};
|
||||
{
|
||||
let mut deque = item.deque.write().unwrap();
|
||||
for _i in 0..size {
|
||||
deque.push_back(creator_functor());
|
||||
}
|
||||
}
|
||||
item
|
||||
}
|
||||
|
||||
pub fn get(&self) -> T {
|
||||
let mut deque = self.deque.write().unwrap();
|
||||
let current = deque.pop_front().unwrap();
|
||||
deque.push_back(current.clone());
|
||||
current
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue