pub struct Vector<I, T>where
I: Idx,{
vector: IndexVec<I, Option<T>>,
elem_count: usize,
}
Expand description
Indexed vector. To prevent accidental id reuse, the vector supports reserving a slot to be filled later.
Fields§
§vector: IndexVec<I, Option<T>>
§elem_count: usize
The number of non-None
elements.
Implementations§
source§impl<I, T> Vector<I, T>where
I: Idx,
impl<I, T> Vector<I, T>where
I: Idx,
pub fn new() -> Self
pub fn get(&self, i: I) -> Option<&T>
pub fn get_mut(&mut self, i: I) -> Option<&mut T>
pub fn is_empty(&self) -> bool
sourcepub fn elem_count(&self) -> usize
pub fn elem_count(&self) -> usize
The number of elements stored in the vector.
sourcepub fn slot_count(&self) -> usize
pub fn slot_count(&self) -> usize
The number of slots allocated in the vector (empty or not).
sourcepub fn next_id(&self) -> I
pub fn next_id(&self) -> I
Gets the value of the next available id. Avoid if possible; use reserve_slot
instead.
sourcepub fn reserve_slot(&mut self) -> I
pub fn reserve_slot(&mut self) -> I
Reserve a spot in the vector.
pub fn push(&mut self, x: T) -> I
pub fn push_with(&mut self, f: impl FnOnce(I) -> T) -> I
pub fn push_all<It>(
&mut self,
it: It,
) -> impl Iterator<Item = I> + use<'_, I, T, It>where
It: Iterator<Item = T>,
pub fn extend<It>(&mut self, it: It)where
It: Iterator<Item = T>,
pub fn extend_from_slice(&mut self, other: &Self)where
T: Clone,
sourcepub fn get_or_extend_and_insert(
&mut self,
id: I,
f: impl FnOnce() -> T,
) -> &mut T
pub fn get_or_extend_and_insert( &mut self, id: I, f: impl FnOnce() -> T, ) -> &mut T
Get a mutable reference into the ith element. If the vector is too short, extend it until it has enough elements. If the element doesn’t exist, use the provided function to initialize it.
sourcepub fn map<U>(self, f: impl FnMut(T) -> U) -> Vector<I, U>
pub fn map<U>(self, f: impl FnMut(T) -> U) -> Vector<I, U>
Map each entry to a new one, keeping the same ids.
sourcepub fn map_ref<'a, U>(&'a self, f: impl FnMut(&'a T) -> U) -> Vector<I, U>
pub fn map_ref<'a, U>(&'a self, f: impl FnMut(&'a T) -> U) -> Vector<I, U>
Map each entry to a new one, keeping the same ids.
sourcepub fn map_ref_mut<'a, U>(
&'a mut self,
f: impl FnMut(&'a mut T) -> U,
) -> Vector<I, U>
pub fn map_ref_mut<'a, U>( &'a mut self, f: impl FnMut(&'a mut T) -> U, ) -> Vector<I, U>
Map each entry to a new one, keeping the same ids.
sourcepub fn map_ref_indexed<'a, U>(
&'a self,
f: impl FnMut(I, &'a T) -> U,
) -> Vector<I, U>
pub fn map_ref_indexed<'a, U>( &'a self, f: impl FnMut(I, &'a T) -> U, ) -> Vector<I, U>
Map each entry to a new one, keeping the same ids.
sourcepub fn map_opt<U>(self, f: impl FnMut(Option<T>) -> Option<U>) -> Vector<I, U>
pub fn map_opt<U>(self, f: impl FnMut(Option<T>) -> Option<U>) -> Vector<I, U>
Map each entry to a new one, keeping the same ids. Includes empty slots.
sourcepub fn map_ref_opt<'a, U>(
&'a self,
f: impl FnMut(Option<&'a T>) -> Option<U>,
) -> Vector<I, U>
pub fn map_ref_opt<'a, U>( &'a self, f: impl FnMut(Option<&'a T>) -> Option<U>, ) -> Vector<I, U>
Map each entry to a new one, keeping the same ids. Includes empty slots.
sourcepub fn iter(&self) -> impl Iterator<Item = &T> + DoubleEndedIterator + Clone
pub fn iter(&self) -> impl Iterator<Item = &T> + DoubleEndedIterator + Clone
Iter over the nonempty slots.
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> + DoubleEndedIterator
pub fn iter_indexed(&self) -> impl Iterator<Item = (I, &T)>
pub fn iter_mut_indexed(&mut self) -> impl Iterator<Item = (I, &mut T)>
pub fn into_iter_indexed(self) -> impl Iterator<Item = (I, T)>
pub fn iter_indexed_values(&self) -> impl Iterator<Item = (I, &T)>
pub fn into_iter_indexed_values(self) -> impl Iterator<Item = (I, T)>
sourcepub fn iter_all_slots(&self) -> impl Iterator<Item = &Option<T>>
pub fn iter_all_slots(&self) -> impl Iterator<Item = &Option<T>>
Iterate over all slots, even empty ones.
pub fn iter_indexed_all_slots(&self) -> impl Iterator<Item = (I, &Option<T>)>
pub fn iter_indices(&self) -> impl Iterator<Item = I> + '_
pub fn all_indices(&self) -> impl Iterator<Item = I>
Trait Implementations§
source§impl<I: Idx, T: AstVisitable> AstVisitable for Vector<I, T>
impl<I: Idx, T: AstVisitable> AstVisitable for Vector<I, T>
source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
self
, in pre-order traversal.source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
self
, in pre-order traversal.source§impl<I: Idx, T: BodyVisitable> BodyVisitable for Vector<I, T>
impl<I: Idx, T: BodyVisitable> BodyVisitable for Vector<I, T>
source§fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.source§fn drive_body_mut<V: VisitBodyMut>(
&mut self,
v: &mut V,
) -> ControlFlow<V::Break>
fn drive_body_mut<V: VisitBodyMut>( &mut self, v: &mut V, ) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.source§fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
self
, in pre-order traversal.source§fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
self
, in pre-order traversal.source§impl<'de, I: Idx, T: Deserialize<'de>> Deserialize<'de> for Vector<I, T>
impl<'de, I: Idx, T: Deserialize<'de>> Deserialize<'de> for Vector<I, T>
source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
source§impl<'s, I: Idx, T, V: Visit<'s, T>> Drive<'s, V> for Vector<I, T>
impl<'s, I: Idx, T, V: Visit<'s, T>> Drive<'s, V> for Vector<I, T>
source§fn drive_inner(&'s self, v: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, v: &mut V) -> ControlFlow<V::Break>
v.visit()
on the immediate contents of self
.source§impl<'s, I: Idx, T, V: VisitMut<'s, T>> DriveMut<'s, V> for Vector<I, T>
impl<'s, I: Idx, T, V: VisitMut<'s, T>> DriveMut<'s, V> for Vector<I, T>
source§fn drive_inner_mut(&'s mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, v: &mut V) -> ControlFlow<V::Break>
v.visit()
on the immediate contents of self
.source§impl<I, T> FromIterator<T> for Vector<I, T>where
I: Idx,
impl<I, T> FromIterator<T> for Vector<I, T>where
I: Idx,
source§impl<'a, I, T> IntoIterator for &'a Vector<I, T>where
I: Idx,
impl<'a, I, T> IntoIterator for &'a Vector<I, T>where
I: Idx,
source§impl<'a, I, T> IntoIterator for &'a mut Vector<I, T>where
I: Idx,
impl<'a, I, T> IntoIterator for &'a mut Vector<I, T>where
I: Idx,
source§impl<I, T> IntoIterator for Vector<I, T>where
I: Idx,
impl<I, T> IntoIterator for Vector<I, T>where
I: Idx,
source§impl<I, T: Ord> Ord for Vector<I, T>where
I: Idx + Ord,
impl<I, T: Ord> Ord for Vector<I, T>where
I: Idx + Ord,
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl<I, T: PartialOrd> PartialOrd for Vector<I, T>where
I: Idx + PartialOrd,
impl<I, T: PartialOrd> PartialOrd for Vector<I, T>where
I: Idx + PartialOrd,
impl<I, T: Eq> Eq for Vector<I, T>where
I: Idx + Eq,
impl<I, T> StructuralPartialEq for Vector<I, T>where
I: Idx,
Auto Trait Implementations§
impl<I, T> Freeze for Vector<I, T>
impl<I, T> RefUnwindSafe for Vector<I, T>where
T: RefUnwindSafe,
impl<I, T> Send for Vector<I, T>where
T: Send,
impl<I, T> Sync for Vector<I, T>where
T: Sync,
impl<I, T> Unpin for Vector<I, T>where
T: Unpin,
impl<I, T> UnwindSafe for Vector<I, 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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 more§impl<T> Joinable for Twhere
&'a T: for<'a> IntoIterator,
impl<T> Joinable for Twhere
&'a T: for<'a> IntoIterator,
type Collection = T
§fn join_with<S>(self, sep: S) -> Join<T, S>
fn join_with<S>(self, sep: S) -> Join<T, S>
Join
] instance.
Note that the separator does not have to share the same type as the
iterator’s values. Read more§fn join_concat(self) -> Join<Self::Collection, NoSeparator>
fn join_concat(self) -> Join<Self::Collection, NoSeparator>
Display
, the underlying elements will be directly concatenated.
Note that the separator, while empty, is still present, and will show
up if you iterate this instance. Read more§impl<I> RecreateContext<I> for I
impl<I> RecreateContext<I> for I
§fn recreate_context(_original_input: I, tail: I) -> I
fn recreate_context(_original_input: I, tail: I) -> I
source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
fn substitute(self, generics: &GenericArgs) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth
binders.source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth
binders. Returns None
if it contains a variable bound in
one of these depth
binders.source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self
, as seen from the outside of self
. This means
that any variable bound inside self
will be skipped, and all the seen indices will count
from the outside of self.