use std::array;
use std::mem::MaybeUninit;
pub trait Array
: AsRef<[Self::Item]>
+ AsMut<[Self::Item]>
+ Sized
{
type Item;
const CAP: usize;
fn from_fn<F>(f: F) -> Self
where
F: FnMut(usize) -> Self::Item;
type UninitArray: Array<Item = MaybeUninit<Self::Item>>;
fn uninit_array() -> Self::UninitArray;
unsafe fn assume_init_array(uninit_array: Self::UninitArray) -> Self;
}
impl<T, const N: usize> Array for [T; N]{
type Item = T;
const CAP: usize = N;
type UninitArray = [MaybeUninit<Self::Item>; N];
#[inline]
fn from_fn<F>(f: F) -> Self
where
F: FnMut(usize) -> T
{
array::from_fn(f)
}
#[inline]
fn uninit_array() -> Self::UninitArray {
[const { MaybeUninit::uninit() }; N]
}
#[inline]
unsafe fn assume_init_array(uninit_array: Self::UninitArray) -> Self {
std::mem::transmute_copy(&uninit_array)
}
}