Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RowVectorView type #1232

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions src/base/alias_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,73 @@ pub type VectorView5<'a, T, RStride = U1, CStride = U5> =
pub type VectorView6<'a, T, RStride = U1, CStride = U6> =
Matrix<T, U6, U1, ViewStorage<'a, T, U6, U1, RStride, CStride>>;

/// An immutable row vector view with dimensions known at compile-time.
///
/// See [`RowVectorViewMut`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView<'a, T, D, RStride = U1, CStride = D> =
Matrix<T, U1, D, ViewStorage<'a, T, U1, D, RStride, CStride>>;

/// An immutable row vector view with dimensions known at compile-time.
///
/// See [`RowSVectorViewMut`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowSVectorView<'a, T, const D: usize> =
Matrix<T, Const<1>, Const<D>, ViewStorage<'a, T, Const<1>, Const<D>, Const<1>, Const<D>>>;

/// An immutable row vector view dynamic numbers of rows and columns.
///
/// See [`RowDVectorViewMut`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowDVectorView<'a, T, RStride = U1, CStride = Dyn> =
Matrix<T, U1, Dyn, ViewStorage<'a, T, U1, Dyn, RStride, CStride>>;

/// An immutable 1D row vector view.
///
/// See [`RowVectorViewMut1`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView1<'a, T, RStride = U1, CStride = U1> =
Matrix<T, U1, U1, ViewStorage<'a, T, U1, U1, RStride, CStride>>;
/// An immutable 2D row vector view.
///
/// See [`RowVectorViewMut2`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView2<'a, T, RStride = U1, CStride = U2> =
Matrix<T, U1, U2, ViewStorage<'a, T, U1, U2, RStride, CStride>>;
/// An immutable 3D row vector view.
///
/// See [`RowVectorViewMut3`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView3<'a, T, RStride = U1, CStride = U2> =
Matrix<T, U1, U3, ViewStorage<'a, T, U1, U3, RStride, CStride>>;
/// An immutable 4D row vector view.
///
/// See [`RowVectorViewMut4`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView4<'a, T, RStride = U1, CStride = U4> =
Matrix<T, U1, U4, ViewStorage<'a, T, U1, U4, RStride, CStride>>;
/// An immutable 5D row vector view.
///
/// See [`RowVectorViewMut5`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView5<'a, T, RStride = U1, CStride = U5> =
Matrix<T, U1, U5, ViewStorage<'a, T, U1, U5, RStride, CStride>>;
/// An immutable 6D row vector view.
///
/// See [`RowVectorViewMut6`] for a mutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorView6<'a, T, RStride = U1, CStride = U6> =
Matrix<T, U1, U6, ViewStorage<'a, T, U1, U6, RStride, CStride>>;

