#![allow(clippy::missing_safety_doc)]
use super::Vector;
use core::{
mem::MaybeUninit,
ops::{Index, IndexMut},
ptr,
};
impl<T, const N: usize> Vector<MaybeUninit<T>, N> {
fn from_uninit(uninit: MaybeUninit<Vector<T, N>>) -> Self {
unsafe { ptr::read(&uninit as *const _ as *const Vector<MaybeUninit<T>, N>) }
}
fn into_uninit(self) -> MaybeUninit<Vector<T, N>> {
unsafe { ptr::read(&self as *const _ as *const MaybeUninit<Vector<T, N>>) }
}
}
impl<T, const N: usize> Vector<T, N> {
pub fn uninit() -> Vector<MaybeUninit<T>, N> {
Vector::from_uninit(MaybeUninit::uninit())
}
}
impl<T, const N: usize> Vector<MaybeUninit<T>, N> {
pub unsafe fn assume_init(self) -> Vector<T, N> {
self.into_uninit().assume_init()
}
}
impl<T, const N: usize> Vector<T, N> {
pub fn init<F: FnMut() -> T>(mut f: F) -> Self {
let mut a = Vector::uninit();
for x in a.data.iter_mut() {
*x = MaybeUninit::new(f());
}
unsafe { a.assume_init() }
}
}
impl<T, const N: usize> Default for Vector<T, N>
where
T: Default,
{
fn default() -> Self {
Self::init(T::default)
}
}
impl<T, const N: usize> Vector<T, N>
where
T: Default,
{
pub fn new() -> Self {
Self::default()
}
}
impl<T, const N: usize> Vector<T, N>
where
T: Copy,
{
pub fn fill(v: T) -> Self {
Self::init(|| v)
}
}
impl<T, const N: usize> Vector<T, N> {
pub fn from_array(array: [T; N]) -> Self {
Self { data: array }
}
pub fn into_array(self) -> [T; N] {
self.data
}
pub fn as_array(&self) -> &[T; N] {
&self.data
}
pub fn as_mut_array(&mut self) -> &mut [T; N] {
&mut self.data
}
}
impl<T, const N: usize> From<[T; N]> for Vector<T, N> {
fn from(a: [T; N]) -> Self {
Self::from_array(a)
}
}
impl<T, const N: usize> From<&[T; N]> for Vector<T, N>
where
T: Copy,
{
fn from(ar: &[T; N]) -> Self {
Self::from_array(*ar)
}
}
impl<T, const N: usize> From<Vector<T, N>> for [T; N] {
fn from(vec: Vector<T, N>) -> Self {
vec.into_array()
}
}
impl<'a, T, const N: usize> From<&'a Vector<T, N>> for &'a [T; N] {
fn from(vr: &'a Vector<T, N>) -> Self {
vr.as_array()
}
}
impl<'a, T, const N: usize> From<&'a mut Vector<T, N>> for &'a mut [T; N] {
fn from(vr: &'a mut Vector<T, N>) -> Self {
vr.as_mut_array()
}
}
impl<T, const N: usize> AsRef<[T; N]> for Vector<T, N> {
fn as_ref(&self) -> &[T; N] {
self.as_array()
}
}
impl<T, const N: usize> AsMut<[T; N]> for Vector<T, N> {
fn as_mut(&mut self) -> &mut [T; N] {
self.as_mut_array()
}
}
impl<T, const N: usize> Index<usize> for Vector<T, N> {
type Output = T;
fn index(&self, i: usize) -> &T {
&self.data[i]
}
}
impl<T, const N: usize> IndexMut<usize> for Vector<T, N> {
fn index_mut(&mut self, i: usize) -> &mut T {
&mut self.data[i]
}
}
impl<T, const N: usize> Vector<T, N> {
pub fn as_ptr(&self) -> *const T {
self.as_ref().as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self.as_mut().as_mut_ptr()
}
pub unsafe fn get_unchecked(&self, i: usize) -> &T {
self.as_ref().get_unchecked(i)
}
pub unsafe fn get_unchecked_mut(&mut self, i: usize) -> &mut T {
self.as_mut().get_unchecked_mut(i)
}
}