diff options
Diffstat (limited to 'ecs/src/util/array_vec.rs')
| -rw-r--r-- | ecs/src/util/array_vec.rs | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/ecs/src/util/array_vec.rs b/ecs/src/util/array_vec.rs deleted file mode 100644 index 5d0aac9..0000000 --- a/ecs/src/util/array_vec.rs +++ /dev/null @@ -1,131 +0,0 @@ -use std::mem::MaybeUninit; -use std::ops::{Deref, DerefMut}; - -#[derive(Debug)] -pub struct ArrayVec<Item, const CAPACITY: usize> -{ - items: [MaybeUninit<Item>; CAPACITY], - len: usize, -} - -impl<Item, const CAPACITY: usize> ArrayVec<Item, CAPACITY> -{ - #[inline] - #[must_use] - pub fn len(&self) -> usize - { - self.len - } - - #[inline] - #[must_use] - pub fn is_empty(&self) -> bool - { - self.len == 0 - } - - pub fn push(&mut self, item: Item) - { - assert!(self.len < CAPACITY); - - self.items[self.len].write(item); - - self.len += 1; - } - - pub fn insert(&mut self, index: usize, item: Item) - { - assert!(index <= self.len); - assert!(self.len < CAPACITY); - - if index == self.len { - self.push(item); - return; - } - - unsafe { - std::ptr::copy( - &raw const self.items[index], - &raw mut self.items[index + 1], - self.len - index, - ); - } - - self.items[index].write(item); - - self.len += 1; - } -} - -impl<Item, const CAPACITY: usize> Extend<Item> for ArrayVec<Item, CAPACITY> -{ - fn extend<IntoIter: IntoIterator<Item = Item>>(&mut self, iter: IntoIter) - { - for item in iter { - self.push(item); - } - } -} - -impl<Item, const CAPACITY: usize> AsRef<[Item]> for ArrayVec<Item, CAPACITY> -{ - fn as_ref(&self) -> &[Item] - { - let ptr = &raw const self.items[..self.len]; - - unsafe { &*(ptr as *const [Item]) } - } -} - -impl<Item, const CAPACITY: usize> AsMut<[Item]> for ArrayVec<Item, CAPACITY> -{ - fn as_mut(&mut self) -> &mut [Item] - { - let ptr = &raw mut self.items[..self.len]; - - unsafe { &mut *(ptr as *mut [Item]) } - } -} - -impl<Item, const CAPACITY: usize> Deref for ArrayVec<Item, CAPACITY> -{ - type Target = [Item]; - - fn deref(&self) -> &Self::Target - { - self.as_ref() - } -} - -impl<Item, const CAPACITY: usize> DerefMut for ArrayVec<Item, CAPACITY> -{ - fn deref_mut(&mut self) -> &mut Self::Target - { - self.as_mut() - } -} - -impl<Item, const CAPACITY: usize> Default for ArrayVec<Item, CAPACITY> -{ - fn default() -> Self - { - Self { - items: [const { MaybeUninit::uninit() }; CAPACITY], - len: 0, - } - } -} - -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(); - } - } - } -} |
