pub struct Arena<T> { /* private fields */ }Expand description
The Arena allows inserting and removing elements that are referred to by
Index.
See the module-level documentation for example usage and motivation.
Implementations§
Source§impl<T> Arena<T>
impl<T> Arena<T>
Sourcepub fn with_capacity(n: usize) -> Arena<T>
pub fn with_capacity(n: usize) -> Arena<T>
Constructs a new, empty Arena<T> with the specified capacity.
The Arena<T> will be able to hold n elements without further allocation.
§Examples
let mut arena = Arena::with_capacity(10);
// These insertions will not require further allocation.
for i in 0..10 {
assert!(arena.try_insert(i).is_ok());
}
// But now we are at capacity, and there is no more room.
assert!(arena.try_insert(99).is_err());Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear all the items inside the arena, but keep its allocation.
§Examples
let mut arena = Arena::with_capacity(1);
arena.insert(42);
arena.insert(43);
arena.clear();
assert_eq!(arena.capacity(), 2);Sourcepub fn try_insert(&mut self, value: T) -> Result<Index, T>
pub fn try_insert(&mut self, value: T) -> Result<Index, T>
Attempts to insert value into the arena using existing capacity.
This method will never allocate new capacity in the arena.
If insertion succeeds, then the value’s index is returned. If
insertion fails, then Err(value) is returned to give ownership of
value back to the caller.
§Examples
let mut arena = Arena::new();
match arena.try_insert(42) {
Ok(idx) => {
// Insertion succeeded.
assert_eq!(arena[idx], 42);
}
Err(x) => {
// Insertion failed.
assert_eq!(x, 42);
}
};Sourcepub fn try_insert_with<F: FnOnce(Index) -> T>(
&mut self,
create: F,
) -> Result<Index, F>
pub fn try_insert_with<F: FnOnce(Index) -> T>( &mut self, create: F, ) -> Result<Index, F>
Attempts to insert the value returned by create into the arena using existing capacity.
create is called with the new value’s associated index, allowing values that know their own index.
This method will never allocate new capacity in the arena.
If insertion succeeds, then the new index is returned. If
insertion fails, then Err(create) is returned to give ownership of
create back to the caller.
§Examples
let mut arena = Arena::new();
match arena.try_insert_with(|idx| (42, idx)) {
Ok(idx) => {
// Insertion succeeded.
assert_eq!(arena[idx].0, 42);
assert_eq!(arena[idx].1, idx);
}
Err(x) => {
// Insertion failed.
}
};Sourcepub fn insert(&mut self, value: T) -> Index
pub fn insert(&mut self, value: T) -> Index
Insert value into the arena, allocating more capacity if necessary.
The value’s associated index in the arena is returned.
§Examples
let mut arena = Arena::new();
let idx = arena.insert(42);
assert_eq!(arena[idx], 42);Sourcepub fn insert_with(&mut self, create: impl FnOnce(Index) -> T) -> Index
pub fn insert_with(&mut self, create: impl FnOnce(Index) -> T) -> Index
Insert the value returned by create into the arena, allocating more capacity if necessary.
create is called with the new value’s associated index, allowing values that know their own index.
The new value’s associated index in the arena is returned.
§Examples
let mut arena = Arena::new();
let idx = arena.insert_with(|idx| (42, idx));
assert_eq!(arena[idx].0, 42);
assert_eq!(arena[idx].1, idx);Sourcepub fn remove(&mut self, i: Index) -> Option<T>
pub fn remove(&mut self, i: Index) -> Option<T>
Remove the element at index i from the arena.
If the element at index i is still in the arena, then it is
returned. If it is not in the arena, then None is returned.
§Examples
let mut arena = Arena::new();
let idx = arena.insert(42);
assert_eq!(arena.remove(idx), Some(42));
assert_eq!(arena.remove(idx), None);Sourcepub fn retain(&mut self, predicate: impl FnMut(Index, &mut T) -> bool)
pub fn retain(&mut self, predicate: impl FnMut(Index, &mut T) -> bool)
Retains only the elements specified by the predicate.
In other words, remove all indices such that predicate(index, &value) returns false.
§Examples
let mut crew = Arena::new();
crew.extend(&["Jim Hawkins", "John Silver", "Alexander Smollett", "Israel Hands"]);
let pirates = ["John Silver", "Israel Hands"]; // too dangerous to keep them around
crew.retain(|_index, member| !pirates.contains(member));
let mut crew_members = crew.iter().map(|(_, member)| **member);
assert_eq!(crew_members.next(), Some("Jim Hawkins"));
assert_eq!(crew_members.next(), Some("Alexander Smollett"));
assert!(crew_members.next().is_none());Sourcepub fn contains(&self, i: Index) -> bool
pub fn contains(&self, i: Index) -> bool
Is the element at index i in the arena?
Returns true if the element at i is in the arena, false otherwise.
§Examples
let mut arena = Arena::new();
let idx = arena.insert(42);
assert!(arena.contains(idx));
arena.remove(idx);
assert!(!arena.contains(idx));Sourcepub fn get(&self, i: Index) -> Option<&T>
pub fn get(&self, i: Index) -> Option<&T>
Get a shared reference to the element at index i if it is in the
arena.
If the element at index i is not in the arena, then None is returned.
§Examples
let mut arena = Arena::new();
let idx = arena.insert(42);
assert_eq!(arena.get(idx), Some(&42));
arena.remove(idx);
assert!(arena.get(idx).is_none());Sourcepub fn get_mut(&mut self, i: Index) -> Option<&mut T>
pub fn get_mut(&mut self, i: Index) -> Option<&mut T>
Get an exclusive reference to the element at index i if it is in the
arena.
If the element at index i is not in the arena, then None is returned.
§Examples
let mut arena = Arena::new();
let idx = arena.insert(42);
*arena.get_mut(idx).unwrap() += 1;
assert_eq!(arena.remove(idx), Some(43));
assert!(arena.get_mut(idx).is_none());Sourcepub fn get2_mut(
&mut self,
i1: Index,
i2: Index,
) -> (Option<&mut T>, Option<&mut T>)
pub fn get2_mut( &mut self, i1: Index, i2: Index, ) -> (Option<&mut T>, Option<&mut T>)
Get a pair of exclusive references to the elements at index i1 and i2 if it is in the
arena.
If the element at index i1 or i2 is not in the arena, then None is returned for this
element.
§Panics
Panics if i1 and i2 are pointing to the same item of the arena.
§Examples
let mut arena = Arena::new();
let idx1 = arena.insert(0);
let idx2 = arena.insert(1);
{
let (item1, item2) = arena.get2_mut(idx1, idx2);
*item1.unwrap() = 3;
*item2.unwrap() = 4;
}
assert_eq!(arena[idx1], 3);
assert_eq!(arena[idx2], 4);Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Get the length of this arena.
The length is the number of elements the arena holds.
§Examples
let mut arena = Arena::new();
assert_eq!(arena.len(), 0);
let idx = arena.insert(42);
assert_eq!(arena.len(), 1);
let _ = arena.insert(0);
assert_eq!(arena.len(), 2);
assert_eq!(arena.remove(idx), Some(42));
assert_eq!(arena.len(), 1);Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if the arena contains no elements
§Examples
let mut arena = Arena::new();
assert!(arena.is_empty());
let idx = arena.insert(42);
assert!(!arena.is_empty());
assert_eq!(arena.remove(idx), Some(42));
assert!(arena.is_empty());Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Get the capacity of this arena.
The capacity is the maximum number of elements the arena can hold without further allocation, including however many it currently contains.
§Examples
let mut arena = Arena::with_capacity(10);
assert_eq!(arena.capacity(), 10);
// `try_insert` does not allocate new capacity.
for i in 0..10 {
assert!(arena.try_insert(1).is_ok());
assert_eq!(arena.capacity(), 10);
}
// But `insert` will if the arena is already at capacity.
arena.insert(0);
assert!(arena.capacity() > 10);Sourcepub fn iter(&self) -> Iter<'_, T> ⓘ
pub fn iter(&self) -> Iter<'_, T> ⓘ
Iterate over shared references to the elements in this arena.
Yields pairs of (Index, &T) items.
Order of iteration is not defined.
§Examples
let mut arena = Arena::new();
for i in 0..10 {
arena.insert(i * i);
}
for (idx, value) in arena.iter() {
println!("{} is at index {:?}", value, idx);
}Sourcepub fn iter_mut(&mut self) -> IterMut<'_, T> ⓘ
pub fn iter_mut(&mut self) -> IterMut<'_, T> ⓘ
Iterate over exclusive references to the elements in this arena.
Yields pairs of (Index, &mut T) items.
Order of iteration is not defined.
§Examples
let mut arena = Arena::new();
for i in 0..10 {
arena.insert(i * i);
}
for (_idx, value) in arena.iter_mut() {
*value += 5;
}Sourcepub fn drain(&mut self) -> Drain<'_, T> ⓘ
pub fn drain(&mut self) -> Drain<'_, T> ⓘ
Iterate over elements of the arena and remove them.
Yields pairs of (Index, T) items.
Order of iteration is not defined.
Note: All elements are removed even if the iterator is only partially consumed or not consumed at all.
§Examples
let mut arena = Arena::new();
let idx_1 = arena.insert("hello");
let idx_2 = arena.insert("world");
assert!(arena.get(idx_1).is_some());
assert!(arena.get(idx_2).is_some());
for (idx, value) in arena.drain() {
assert!((idx == idx_1 && value == "hello") || (idx == idx_2 && value == "world"));
}
assert!(arena.get(idx_1).is_none());
assert!(arena.get(idx_2).is_none());Sourcepub fn get_unknown_gen(&self, i: u32) -> Option<(&T, Index)>
pub fn get_unknown_gen(&self, i: u32) -> Option<(&T, Index)>
Given an i of usize without a generation, get a shared reference
to the element and the matching Index of the entry behind i.
This method is useful when you know there might be an element at the position i, but don’t know its generation or precise Index.
Use cases include using indexing such as Hierarchical BitMap Indexing or other kinds of bit-efficient indexing.
You should use the get method instead most of the time.
Sourcepub fn get_unknown_gen_mut(&mut self, i: u32) -> Option<(&mut T, Index)>
pub fn get_unknown_gen_mut(&mut self, i: u32) -> Option<(&mut T, Index)>
Given an i of usize without a generation, get an exclusive reference
to the element and the matching Index of the entry behind i.
This method is useful when you know there might be an element at the position i, but don’t know its generation or precise Index.
Use cases include using indexing such as Hierarchical BitMap Indexing or other kinds of bit-efficient indexing.
You should use the get_mut method instead most of the time.
Trait Implementations§
Source§impl<T> Extend<T> for Arena<T>
impl<T> Extend<T> for Arena<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<T> FromIterator<T> for Arena<T>
impl<T> FromIterator<T> for Arena<T>
Source§fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self
Source§impl<'a, T> IntoIterator for &'a Arena<T>
impl<'a, T> IntoIterator for &'a Arena<T>
Source§impl<'a, T> IntoIterator for &'a mut Arena<T>
impl<'a, T> IntoIterator for &'a mut Arena<T>
Auto Trait Implementations§
impl<T> Freeze for Arena<T>
impl<T> RefUnwindSafe for Arena<T>where
T: RefUnwindSafe,
impl<T> Send for Arena<T>where
T: Send,
impl<T> Sync for Arena<T>where
T: Sync,
impl<T> Unpin for Arena<T>where
T: Unpin,
impl<T> UnwindSafe for Arena<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.