/*
*
*
Expand Down Expand Up @@ -873,3 +940,70 @@ pub type VectorViewMut5<'a, T, RStride = U1, CStride = U5> =
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type VectorViewMut6<'a, T, RStride = U1, CStride = U6> =
Matrix<T, U6, U1, ViewStorageMut<'a, T, U6, U1, RStride, CStride>>;

/// A mutable row vector view with dimensions known at compile-time.
///
/// See [`RowVectorView`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut<'a, T, D, RStride = U1, CStride = Dyn> =
Matrix<T, D, U1, ViewStorageMut<'a, T, D, U1, RStride, CStride>>;

/// A mutable row vector view with dimensions known at compile-time.
///
/// See [`RowSVectorView`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowSVectorViewMut<'a, T, const D: usize> =
Matrix<T, Const<1>, Const<D>, ViewStorageMut<'a, T, Const<1>, Const<D>, Const<1>, Const<D>>>;

/// A mutable row vector view dynamic numbers of rows and columns.
///
/// See [`RowDVectorView`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowDVectorViewMut<'a, T, RStride = U1, CStride = Dyn> =
Matrix<T, U1, Dyn, ViewStorageMut<'a, T, U1, Dyn, RStride, CStride>>;

/// A mutable 1D row vector view.
///
/// See [`RowVectorView1`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut1<'a, T, RStride = U1, CStride = U1> =
Matrix<T, U1, U1, ViewStorageMut<'a, T, U1, U1, RStride, CStride>>;
/// A mutable 2D row vector view.
///
/// See [`RowVectorView2`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut2<'a, T, RStride = U1, CStride = U2> =
Matrix<T, U1, U2, ViewStorageMut<'a, T, U1, U2, RStride, CStride>>;
/// A mutable 3D row vector view.
///
/// See [`RowVectorView3`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut3<'a, T, RStride = U1, CStride = U3> =
Matrix<T, U1, U3, ViewStorageMut<'a, T, U1, U3, RStride, CStride>>;
/// A mutable 4D row vector view.
///
/// See [`RowVectorView4`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut4<'a, T, RStride = U1, CStride = U4> =
Matrix<T, U1, U4, ViewStorageMut<'a, T, U1, U4, RStride, CStride>>;
/// A mutable 5D row vector view.
///
/// See [`RowVectorView5`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut5<'a, T, RStride = U1, CStride = U5> =
Matrix<T, U1, U5, ViewStorageMut<'a, T, U1, U5, RStride, CStride>>;
/// A mutable 6D row vector view.
///
/// See [`RowVectorView6`] for an immutable version of this type.
///
/// **Because this is an alias, not all its methods are listed here. See the [`Matrix`](crate::base::Matrix) type too.**
pub type RowVectorViewMut6<'a, T, RStride = U1, CStride = U6> =
Matrix<T, U1, U6, ViewStorageMut<'a, T, U1, U6, RStride, CStride>>;
42 changes: 40 additions & 2 deletions src/base/conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ use crate::base::constraint::{SameNumberOfColumns, SameNumberOfRows, ShapeConstr
use crate::base::dimension::{
Const, Dim, U1, U10, U11, U12, U13, U14, U15, U16, U2, U3, U4, U5, U6, U7, U8, U9,
};
#[cfg(any(feature = "std", feature = "alloc"))]

use crate::base::dimension::{DimName, Dyn};
use crate::base::iter::{MatrixIter, MatrixIterMut};
use crate::base::storage::{IsContiguous, RawStorage, RawStorageMut};
use crate::base::{
ArrayStorage, DVectorView, DVectorViewMut, DefaultAllocator, Matrix, MatrixView, MatrixViewMut,
OMatrix, Scalar,
OMatrix, RowDVectorView, RowDVectorViewMut, Scalar,
};
#[cfg(any(feature = "std", feature = "alloc"))]
use crate::base::{DVector, RowDVector, VecStorage};
Expand Down Expand Up @@ -532,6 +532,44 @@ impl<'a, T: Scalar> From<DVectorViewMut<'a, T>> for &'a mut [T] {
}
}

impl<'a, T: Scalar + Copy> From<&'a [T]> for RowDVectorView<'a, T, Dyn, U1> {
#[inline]
fn from(slice: &'a [T]) -> Self {
Self::from_slice_with_strides_generic(
slice,
U1::name(),
Dyn(slice.len()),
Dyn(slice.len()),
U1::name(),
)
}
}

impl<'a, T: Scalar> From<RowDVectorView<'a, T, Dyn, U1>> for &'a [T] {
fn from(vec: RowDVectorView<'a, T, Dyn, U1>) -> &'a [T] {
vec.data.into_slice()
}
}

impl<'a, T: Scalar + Copy> From<&'a mut [T]> for RowDVectorViewMut<'a, T, Dyn, U1> {
#[inline]
fn from(slice: &'a mut [T]) -> Self {
Self::from_slice_with_strides_generic(
slice,
U1::name(),
Dyn(slice.len()),
Dyn(slice.len()),
U1::name(),
)
}
}

impl<'a, T: Scalar> From<RowDVectorViewMut<'a, T, Dyn, U1>> for &'a mut [T] {
fn from(vec: RowDVectorViewMut<'a, T, Dyn, U1>) -> &'a mut [T] {
vec.data.into_slice_mut()
}
}

impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 2]>
for OMatrix<T, R, C>
where
Expand Down
19 changes: 15 additions & 4 deletions src/base/matrix_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,17 +247,28 @@ unsafe impl<'a, T, R: Dim, C: Dim, RStride: Dim, CStride: Dim> RawStorageMut<T,
}
}

unsafe impl<'a, T, R: Dim, CStride: Dim> IsContiguous for ViewStorage<'a, T, R, U1, U1, CStride> {}
unsafe impl<'a, T, R: Dim, CStride: Dim> IsContiguous
unsafe impl<'a, T, R: Dim + IsNotStaticOne, CStride: Dim> IsContiguous for ViewStorage<'a, T, R, U1, U1, CStride> {}
unsafe impl<'a, T, R: Dim + IsNotStaticOne, CStride: Dim> IsContiguous
for ViewStorageMut<'a, T, R, U1, U1, CStride>
{
}

unsafe impl<'a, T, R: DimName, C: Dim + IsNotStaticOne> IsContiguous
unsafe impl<'a, T, C: Dim + IsNotStaticOne, RStride: Dim> IsContiguous for ViewStorage<'a, T, U1, C, RStride, U1> {}
unsafe impl<'a, T, C: Dim + IsNotStaticOne, RStride: Dim> IsContiguous
for ViewStorageMut<'a, T, U1, C, RStride, U1>
{
}

unsafe impl<'a, T> IsContiguous
for ViewStorage<'a, T, U1, U1, U1, U1>
{
}

unsafe impl<'a, T, R: DimName + IsNotStaticOne, C: Dim + IsNotStaticOne> IsContiguous
for ViewStorage<'a, T, R, C, U1, R>
{
}
unsafe impl<'a, T, R: DimName, C: Dim + IsNotStaticOne> IsContiguous
unsafe impl<'a, T, R: DimName + IsNotStaticOne, C: Dim + IsNotStaticOne> IsContiguous
for ViewStorageMut<'a, T, R, C, U1, R>
{
}
Expand Down