Guest User

Untitled

a guest
Oct 16th, 2023
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.71 KB | None | 0 0
  1. pub mod vec {
  2.     use std::{alloc::Layout, fmt::Display};
  3.  
  4.     pub struct MyVec<T: Display> {
  5.         ptr: *mut T,
  6.         len: usize,
  7.         cap: usize,
  8.     }
  9.  
  10.     impl<T: Display> MyVec<T> {
  11.         pub fn new() -> MyVec<T> {
  12.             let mut vec = MyVec {
  13.                 ptr: std::ptr::null_mut(),
  14.                 cap: 1,
  15.                 len: 0,
  16.             };
  17.             vec.ptr = Self::alloc(vec.cap);
  18.             vec
  19.         }
  20.  
  21.         pub fn push(&mut self, value: T) {
  22.             if self.len == self.cap {
  23.                 self.realloc()
  24.             }
  25.             unsafe { *self.ptr.add(self.len) = value }
  26.             self.len += 1;
  27.         }
  28.  
  29.         pub fn pop(&mut self) -> Option<T> {
  30.             if self.len == 0 {
  31.                 None
  32.             } else {
  33.                 self.len -= 1;
  34.                 let res = unsafe { std::ptr::read(self.ptr.add(self.len)) };
  35.                 Some(res)
  36.             }
  37.         }
  38.  
  39.         pub fn get(&self, idx: usize) -> Option<&T> {
  40.             if idx >= self.len {
  41.                 None
  42.             } else {
  43.                 unsafe { self.ptr.add(idx).as_ref() }
  44.             }
  45.         }
  46.  
  47.         pub fn len(&self) -> usize {
  48.             self.len
  49.         }
  50.  
  51.         pub fn cap(&self) -> usize {
  52.             self.cap
  53.         }
  54.  
  55.         fn alloc(sz: usize) -> *mut T {
  56.             unsafe { std::alloc::alloc(Self::layout(sz)) as *mut T }
  57.         }
  58.  
  59.         fn memcpy(from: *mut T, to: *mut T, sz: usize) {
  60.             unsafe { from.copy_to_nonoverlapping(to, sz) }
  61.         }
  62.  
  63.         fn realloc(&mut self) {
  64.             let (old_ptr, old_cap) = (self.ptr, self.cap);
  65.             self.cap = old_cap * 2;
  66.             self.ptr = Self::alloc(self.cap);
  67.             Self::memcpy(old_ptr as *mut T, self.ptr as *mut T, old_cap);
  68.             unsafe { old_ptr.drop_in_place() }
  69.         }
  70.  
  71.         fn layout(capacity: usize) -> Layout {
  72.             Layout::array::<T>(capacity).unwrap()
  73.         }
  74.     }
  75.  
  76.     impl<T: Display> Drop for MyVec<T> {
  77.         fn drop(&mut self) {
  78.             unsafe { self.ptr.drop_in_place() }
  79.         }
  80.     }
  81.  
  82.     impl<T: Display> Display for MyVec<T> {
  83.         fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  84.            f.write_str("[ ")?;
  85.            for i in 0..self.len {
  86.                write!(f, "{},", self.get(i).unwrap())?;
  87.            }
  88.            f.write_str(" ]")?;
  89.            Ok(())
  90.        }
  91.    }
  92. }
  93.  
  94. fn main() {
  95.    let mut vector = vec::MyVec::new();
  96.    for value in 0..8 {
  97.        vector.push(value);
  98.        println!(
  99.            "Pushed {value}, Vec after: {{l={}, c={}}} {}",
  100.            vector.len(),
  101.            vector.cap(),
  102.            vector
  103.        );
  104.    }
  105.    for _ in 0..8 {
  106.        let value = vector.pop().unwrap();
  107.        println!(
  108.            "Popped {value}, Vec after: {{l={}, c={}}} {}",
  109.            vector.len(),
  110.            vector.cap(),
  111.            vector
  112.        );
  113.    }
  114.    drop(vector)
  115. }
  116.  
  117. /*
  118. OUTPUT:
  119. Pushed 0, Vec after: {l=1, c=1} [ 0, ]
  120. Pushed 1, Vec after: {l=2, c=2} [ 0,1, ]
  121. Pushed 2, Vec after: {l=3, c=4} [ 0,1,2, ]
  122. Pushed 3, Vec after: {l=4, c=4} [ 0,1,2,3, ]
  123. Pushed 4, Vec after: {l=5, c=8} [ 0,1,2,3,4, ]
  124. Pushed 5, Vec after: {l=6, c=8} [ 0,1,2,3,4,5, ]
  125. Pushed 6, Vec after: {l=7, c=8} [ 0,1,2,3,4,5,6, ]
  126. Pushed 7, Vec after: {l=8, c=8} [ 0,1,2,3,4,5,6,7, ]
  127. Popped 7, Vec after: {l=7, c=8} [ 0,1,2,3,4,5,6, ]
  128. Popped 6, Vec after: {l=6, c=8} [ 0,1,2,3,4,5, ]
  129. Popped 5, Vec after: {l=5, c=8} [ 0,1,2,3,4, ]
  130. Popped 4, Vec after: {l=4, c=8} [ 0,1,2,3, ]
  131. Popped 3, Vec after: {l=3, c=8} [ 0,1,2, ]
  132. Popped 2, Vec after: {l=2, c=8} [ 0,1, ]
  133. Popped 1, Vec after: {l=1, c=8} [ 0, ]
  134. Popped 0, Vec after: {l=0, c=8} [  ]
  135. */
Advertisement
Add Comment
Please, Sign In to add comment