Struct IndexVec
#[repr(transparent)]pub struct IndexVec<I, T>where
I: Idx,{
pub raw: Vec<T>,
_marker: PhantomData<fn(&I)>,
}
Expand description
An owned contiguous collection of T
s, indexed by I
rather than by usize
.
§Why use this instead of a Vec
?
An IndexVec
allows element access only via a specific associated index type, meaning that
trying to use the wrong index type (possibly accessing an invalid element) will fail at
compile time.
It also documents what the index is indexing: in a HashMap<usize, Something>
it’s not
immediately clear what the usize
means, while a HashMap<FieldIdx, Something>
makes it obvious.
ⓘ
use rustc_index::{Idx, IndexVec};
fn f<I1: Idx, I2: Idx>(vec1: IndexVec<I1, u8>, idx1: I1, idx2: I2) {
&vec1[idx1]; // Ok
&vec1[idx2]; // Compile error!
}
While it’s possible to use u32
or usize
directly for I
,
you almost certainly want to use a newtype_index!
-generated type instead.
This allows to index the IndexVec with the new index type.
Fields§
§raw: Vec<T>
§_marker: PhantomData<fn(&I)>
Auto Trait Implementations§
impl<I, T> Freeze for IndexVec<I, T>
impl<I, T> RefUnwindSafe for IndexVec<I, T>where
T: RefUnwindSafe,
impl<I, T> Sync for IndexVec<I, T>where
T: Sync,
impl<I, T> Unpin for IndexVec<I, T>where
T: Unpin,
impl<I, T> UnwindSafe for IndexVec<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