use std::alloc::Layout;
use std::mem;
use std::slice;
pub struct LPVec {
pub content: Box<[usize]>,
pub len: usize,
pub capacity: usize,
}
impl LPVec{
pub fn new() -> LPVec {
Self {
content: Box::new([0]),
len: 0,
capacity: 1,
}
}
pub fn push(&mut self, item: usize) {
if self.len == self.capacity {
let new_cap = self.capacity * 2;
let mut new_content = unsafe {
let content =
Layout::from_size_align(1usize, mem::align_of::<usize>()).expect("bad layout");
let alloced = std::alloc::alloc(content) as *mut usize;
let b = Box::from_raw(slice::from_raw_parts_mut(alloced, new_cap));
b
};
for d in 0..self.len {
new_content[d] = self.content[d].clone();
}
self.content = new_content;
self.capacity = new_cap;
}
self.content[self.len] = item;
self.len += 1;
}
}
#[cfg(test)]
mod tests {
use crate::LPVec;
#[test]
fn test_vec() {
let mut new_vec = LPVec::new();
new_vec.push(1usize);
new_vec.push(2usize);
new_vec.push(3usize);
new_vec.push(3usize);
new_vec.push(3usize);
new_vec.push(3usize);
println!(
"LP Vec contains {} elements with cap {}",
new_vec.len, new_vec.capacity
);
for item in 0..new_vec.len {
println!("Item is {}", new_vec.content[item]);
}
}
}