vec indexing
Some checks failed
Rust CI / Clippy (push) Failing after 2s
Rust CI / Test Suite (push) Failing after 14s

This commit is contained in:
cscherr 2025-06-04 17:40:59 +02:00
parent 9f14c85f55
commit 4270ea7a4c
Signed by: cscherrNT
GPG key ID: 8E2B45BC51A27EA7

View file

@ -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);
}
}
}