use super::{
BlockedCoo, BlockedCooData, Csr, CsrData, DenseWithMask, DenseWithMaskData, SellP, SellPData,
SparseFormat, SparseShape, Validated, ValidatedData,
};
use crate::arch::{assert_arch_executable, SimdArch};
use core::marker::PhantomData;
pub struct SparseView<'a, T: 'a, Format, Arch>
where
Format: SparseFormat,
Arch: SimdArch,
{
pub(crate) data: Format::Storage<'a, T>,
_arch: PhantomData<Arch>,
_lifetime: PhantomData<&'a ()>,
}
impl<'a, T: 'a, Format, Arch> SparseView<'a, T, Format, Arch>
where
Format: SparseFormat,
Arch: SimdArch,
{
#[inline(always)]
pub fn new(data: Format::Storage<'a, T>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
#[inline(always)]
pub fn storage(&self) -> &Format::Storage<'a, T> {
&self.data
}
#[inline(always)]
pub fn nrows(&self) -> usize {
self.data.nrows()
}
#[inline(always)]
pub fn ncols(&self) -> usize {
self.data.ncols()
}
}
impl<'a, T: 'a, Arch> SparseView<'a, T, Csr, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn from_csr(data: CsrData<'a, T>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
#[inline(always)]
pub fn csr_data(&self) -> &CsrData<'a, T> {
&self.data
}
}
impl<'a, T: 'a, Arch> SparseView<'a, T, Validated<Csr>, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn try_from_csr(data: CsrData<'a, T>) -> Result<Self, crate::SimdError> {
Ok(Self {
data: ValidatedData::new(data)?,
_arch: PhantomData,
_lifetime: PhantomData,
})
}
#[inline]
pub fn from_validated_csr(data: ValidatedData<CsrData<'a, T>>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
impl<'a, T: 'a, const C: usize, Arch> SparseView<'a, T, SellP<C>, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn from_sellp(data: SellPData<'a, T, C>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
impl<'a, T: 'a, const C: usize, Arch> SparseView<'a, T, Validated<SellP<C>>, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn try_from_sellp(data: SellPData<'a, T, C>) -> Result<Self, crate::SimdError> {
Ok(Self {
data: ValidatedData::new(data)?,
_arch: PhantomData,
_lifetime: PhantomData,
})
}
#[inline]
pub fn from_validated_sellp(data: ValidatedData<SellPData<'a, T, C>>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
impl<'a, T: 'a, const BM: usize, const BN: usize, Arch> SparseView<'a, T, BlockedCoo<BM, BN>, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn from_blocked_coo(data: BlockedCooData<'a, T, BM, BN>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
impl<'a, T: 'a, const BM: usize, const BN: usize, Arch>
SparseView<'a, T, Validated<BlockedCoo<BM, BN>>, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn try_from_blocked_coo(
data: BlockedCooData<'a, T, BM, BN>,
) -> Result<Self, crate::SimdError> {
Ok(Self {
data: ValidatedData::new(data)?,
_arch: PhantomData,
_lifetime: PhantomData,
})
}
#[inline]
pub fn from_validated_blocked_coo(data: ValidatedData<BlockedCooData<'a, T, BM, BN>>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
impl<'a, T: 'a, Arch> SparseView<'a, T, DenseWithMask, Arch>
where
Arch: SimdArch,
{
#[inline]
pub fn from_dense_with_mask(data: DenseWithMaskData<'a, T>) -> Self {
assert_arch_executable::<Arch>();
Self {
data,
_arch: PhantomData,
_lifetime: PhantomData,
}
}
}
pub trait SparseViewShape {
fn nrows(&self) -> usize;
fn ncols(&self) -> usize;
}
impl<'a, T: 'a, Format, Arch> SparseViewShape for SparseView<'a, T, Format, Arch>
where
Format: SparseFormat,
Arch: SimdArch,
Format::Storage<'a, T>: SparseShape,
{
#[inline(always)]
fn nrows(&self) -> usize {
self.data.nrows()
}
#[inline(always)]
fn ncols(&self) -> usize {
self.data.ncols()
}
}
impl<'a, T: 'a, Format, Arch> super::types::SparseValidate for SparseView<'a, T, Format, Arch>
where
Format: SparseFormat,
Arch: SimdArch,
Format::Storage<'a, T>: super::types::SparseValidate,
{
#[inline]
fn validate(&self) -> Result<(), crate::SimdError> {
self.data.validate()
}
}