Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.97 KB | None | 0 0
  1. use core::{mem::MaybeUninit, ptr};
  2.  
  3. #[derive(Debug)]
  4. pub struct OutOfSpace;
  5.  
  6. pub struct BoxVec<T> {
  7. boxed: Box<[MaybeUninit<T>]>,
  8. len: usize,
  9. }
  10.  
  11. impl<T> BoxVec<T> {
  12. pub fn new(size: usize) -> Self {
  13. let boxed = (0..size).map(|_| MaybeUninit::uninit()).collect();
  14.  
  15. Self { boxed, len: 0 }
  16. }
  17.  
  18. pub fn push(&mut self, elem: T) {
  19. self.try_push(elem).unwrap()
  20. }
  21.  
  22. pub fn try_push(&mut self, elem: T) -> Result<(), OutOfSpace> {
  23. if self.len < self.boxed.len() {
  24. unsafe {
  25. self.unchecked_push(elem);
  26. Ok(())
  27. }
  28. } else {
  29. Err(OutOfSpace)
  30. }
  31. }
  32.  
  33. pub unsafe fn unchecked_push(&mut self, elem: T) {
  34. let len = self.len;
  35.  
  36. let uninit_elem = &mut self.boxed[len];
  37. ptr::write(uninit_elem.as_mut_ptr(), elem);
  38.  
  39. self.set_len(len + 1);
  40. }
  41.  
  42. pub unsafe fn set_len(&mut self, new_len: usize) {
  43. self.len = new_len;
  44. }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement