use std::hash::Hash;
type FxIndexSet<T> =
indexmap::set::IndexSet<T, std::hash::BuildHasherDefault<rustc_hash::FxHasher>>;
#[derive(Debug, Clone)]
pub struct HashMapVec<T: Clone + Eq + Hash> {
index_set: FxIndexSet<T>,
}
impl<T: Clone + Eq + Hash> Default for HashMapVec<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Clone + Eq + Hash> HashMapVec<T> {
pub fn new() -> HashMapVec<T> {
HashMapVec {
index_set: FxIndexSet::default(),
}
}
pub fn push(&mut self, t: T) -> usize {
let (n, _) = self.index_set.insert_full(t);
n
}
pub fn len(&self) -> usize {
self.index_set.len()
}
pub fn is_empty(&self) -> bool {
self.index_set.len() == 0
}
pub fn get_val(&self, id: usize) -> &T {
&self.index_set[id]
}
pub fn move_vec(self) -> Vec<T> {
self.index_set.into_iter().collect()
}
pub fn contains_id(&self, id: usize) -> bool {
id < self.len()
}
}