use serde_derive::{Deserialize, Serialize}; use std::marker::PhantomData; use std::ops::{Index, IndexMut}; use std::slice::SliceIndex; use typenum::Unsigned; pub use typenum; mod impls; #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct FixedLenVec { vec: Vec, _phantom: PhantomData, } impl FixedLenVec { pub fn len(&self) -> usize { self.vec.len() } pub fn is_empty(&self) -> bool { self.len() == 0 } pub fn capacity() -> usize { N::to_usize() } } impl From> for FixedLenVec { fn from(mut vec: Vec) -> Self { vec.resize_with(Self::capacity(), Default::default); Self { vec, _phantom: PhantomData, } } } impl Into> for FixedLenVec { fn into(self) -> Vec { self.vec } } impl Default for FixedLenVec { fn default() -> Self { Self { vec: Vec::default(), _phantom: PhantomData, } } } impl> Index for FixedLenVec { type Output = I::Output; #[inline] fn index(&self, index: I) -> &Self::Output { Index::index(&self.vec, index) } } impl> IndexMut for FixedLenVec { #[inline] fn index_mut(&mut self, index: I) -> &mut Self::Output { IndexMut::index_mut(&mut self.vec, index) } } #[cfg(test)] mod test { use super::*; use typenum::*; #[test] fn indexing() { let vec = vec![1, 2]; let mut fixed: FixedLenVec = vec.clone().into(); assert_eq!(fixed[0], 1); assert_eq!(&fixed[0..1], &vec[0..1]); assert_eq!((&fixed[..]).len(), 8192); fixed[1] = 3; assert_eq!(fixed[1], 3); } #[test] fn length() { let vec = vec![42; 5]; let fixed: FixedLenVec = FixedLenVec::from(vec.clone()); assert_eq!(&fixed[..], &vec[0..4]); let vec = vec![42; 3]; let fixed: FixedLenVec = FixedLenVec::from(vec.clone()); assert_eq!(&fixed[0..3], &vec[..]); assert_eq!(&fixed[..], &vec![42, 42, 42, 0][..]); let vec = vec![]; let fixed: FixedLenVec = FixedLenVec::from(vec.clone()); assert_eq!(&fixed[..], &vec![0, 0, 0, 0][..]); } } #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(2 + 2, 4); } }