pub struct OptionalVec<T> {
values: Vec<Option<T>>,
holes: Vec<usize>,
}
impl<T> Default for OptionalVec<T> {
fn default() -> Self {
Self { values: Default::default(), holes: Default::default() }
}
}
impl<T> OptionalVec<T> {
#[inline]
pub fn with_capacity(cap: usize) -> Self {
Self { values: Vec::with_capacity(cap), holes: Default::default() }
}
#[inline]
pub fn insert(&mut self, elem: T) -> usize {
let idx = self.holes.pop().unwrap_or(self.values.len());
if idx < self.values.len() {
self.values[idx] = Some(elem);
} else {
self.values.push(Some(elem));
}
idx
}
#[inline]
pub fn next_idx(&self) -> usize {
self.holes.last().copied().unwrap_or(self.values.len())
}
#[inline]
pub fn remove(&mut self, idx: usize) -> T {
let val = self.values[idx].take();
self.holes.push(idx);
val.unwrap()
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = &T> {
self.values.iter().filter_map(|v| v.as_ref())
}
#[inline]
pub fn len(&self) -> usize {
self.values.len() - self.holes.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T> std::ops::Index<usize> for OptionalVec<T> {
type Output = T;
fn index(&self, idx: usize) -> &Self::Output {
self.values[idx].as_ref().unwrap()
}
}
impl<T> std::ops::IndexMut<usize> for OptionalVec<T> {
fn index_mut(&mut self, idx: usize) -> &mut Self::Output {
self.values[idx].as_mut().unwrap()
}
}