pub struct Vector<I, T>where
I: Idx,{
vector: IndexVec<I, Option<T>>,
real_len: 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>>
§real_len: 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
pub fn len(&self) -> usize
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 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 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 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>
Recursively visit this type with the provided visitor. This calls the visitor’s
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>
Recursively visit this type with the provided visitor. This calls the visitor’s
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))
Visit all occurrences of that type inside
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))
Visit all occurrences of that type inside
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>
Recursively visit this type with the provided visitor. This calls the visitor’s
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>
Recursively visit this type with the provided visitor. This calls the visitor’s
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))
Visit all occurrences of that type inside
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))
Visit all occurrences of that type inside
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>,
Deserialize this value from the given Serde deserializer. Read more
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>
Call
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>
Call
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,
Compares and returns the maximum of two values. Read more
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
Mutably borrows from an owned value. Read more
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)
🔬This is a nightly-only experimental API. (
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
Checks if this value is equivalent to the given key. Read more
§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
Checks if this value is equivalent to the given key. Read more
§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
Compare self to
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)
Given the context attached to a nom error, and given the original
input to the nom parser, extract more the useful context information. Read more
§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>
Converts
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>
Converts
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>
Combine this object with a separator to create a new [
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>
Join this object with an empty separator. When rendered
with
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
Given the original input, as well as the context reported by nom,
recreate a context in the original string where the error occurred. Read more
source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
fn substitute(&mut self, generics: &GenericArgs)
source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Move under one binder.
source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
Move under
depth
binders.source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
Move the value out of
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>
Visit the de Bruijn ids contained in
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.