diff options
Diffstat (limited to 'ecs/src/util/array_vec.rs')
| -rw-r--r-- | ecs/src/util/array_vec.rs | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/ecs/src/util/array_vec.rs b/ecs/src/util/array_vec.rs index 648c976..5d0aac9 100644 --- a/ecs/src/util/array_vec.rs +++ b/ecs/src/util/array_vec.rs @@ -1,4 +1,4 @@ -use std::mem::{transmute, MaybeUninit}; +use std::mem::MaybeUninit; use std::ops::{Deref, DerefMut}; #[derive(Debug)] @@ -10,16 +10,18 @@ pub struct ArrayVec<Item, const CAPACITY: usize> impl<Item, const CAPACITY: usize> ArrayVec<Item, CAPACITY> { - pub fn new() -> Self + #[inline] + #[must_use] + pub fn len(&self) -> usize { - Self::default() + self.len } #[inline] #[must_use] - pub fn len(&self) -> usize + pub fn is_empty(&self) -> bool { - self.len + self.len == 0 } pub fn push(&mut self, item: Item) @@ -43,8 +45,8 @@ impl<Item, const CAPACITY: usize> ArrayVec<Item, CAPACITY> unsafe { std::ptr::copy( - &self.items[index], - &mut self.items[index + 1], + &raw const self.items[index], + &raw mut self.items[index + 1], self.len - index, ); } @@ -69,7 +71,9 @@ impl<Item, const CAPACITY: usize> AsRef<[Item]> for ArrayVec<Item, CAPACITY> { fn as_ref(&self) -> &[Item] { - unsafe { transmute::<&[MaybeUninit<Item>], &[Item]>(&self.items[..self.len]) } + let ptr = &raw const self.items[..self.len]; + + unsafe { &*(ptr as *const [Item]) } } } @@ -77,11 +81,9 @@ impl<Item, const CAPACITY: usize> AsMut<[Item]> for ArrayVec<Item, CAPACITY> { fn as_mut(&mut self) -> &mut [Item] { - unsafe { - transmute::<&mut [MaybeUninit<Item>], &mut [Item]>( - &mut self.items[..self.len], - ) - } + let ptr = &raw mut self.items[..self.len]; + + unsafe { &mut *(ptr as *mut [Item]) } } } @@ -113,3 +115,17 @@ impl<Item, const CAPACITY: usize> Default for ArrayVec<Item, CAPACITY> } } } + +impl<Item, const CAPACITY: usize> Drop for ArrayVec<Item, CAPACITY> +{ + fn drop(&mut self) + { + for item in &mut self.items[..self.len] { + // SAFETY: The items from index 0 to the length index will always be + // initialized and satisfy all the invariants of the Item type. + unsafe { + item.assume_init_drop(); + } + } + } +} |
