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
|
//! https://doc.rust-lang.org/nomicon/vec/vec.html
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
alloc::{self, Layout},
|
|
||||||
marker::PhantomData,
|
marker::PhantomData,
|
||||||
mem,
|
mem,
|
||||||
ops::{Deref, DerefMut, Index},
|
ops::{Deref, DerefMut, Index, IndexMut},
|
||||||
ptr::{self, NonNull},
|
ptr,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::raw_vec::RawVec;
|
use crate::raw_vec::RawVec;
|
||||||
|
@ -33,7 +32,7 @@ impl<T> Vec<T> {
|
||||||
}
|
}
|
||||||
Vec {
|
Vec {
|
||||||
used: 0,
|
used: 0,
|
||||||
marker: PhantomData::default(),
|
marker: PhantomData,
|
||||||
buf: RawVec::new(),
|
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) {
|
pub fn push(&mut self, value: T) {
|
||||||
if self.used == self.buf.capacity {
|
if self.used == self.buf.capacity {
|
||||||
self.buf.grow();
|
self.buf.grow();
|
||||||
|
@ -127,8 +112,16 @@ impl<T> Vec<T> {
|
||||||
impl<T> Index<usize> for Vec<T> {
|
impl<T> Index<usize> for Vec<T> {
|
||||||
type Output = T;
|
type Output = T;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
fn index(&self, index: usize) -> &Self::Output {
|
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);
|
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