vec indexing
This commit is contained in:
parent
9f14c85f55
commit
4270ea7a4c
1 changed files with 38 additions and 19 deletions
|
@ -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<T> Vec<T> {
|
|||
}
|
||||
Vec {
|
||||
used: 0,
|
||||
marker: PhantomData::default(),
|
||||
marker: PhantomData,
|
||||
buf: RawVec::new(),
|
||||
}
|
||||
}
|
||||
|
@ -47,20 +46,6 @@ impl<T> Vec<T> {
|
|||
}
|
||||
}
|
||||
|
||||
#[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<T> Vec<T> {
|
|||
impl<T> Index<usize> for Vec<T> {
|
||||
type Output = T;
|
||||
|
||||
#[inline]
|
||||
fn index(&self, index: usize) -> &Self::Output {
|
||||
self.get(index)
|
||||
Index::index(&**self, index)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> IndexMut<usize> for Vec<T> {
|
||||
#[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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue