use crate::data_structures::BitSet;
use bitflags::_core::fmt::Formatter;
use index_vec::Idx;
use std::collections::VecDeque;
use std::fmt::Debug;
use std::iter::FromIterator;
pub struct WorkQueue<T: Idx + From<usize>> {
pub deque: VecDeque<T>,
pub set: BitSet<T>,
}
impl<T: Idx + From<usize>> WorkQueue<T> {
#[inline]
pub fn with_all(len_idx: T) -> Self {
WorkQueue {
deque: (0..len_idx.index()).map(T::from_usize).collect(),
set: BitSet::new_filled(len_idx),
}
}
#[inline]
pub fn with_none(len_idx: T) -> Self {
WorkQueue {
deque: VecDeque::with_capacity(len_idx.index()),
set: BitSet::new_empty(len_idx),
}
}
#[inline]
pub fn insert(&mut self, element: T) -> bool {
if self.set.put(element) {
false
} else {
self.deque.push_back(element);
true
}
}
#[inline]
pub fn pop(&mut self) -> Option<T> {
if let Some(element) = self.deque.pop_front() {
self.set.set(element, false);
Some(element)
} else {
None
}
}
#[inline]
pub fn take(&mut self) -> Option<T> {
if let Some(element) = self.deque.pop_front() {
Some(element)
} else {
None
}
}
#[inline]
pub fn is_empty(&self) -> bool {
self.deque.is_empty()
}
}
impl<I: Idx + From<usize>> From<BitSet<I>> for WorkQueue<I> {
fn from(set: BitSet<I>) -> Self {
Self {
deque: VecDeque::from_iter(set.ones()),
set,
}
}
}
impl<I: Idx + From<usize> + Debug> Debug for WorkQueue<I> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.write_str("[")?;
for item in self.deque.iter() {
Debug::fmt(item, f)?;
f.write_str(" , ")?;
}
f.write_str("]")
}
}