use crate::{
col::{VecImpl, VecOwnImpl},
mat::*,
utils::slice::*,
Conj,
};
use coe::Coerce;
use core::{marker::PhantomData, ptr::NonNull};
use faer_entity::*;
use reborrow::*;
pub trait RowIndex<ColRange>: crate::seal::Seal + Sized {
type Target;
#[allow(clippy::missing_safety_doc)]
unsafe fn get_unchecked(this: Self, col: ColRange) -> Self::Target {
<Self as RowIndex<ColRange>>::get(this, col)
}
fn get(this: Self, col: ColRange) -> Self::Target;
}
pub trait AsRowRef<E: Entity> {
fn as_row_ref(&self) -> RowRef<'_, E>;
}
pub trait AsRowMut<E: Entity>: AsRowRef<E> {
fn as_row_mut(&mut self) -> RowMut<'_, E>;
}
impl<E: Entity, T: AsRowRef<E>> AsRowRef<E> for &T {
fn as_row_ref(&self) -> RowRef<'_, E> {
(**self).as_row_ref()
}
}
impl<E: Entity, T: AsRowRef<E>> AsRowRef<E> for &mut T {
fn as_row_ref(&self) -> RowRef<'_, E> {
(**self).as_row_ref()
}
}
impl<E: Entity, T: AsRowMut<E>> AsRowMut<E> for &mut T {
fn as_row_mut(&mut self) -> RowMut<'_, E> {
(**self).as_row_mut()
}
}
mod row_index;
mod rowref;
pub use rowref::{
from_raw_parts, from_ref, from_ref_generic, from_repeated_ref, from_repeated_ref_generic,
from_slice, from_slice_generic, RowRef,
};
mod rowmut;
pub use rowmut::{
from_mut, from_mut_generic, from_raw_parts_mut, from_slice_mut, from_slice_mut_generic, RowMut,
};
mod rowown;
pub use rowown::Row;
pub trait RowBatch<E: Conjugate>: As2D<E> {
type Owned: RowBatch<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 RowBatchMut<E: Conjugate>: As2DMut<E> + RowBatch<E> {}
impl<E: Conjugate, T: RowBatch<E>> RowBatch<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: RowBatch<E>> RowBatch<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: RowBatchMut<E>> RowBatchMut<E> for &mut T {}
impl<'a, FromE: Entity, ToE: Entity> Coerce<RowRef<'a, ToE>> for RowRef<'a, FromE> {
#[inline(always)]
fn coerce(self) -> RowRef<'a, ToE> {
assert!(coe::is_same::<FromE, ToE>());
unsafe { transmute_unchecked::<RowRef<'a, FromE>, RowRef<'a, ToE>>(self) }
}
}
impl<'a, FromE: Entity, ToE: Entity> Coerce<RowMut<'a, ToE>> for RowMut<'a, FromE> {
#[inline(always)]
fn coerce(self) -> RowMut<'a, ToE> {
assert!(coe::is_same::<FromE, ToE>());
unsafe { transmute_unchecked::<RowMut<'a, FromE>, RowMut<'a, ToE>>(self) }
}
}