1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use std::ops::{Range, Index, IndexMut}; use std::iter::Map; use std::marker::PhantomData; use super::Id; pub type Ids<K> = Map<Range<usize>, fn(usize) -> Id<K>>; #[derive(Debug)] #[derive(Serialize, Deserialize)] pub struct IdVec<K, V=K> { items: Vec<V>, marker: PhantomData<K>, } impl<K, V> IdVec<K, V> { pub fn new() -> Self { Self::default() } pub fn push(&mut self, item: V) -> Id<K> { self.items.push(item); Id::from(self.len() - 1) } pub fn len(&self) -> usize { self.items.len() } pub fn ids(&self) -> Ids<K> { (0 .. self.len()).map(Id::from) } } impl<K, V> Index<Id<K>> for IdVec<K, V> { type Output = V; fn index(&self, id: Id<K>) -> &Self::Output { &self.items[Into::<usize>::into(id)] } } impl<K, V> IndexMut<Id<K>> for IdVec<K, V> { fn index_mut(&mut self, id: Id<K>) -> &mut Self::Output { &mut self.items[Into::<usize>::into(id)] } } impl<K, V> Default for IdVec<K, V> { fn default() -> Self { Self { items: Default::default(), marker: PhantomData::default(), } } } impl<K, V> From<Vec<V>> for IdVec<K, V> { fn from(items: Vec<V>) -> Self { Self { items, marker: PhantomData::default(), } } } impl<K, V> Into<Vec<V>> for IdVec<K, V> { fn into(self) -> Vec<V> { self.items } }