diff --git a/crates/datastructures/src/vec.rs b/crates/datastructures/src/vec.rs index 22169a8..6d6dfb2 100644 --- a/crates/datastructures/src/vec.rs +++ b/crates/datastructures/src/vec.rs @@ -4,11 +4,10 @@ //! https://doc.rust-lang.org/nomicon/vec/vec.html use std::{ - alloc::{self, Layout}, marker::PhantomData, mem, - ops::{Deref, DerefMut, Index}, - ptr::{self, NonNull}, + ops::{Deref, DerefMut, Index, IndexMut}, + ptr, }; use crate::raw_vec::RawVec; @@ -33,7 +32,7 @@ impl Vec { } Vec { used: 0, - marker: PhantomData::default(), + marker: PhantomData, buf: RawVec::new(), } } @@ -47,20 +46,6 @@ impl Vec { } } - #[must_use] - pub fn get(&self, index: usize) -> Option<&T> { - if index > self.used { - None - } else { - unsafe { Some(ptr::read(src)) } - } - } - - #[must_use] - pub fn get_mut(&self, index: usize) -> Option<&mut T> { - if index > self.used { None } else { todo!() } - } - pub fn push(&mut self, value: T) { if self.used == self.buf.capacity { self.buf.grow(); @@ -127,8 +112,16 @@ impl Vec { impl Index for Vec { type Output = T; + #[inline] fn index(&self, index: usize) -> &Self::Output { - self.get(index) + Index::index(&**self, index) + } +} + +impl IndexMut for Vec { + #[inline] + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + IndexMut::index_mut(&mut **self, index) } } @@ -187,4 +180,30 @@ mod test { assert_eq!(v.pop().unwrap(), *val); } } + + #[test] + fn test_pushindex_num() { + let mut v = Vec::new(); + let vals = &[19, 9, 14, 255, 19191919, 13890, 21521, 1251, 6216, 1830]; + + for val in vals { + v.push(*val); + } + for (idx, val) in vals.iter().enumerate() { + assert_eq!(v[idx], *val); + } + } + + #[test] + fn test_pushindex_str() { + let mut v = Vec::new(); + let vals = &["AAAA", "ABBAB", "BBABBABBAJJJ"]; + + for val in vals { + v.push(*val); + } + for (idx, val) in vals.iter().enumerate() { + assert_eq!(v[idx], *val); + } + } }