Advertisement
Guest User

Untitled

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