use std::marker::PhantomData; use rustc_index::Idx; #[derive(Default)] pub struct AppendOnlyIndexVec { vec: elsa::sync::LockFreeFrozenVec, _marker: PhantomData, } impl AppendOnlyIndexVec { pub fn new() -> Self { Self { vec: elsa::sync::LockFreeFrozenVec::new(), _marker: PhantomData } } pub fn push(&self, val: T) -> I { let i = self.vec.push(val); I::new(i) } pub fn get(&self, i: I) -> Option { let i = i.index(); self.vec.get(i) } } #[derive(Default)] pub struct AppendOnlyVec { vec: parking_lot::RwLock>, } impl AppendOnlyVec { pub fn new() -> Self { Self { vec: Default::default() } } pub fn push(&self, val: T) -> usize { let mut v = self.vec.write(); let n = v.len(); v.push(val); n } pub fn get(&self, i: usize) -> Option { self.vec.read().get(i).copied() } pub fn iter_enumerated(&self) -> impl Iterator + '_ { (0..) .map(|i| (i, self.get(i))) .take_while(|(_, o)| o.is_some()) .filter_map(|(i, o)| Some((i, o?))) } pub fn iter(&self) -> impl Iterator + '_ { (0..).map(|i| self.get(i)).take_while(|o| o.is_some()).flatten() } } impl AppendOnlyVec { pub fn contains(&self, val: T) -> bool { self.iter_enumerated().any(|(_, v)| v == val) } } impl FromIterator for AppendOnlyVec { fn from_iter>(iter: T) -> Self { let this = Self::new(); for val in iter { this.push(val); } this } }