mod cursor;
pub use self::cursor::Cursor;
use core::mem::MaybeUninit;
use core::ptr::NonNull;
use core::ops::{Deref, DerefMut, Index, IndexMut};
use core::slice::SliceIndex;
use crate::deref_markers::SameDataDeref;
use crate::zeroed::ZeroValid;
pub trait TakeItem<T> {
fn take_item(self) -> T;
}
impl<T> TakeItem<T> for T {
fn take_item(self) -> T {
self
}
}
impl<T: Copy> TakeItem<T> for &T {
fn take_item(self) -> T {
*self
}
}
#[cfg(feature = "alloc")]
impl<T> TakeItem<T> for alloc::boxed::Box<T> {
fn take_item(self) -> T {
*self
}
}
pub struct OutSlice<T>([MaybeUninit<T>]);
impl<T> OutSlice<T> {
fn as_raw(&self) -> &[MaybeUninit<T>] {
unsafe {
&*(self as *const OutSlice<T> as *const [MaybeUninit<T>])
}
}
unsafe fn as_raw_mut(&mut self) -> &mut [MaybeUninit<T>] {
&mut *(self as *mut OutSlice<T> as *mut [MaybeUninit<T>])
}
pub fn at<I: SliceIndex<[MaybeUninit<T>], Output=MaybeUninit<T>>>(&self, index: I) -> &MaybeUninit<T> {
&self.0[index]
}
pub fn at_mut<I: SliceIndex<[MaybeUninit<T>], Output=MaybeUninit<T>>>(&mut self, index: I) -> super::Out<'_, T> {
(&mut self.0[index]).into()
}
pub fn len(&self) -> usize {
self.as_raw().len()
}
pub fn is_empty(&self) -> bool {
self.as_raw().is_empty()
}
pub fn iter_mut(&mut self) -> IterMut<'_, T> {
self.into_iter()
}
pub fn split_at_mut(&mut self, mid: usize) -> (&mut OutSlice<T>, &mut OutSlice<T>) {
unsafe {
let (first, second) = self.as_raw_mut().split_at_mut(mid);
(first.into(), second.into())
}
}
pub unsafe fn assume_init(&self) -> &[T] {
let slice = self.as_raw();
let ptr = slice.as_ptr() as *const T;
let len = slice.len();
core::slice::from_raw_parts(ptr, len)
}
pub unsafe fn assume_init_mut(&mut self) -> &mut [T] {
let slice = self.as_raw_mut();
let ptr = slice.as_mut_ptr() as *mut T;
let len = slice.len();
core::slice::from_raw_parts_mut(ptr, len)
}
pub fn as_non_null(&mut self) -> NonNull<T> {
unsafe {
NonNull::new_unchecked(self.as_raw_mut().as_mut_ptr()).cast()
}
}
pub fn as_mut_ptr(&mut self) -> *mut T {
unsafe {
self.as_raw_mut().as_mut_ptr() as *mut T
}
}
pub fn write_zeroes(&mut self) -> &mut [T] where T: ZeroValid {
unsafe {
self.as_raw_mut().write_zeroes();
self.assume_init_mut()
}
}
pub fn init_from_iter<I>(&mut self, iter: I) -> &mut [T] where I: IntoIterator, I::Item: TakeItem<T> {
unsafe {
#[allow(clippy::suspicious_map)]
let len = self.iter_mut().zip(iter).map(|(dest, source)| dest.write(source.take_item())).count();
self[..len].assume_init_mut()
}
}
pub fn copy_from_slice(&mut self, slice: &[T]) -> &mut [T] where T: Copy {
unsafe {
self.as_raw_mut().copy_from_slice(slice.borrow_uninit_slice());
self.assume_init_mut()
}
}
}
impl<T, R: SliceIndex<[MaybeUninit<T>], Output=[MaybeUninit<T>]>> Index<R> for OutSlice<T> {
type Output = Self;
fn index(&self, range: R) -> &Self::Output {
(&self.as_raw()[range]).into()
}
}
impl<T, R: SliceIndex<[MaybeUninit<T>], Output=[MaybeUninit<T>]>> IndexMut<R> for OutSlice<T> {
fn index_mut(&mut self, range: R) -> &mut Self::Output {
unsafe {
(&mut self.as_raw_mut()[range]).into()
}
}
}
impl<'a, T> From<&'a [T]> for &'a OutSlice<T> {
fn from(value: &'a [T]) -> Self {
unsafe {
let ptr = value.as_ptr() as *const MaybeUninit<T>;
let len = value.len();
&*(core::slice::from_raw_parts(ptr, len) as *const [MaybeUninit<T>] as *const OutSlice<T>)
}
}
}
impl<'a, T> From<&'a mut [T]> for &'a mut OutSlice<T> {
fn from(value: &'a mut [T]) -> Self {
unsafe {
let ptr = value.as_mut_ptr() as *mut MaybeUninit<T>;
let len = value.len();
&mut *(core::slice::from_raw_parts_mut(ptr, len) as *mut [MaybeUninit<T>] as *mut OutSlice<T>)
}
}
}
impl<'a, T> From<&'a [MaybeUninit<T>]> for &'a OutSlice<T> {
fn from(value: &'a [MaybeUninit<T>]) -> Self {
unsafe {
&*(value as *const [MaybeUninit<T>] as *const OutSlice<T>)
}
}
}
impl<'a, T> From<&'a mut [MaybeUninit<T>]> for &'a mut OutSlice<T> {
fn from(value: &'a mut [MaybeUninit<T>]) -> Self {
unsafe {
&mut *(value as *mut [MaybeUninit<T>] as *mut OutSlice<T>)
}
}
}
unsafe impl<T> BorrowUninitSlice<T> for OutSlice<T> {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<T>] {
self.as_raw()
}
}
unsafe impl<'a, T> BorrowOutSlice<T> for OutSlice<T> {
fn borrow_out_slice(&mut self) -> &mut OutSlice<T> {
self
}
}
impl<'a, T> IntoIterator for &'a mut OutSlice<T> {
type Item = super::Out<'a, T>;
type IntoIter = IterMut<'a, T>;
fn into_iter(self) -> Self::IntoIter {
unsafe {
IterMut(self.as_raw_mut().iter_mut())
}
}
}
pub struct IterMut<'a, T>(core::slice::IterMut<'a, MaybeUninit<T>>);
impl<'a, T> IterMut<'a, T> {
pub fn into_slice(self) -> &'a mut OutSlice<T> {
self.0.into_slice().into()
}
}
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = super::Out<'a, T>;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(Into::into)
}
}
pub unsafe trait BorrowUninitSlice<Item> {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>];
unsafe fn assume_init(&self) -> &[Item] {
let slice = self.borrow_uninit_slice();
core::slice::from_raw_parts(slice.as_ptr() as *const Item, slice.len())
}
}
pub unsafe trait BorrowOutSlice<Item>: BorrowUninitSlice<Item> {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item>;
fn zero_if_needed(&mut self) -> &mut [Item] where Item: ZeroValid {
unsafe {
self.borrow_out_slice().write_zeroes();
self.assume_init_mut()
}
}
fn init_with_copy_from_slice(&mut self, slice: &[Item]) -> &mut [Item] where Item: Copy {
self.borrow_out_slice().copy_from_slice(slice)
}
fn init_with_copy_from_slice_min(&mut self, slice: &[Item]) -> &mut [Item] where Item: Copy {
let to_copy = self.borrow_out_slice().len().min(slice.len());
let target = &mut self.borrow_out_slice()[..to_copy];
target.init_with_copy_from_slice(&slice[..to_copy])
}
unsafe fn assume_init_mut(&mut self) -> &mut [Item] {
let slice = self.borrow_out_slice();
core::slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut Item, slice.len())
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
self.into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
core::slice::from_raw_parts(self.as_ptr() as *const MaybeUninit<Item>, self.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
self.into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl BorrowUninitSlice<u8> for str {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<u8>] {
self.as_bytes().borrow_uninit_slice()
}
}
unsafe impl<T, Item> BorrowUninitSlice<Item> for T where T: SameDataDeref + Deref + ?Sized,
T::Target: BorrowUninitSlice<Item> {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
(**self).borrow_uninit_slice()
}
}
unsafe impl<T, Item> BorrowOutSlice<Item> for T where T: SameDataDeref + Deref + DerefMut + ?Sized,
T::Target: BorrowOutSlice<Item> {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(**self).borrow_out_slice()
}
fn zero_if_needed(&mut self) -> &mut [Item] where Item: ZeroValid {
(**self).zero_if_needed()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 0] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 0] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 0] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 0] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 1] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 1] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 1] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 1] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 2] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 2] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 2] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 2] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 3] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 3] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 3] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 3] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 4] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 4] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 4] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 4] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 5] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 5] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 5] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 5] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 6] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 6] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 6] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 6] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 7] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 7] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 7] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 7] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 8] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 8] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 8] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 8] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 9] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 9] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 9] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 9] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 10] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 10] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 10] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 10] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 11] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 11] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 11] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 11] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 12] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 12] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 12] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 12] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 13] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 13] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 13] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 13] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 14] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 14] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 14] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 14] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 15] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 15] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 15] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 15] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 16] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 16] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 16] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 16] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 17] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 17] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 17] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 17] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 18] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 18] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 18] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 18] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 19] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 19] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 19] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 19] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 20] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 20] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 20] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 20] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 21] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 21] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 21] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 21] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 22] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 22] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 22] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 22] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 23] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 23] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 23] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 23] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 24] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 24] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 24] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 24] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 25] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 25] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 25] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 25] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 26] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 26] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 26] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 26] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 27] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 27] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 27] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 27] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 28] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 28] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 28] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 28] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 29] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 29] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 29] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 29] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 30] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 30] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 30] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 30] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 31] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 31] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 31] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 31] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [MaybeUninit<Item>; 32] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
self
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [MaybeUninit<Item>; 32] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
}
unsafe impl<Item> BorrowUninitSlice<Item> for [Item; 32] {
fn borrow_uninit_slice(&self) -> &[MaybeUninit<Item>] {
unsafe {
let slice = self as &[_];
core::slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<Item>, slice.len())
}
}
}
unsafe impl<Item> BorrowOutSlice<Item> for [Item; 32] {
fn borrow_out_slice(&mut self) -> &mut OutSlice<Item> {
(self as &mut [_]).into()
}
fn zero_if_needed(&mut self) -> &mut [Item] {
self
}
}