1
Fork 0

Impl more methods and traits for la_arena::ArenaMap

This commit is contained in:
oxalica 2022-08-07 04:17:04 +08:00
parent d9e462fd97
commit 1a94193602

View file

@ -21,6 +21,33 @@ impl<T, V> ArenaMap<Idx<T>, V> {
Self { v: Vec::with_capacity(capacity), _ty: PhantomData } Self { v: Vec::with_capacity(capacity), _ty: PhantomData }
} }
/// Reserves capacity for at least additional more elements to be inserted in the map.
pub fn reserve(&mut self, additional: usize) {
self.v.reserve(additional);
}
/// Clears the map, removing all elements.
pub fn clear(&mut self) {
self.v.clear();
}
/// Shrinks the capacity of the map as much as possible.
pub fn shrink_to_fit(&mut self) {
let min_len = self.v.iter().rposition(|slot| slot.is_some()).map_or(0, |i| i + 1);
self.v.truncate(min_len);
self.v.shrink_to_fit();
}
/// Returns whether the map contains a value for the specified index.
pub fn contains_idx(&self, idx: Idx<T>) -> bool {
matches!(self.v.get(Self::to_idx(idx)), Some(Some(_)))
}
/// Removes an index from the map, returning the value at the index if the index was previously in the map.
pub fn remove(&mut self, idx: Idx<T>) -> Option<V> {
self.v.get_mut(Self::to_idx(idx))?.take()
}
/// Inserts a value associated with a given arena index into the map. /// Inserts a value associated with a given arena index into the map.
pub fn insert(&mut self, idx: Idx<T>, t: V) { pub fn insert(&mut self, idx: Idx<T>, t: V) {
let idx = Self::to_idx(idx); let idx = Self::to_idx(idx);
@ -94,6 +121,22 @@ impl<T, V> Default for ArenaMap<Idx<V>, T> {
} }
} }
impl<T, V> Extend<(Idx<V>, T)> for ArenaMap<Idx<V>, T> {
fn extend<I: IntoIterator<Item = (Idx<V>, T)>>(&mut self, iter: I) {
iter.into_iter().for_each(move |(k, v)| {
self.insert(k, v);
});
}
}
impl<T, V> FromIterator<(Idx<V>, T)> for ArenaMap<Idx<V>, T> {
fn from_iter<I: IntoIterator<Item = (Idx<V>, T)>>(iter: I) -> Self {
let mut this = Self::new();
this.extend(iter);
this
}
}
/// A view into a single entry in a map, which may either be vacant or occupied. /// A view into a single entry in a map, which may either be vacant or occupied.
/// ///
/// This `enum` is constructed from the [`entry`] method on [`ArenaMap`]. /// This `enum` is constructed from the [`entry`] method on [`ArenaMap`].