Skip to content

Commit 1a94193

Browse files
committed
Impl more methods and traits for la_arena::ArenaMap
1 parent d9e462f commit 1a94193

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

lib/la-arena/src/map.rs

+43
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,33 @@ impl<T, V> ArenaMap<Idx<T>, V> {
2121
Self { v: Vec::with_capacity(capacity), _ty: PhantomData }
2222
}
2323

24+
/// Reserves capacity for at least additional more elements to be inserted in the map.
25+
pub fn reserve(&mut self, additional: usize) {
26+
self.v.reserve(additional);
27+
}
28+
29+
/// Clears the map, removing all elements.
30+
pub fn clear(&mut self) {
31+
self.v.clear();
32+
}
33+
34+
/// Shrinks the capacity of the map as much as possible.
35+
pub fn shrink_to_fit(&mut self) {
36+
let min_len = self.v.iter().rposition(|slot| slot.is_some()).map_or(0, |i| i + 1);
37+
self.v.truncate(min_len);
38+
self.v.shrink_to_fit();
39+
}
40+
41+
/// Returns whether the map contains a value for the specified index.
42+
pub fn contains_idx(&self, idx: Idx<T>) -> bool {
43+
matches!(self.v.get(Self::to_idx(idx)), Some(Some(_)))
44+
}
45+
46+
/// Removes an index from the map, returning the value at the index if the index was previously in the map.
47+
pub fn remove(&mut self, idx: Idx<T>) -> Option<V> {
48+
self.v.get_mut(Self::to_idx(idx))?.take()
49+
}
50+
2451
/// Inserts a value associated with a given arena index into the map.
2552
pub fn insert(&mut self, idx: Idx<T>, t: V) {
2653
let idx = Self::to_idx(idx);
@@ -94,6 +121,22 @@ impl<T, V> Default for ArenaMap<Idx<V>, T> {
94121
}
95122
}
96123

124+
impl<T, V> Extend<(Idx<V>, T)> for ArenaMap<Idx<V>, T> {
125+
fn extend<I: IntoIterator<Item = (Idx<V>, T)>>(&mut self, iter: I) {
126+
iter.into_iter().for_each(move |(k, v)| {
127+
self.insert(k, v);
128+
});
129+
}
130+
}
131+
132+
impl<T, V> FromIterator<(Idx<V>, T)> for ArenaMap<Idx<V>, T> {
133+
fn from_iter<I: IntoIterator<Item = (Idx<V>, T)>>(iter: I) -> Self {
134+
let mut this = Self::new();
135+
this.extend(iter);
136+
this
137+
}
138+
}
139+
97140
/// A view into a single entry in a map, which may either be vacant or occupied.
98141
///
99142
/// This `enum` is constructed from the [`entry`] method on [`ArenaMap`].

0 commit comments

Comments
 (0)