use std::mem::ManuallyDrop;
use std::ptr;
use crate::utils::Array;
use crate::const_utils::{ConstUsize, ConstInteger};
pub trait ConstArray: Array {
type Cap: ConstInteger;
type DecArray: ConstArray<Item=Self::Item, Cap=<Self::Cap as ConstInteger>::Dec>;
fn split_last(self) -> (Self::DecArray, Self::Item);
}
impl<T, const N: usize> ConstArray for [T; N]
where
ConstUsize<N>: ConstInteger
{
type Cap = ConstUsize<N>;
type DecArray = ArrayOf<Self::Item, <Self::Cap as ConstInteger>::Dec>;
#[inline]
fn split_last(self) -> (Self::DecArray, Self::Item) {
let this = ManuallyDrop::new(self);
let left = unsafe{
Array::from_fn(|i| {
ptr::read(this.as_ref().get_unchecked(i))
})
};
let right = unsafe{
ptr::read(this.as_ref().last().unwrap())
};
(left, right)
}
}
pub type ArrayOf<T, C> = <C as ConstInteger>::ArrayOf<T>;
pub type CopyableArrayOf<T, C> = <C as ConstInteger>::CopyArrayOf<T>;