use super::faer;
use faer::prelude::Reborrow;
use faer::sparse::{SparseRowMat, SparseRowMatMut, SparseRowMatRef};
use crate::{MatrixShape, Scalar, SparseRows};
impl<F> MatrixShape for SparseRowMat<usize, F> {
fn nrows(&self) -> usize {
self.symbolic().nrows()
}
fn ncols(&self) -> usize {
self.symbolic().ncols()
}
}
impl<F> MatrixShape for SparseRowMatRef<'_, usize, F> {
fn nrows(&self) -> usize {
self.symbolic().nrows()
}
fn ncols(&self) -> usize {
self.symbolic().ncols()
}
}
impl<F> MatrixShape for SparseRowMatMut<'_, usize, F> {
fn nrows(&self) -> usize {
self.symbolic().nrows()
}
fn ncols(&self) -> usize {
self.symbolic().ncols()
}
}
impl<F: Scalar> SparseRows<F> for SparseRowMatRef<'_, usize, F> {
fn sparse_row(&self, i: usize) -> (&[usize], &[F]) {
assert!(i < self.nrows(), "row index out of bounds");
let range = self.row_range(i);
(&self.col_idx()[range.clone()], &self.val()[range])
}
}
impl<F: Scalar> SparseRows<F> for SparseRowMat<usize, F> {
fn sparse_row(&self, i: usize) -> (&[usize], &[F]) {
assert!(i < self.nrows(), "row index out of bounds");
let range = self.row_range(i);
(&self.col_idx()[range.clone()], &self.val()[range])
}
}
impl<F: Scalar> SparseRows<F> for SparseRowMatMut<'_, usize, F> {
fn sparse_row(&self, i: usize) -> (&[usize], &[F]) {
assert!(i < self.nrows(), "row index out of bounds");
let view = self.rb();
let range = view.row_range(i);
(&view.col_idx()[range.clone()], &view.val()[range])
}
}