52 lines
896 B
Rust
52 lines
896 B
Rust
use std::ops::{Index, IndexMut};
|
|
|
|
pub struct Id<T> {
|
|
idx: usize,
|
|
_pd: std::marker::PhantomData<T>,
|
|
}
|
|
|
|
pub struct IdVec<T> {
|
|
vec: Vec<T>,
|
|
}
|
|
|
|
impl<T> IdVec<T> {
|
|
pub fn add(&mut self, val: T) -> Id<T> {
|
|
let id = Id {
|
|
idx: self.vec.len(),
|
|
_pd: Default::default(),
|
|
};
|
|
self.vec.push(val);
|
|
id
|
|
}
|
|
}
|
|
|
|
impl<T> Index<Id<T>> for IdVec<T> {
|
|
type Output = T;
|
|
|
|
fn index(&self, index: Id<T>) -> &Self::Output {
|
|
&self.vec[index.idx]
|
|
}
|
|
}
|
|
|
|
impl<T> IndexMut<Id<T>> for IdVec<T> {
|
|
fn index_mut(&mut self, index: Id<T>) -> &mut Self::Output {
|
|
&mut self.vec[index.idx]
|
|
}
|
|
}
|
|
|
|
impl<T> Default for IdVec<T> {
|
|
fn default() -> Self {
|
|
Self {
|
|
vec: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T> Clone for Id<T> {
|
|
fn clone(&self) -> Self {
|
|
*self
|
|
}
|
|
}
|
|
|
|
impl<T> Copy for Id<T> {}
|