use crate::{mat::*, utils::slice::*, Conj};
use coe::Coerce;
use core::{marker::PhantomData, ptr::NonNull};
use faer_entity::*;
use reborrow::*;
#[repr(C)]
pub(crate) struct VecImpl<E: Entity> {
pub(crate) ptr: GroupCopyFor<E, NonNull<E::Unit>>,
pub(crate) len: usize,
pub(crate) stride: isize,
}
#[repr(C)]
pub(crate) struct VecOwnImpl<E: Entity> {
pub(crate) ptr: GroupCopyFor<E, NonNull<E::Unit>>,
pub(crate) len: usize,
}
impl<E: Entity> Copy for VecImpl<E> {}
impl<E: Entity> Clone for VecImpl<E> {
#[inline(always)]
fn clone(&self) -> Self {
*self
}
}
unsafe impl<E: Entity> Sync for VecImpl<E> {}
unsafe impl<E: Entity> Send for VecImpl<E> {}
unsafe impl<E: Entity> Sync for VecOwnImpl<E> {}
unsafe impl<E: Entity> Send for VecOwnImpl<E> {}
pub trait ColIndex<RowRange>: crate::seal::Seal + Sized {
type Target;
#[allow(clippy::missing_safety_doc)]
unsafe fn get_unchecked(this: Self, row: RowRange) -> Self::Target {
<Self as ColIndex<RowRange>>::get(this, row)
}
fn get(this: Self, row: RowRange) -> Self::Target;
}
pub trait AsColRef<E: Entity> {
fn as_col_ref(&self) -> ColRef<'_, E>;
}
pub trait AsColMut<E: Entity>: AsColRef<E> {
fn as_col_mut(&mut self) -> ColMut<'_, E>;
}
impl<E: Entity, T: AsColRef<E>> AsColRef<E> for &T {
fn as_col_ref(&self) -> ColRef<'_, E> {
(**self).as_col_ref()
}
}
impl<E: Entity, T: AsColRef<E>> AsColRef<E> for &mut T {
fn as_col_ref(&self) -> ColRef<'_, E> {
(**self).as_col_ref()
}
}
impl<E: Entity, T: AsColMut<E>> AsColMut<E> for &mut T {
fn as_col_mut(&mut self) -> ColMut<'_, E> {
(**self).as_col_mut()
}
}
mod col_index;
mod colref;
pub use colref::{
from_raw_parts, from_ref, from_ref_generic, from_repeated_ref, from_repeated_ref_generic,
from_slice, from_slice_generic, ColRef,
};
mod colmut;
pub use colmut::{
from_mut, from_mut_generic, from_raw_parts_mut, from_slice_mut, from_slice_mut_generic, ColMut,
};
mod colown;
pub use colown::Col;
pub trait ColBatch<E: Conjugate>: As2D<E> {
type Owned: ColBatchMut<E::Canonical>;
fn new_owned_zeros(nrows: usize, ncols: usize) -> Self::Owned;
fn new_owned_copied(src: &Self) -> Self::Owned;
fn resize_owned(owned: &mut Self::Owned, nrows: usize, ncols: usize);
}
pub trait ColBatchMut<E: Conjugate>: As2DMut<E> + ColBatch<E> {}
impl<E: Conjugate, T: ColBatch<E>> ColBatch<E> for &T {
type Owned = T::Owned;
#[inline]
#[track_caller]
fn new_owned_zeros(nrows: usize, ncols: usize) -> Self::Owned {
T::new_owned_zeros(nrows, ncols)
}
#[inline]
fn new_owned_copied(src: &Self) -> Self::Owned {
T::new_owned_copied(src)
}
#[inline]
fn resize_owned(owned: &mut Self::Owned, nrows: usize, ncols: usize) {
T::resize_owned(owned, nrows, ncols)
}
}
impl<E: Conjugate, T: ColBatch<E>> ColBatch<E> for &mut T {
type Owned = T::Owned;
#[inline]
#[track_caller]
fn new_owned_zeros(nrows: usize, ncols: usize) -> Self::Owned {
T::new_owned_zeros(nrows, ncols)
}
#[inline]
fn new_owned_copied(src: &Self) -> Self::Owned {
T::new_owned_copied(src)
}
#[inline]
fn resize_owned(owned: &mut Self::Owned, nrows: usize, ncols: usize) {
T::resize_owned(owned, nrows, ncols)
}
}
impl<E: Conjugate, T: ColBatchMut<E>> ColBatchMut<E> for &mut T {}
impl<'a, FromE: Entity, ToE: Entity> Coerce<ColRef<'a, ToE>> for ColRef<'a, FromE> {
#[inline(always)]
fn coerce(self) -> ColRef<'a, ToE> {
assert!(coe::is_same::<FromE, ToE>());
unsafe { transmute_unchecked::<ColRef<'a, FromE>, ColRef<'a, ToE>>(self) }
}
}
impl<'a, FromE: Entity, ToE: Entity> Coerce<ColMut<'a, ToE>> for ColMut<'a, FromE> {
#[inline(always)]
fn coerce(self) -> ColMut<'a, ToE> {
assert!(coe::is_same::<FromE, ToE>());
unsafe { transmute_unchecked::<ColMut<'a, FromE>, ColMut<'a, ToE>>(self) }
}
}