pub unsafe trait Storage<T: Scalar, R: Dim, C: Dim = U1>: Debug + Sized {
    type RStride: Dim;
    type CStride: Dim;

    // Required methods
    fn ptr(&self) -> *const T;
    fn shape(&self) -> (R, C);
    fn strides(&self) -> (Self::RStride, Self::CStride);
    fn is_contiguous(&self) -> bool;
    fn as_slice(&self) -> &[T];
    fn into_owned(self) -> Owned<T, R, C>
       where DefaultAllocator: Allocator<T, R, C>;
    fn clone_owned(&self) -> Owned<T, R, C>
       where DefaultAllocator: Allocator<T, R, C>;

    // Provided methods
    fn linear_index(&self, irow: usize, icol: usize) -> usize { ... }
    unsafe fn get_address_unchecked_linear(&self, i: usize) -> *const T { ... }
    unsafe fn get_address_unchecked(&self, irow: usize, icol: usize) -> *const T { ... }
    unsafe fn get_unchecked_linear(&self, i: usize) -> &T { ... }
    unsafe fn get_unchecked(&self, irow: usize, icol: usize) -> &T { ... }
}
Expand description

The trait shared by all matrix data storage.

TODO: doc

Note that Self must always have a number of elements compatible with the matrix length (given by R and C if they are known at compile-time). For example, implementors of this trait should not allow the user to modify the size of the underlying buffer with safe methods (for example the VecStorage::data_mut method is unsafe because the user could change the vector’s size so that it no longer contains enough elements: this will lead to UB.

Required Associated Types§

source

type RStride: Dim

The static stride of this storage’s rows.

source

type CStride: Dim

The static stride of this storage’s columns.

Required Methods§

source

fn ptr(&self) -> *const T

The matrix data pointer.

source

fn shape(&self) -> (R, C)

The dimension of the matrix at run-time. Arr length of zero indicates the additive identity element of any dimension. Must be equal to Self::dimension() if it is not None.

source

fn strides(&self) -> (Self::RStride, Self::CStride)

The spacing between consecutive row elements and consecutive column elements.

For example this returns (1, 5) for a row-major matrix with 5 columns.

source

fn is_contiguous(&self) -> bool

Indicates whether this data buffer stores its elements contiguously.

source

fn as_slice(&self) -> &[T]

Retrieves the data buffer as a contiguous slice.

The matrix components may not be stored in a contiguous way, depending on the strides.

source

fn into_owned(self) -> Owned<T, R, C>where DefaultAllocator: Allocator<T, R, C>,

Builds a matrix data storage that does not contain any reference.

source

fn clone_owned(&self) -> Owned<T, R, C>where DefaultAllocator: Allocator<T, R, C>,

Clones this data storage to one that does not contain any reference.

Provided Methods§

source

fn linear_index(&self, irow: usize, icol: usize) -> usize

Compute the index corresponding to the irow-th row and icol-th column of this matrix. The index must be such that the following holds:

let lindex = self.linear_index(irow, icol);
assert!(*self.get_unchecked(irow, icol) == *self.get_unchecked_linear(lindex))
source

unsafe fn get_address_unchecked_linear(&self, i: usize) -> *const T

Gets the address of the i-th matrix component without performing bound-checking.

source

unsafe fn get_address_unchecked(&self, irow: usize, icol: usize) -> *const T

Gets the address of the i-th matrix component without performing bound-checking.

source

unsafe fn get_unchecked_linear(&self, i: usize) -> &T

Retrieves a reference to the i-th element without bound-checking.

source

unsafe fn get_unchecked(&self, irow: usize, icol: usize) -> &T

Retrieves a reference to the i-th element without bound-checking.

Implementors§

source§

impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Storage<T, R, C> for SliceStorage<'a, T, R, C, RStride, CStride>

§

type RStride = RStride

§

type CStride = CStride

source§

impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Storage<T, R, C> for SliceStorageMut<'a, T, R, C, RStride, CStride>

§

type RStride = RStride

§

type CStride = CStride

source§

impl<T, const R: usize, const C: usize> Storage<T, Const<R>, Const<C>> for ArrayStorage<T, R, C>where T: Scalar, DefaultAllocator: Allocator<T, Const<R>, Const<C>, Buffer = Self>,

§

type RStride = Const<1>

§

type CStride = Const<R>

source§

impl<T: Scalar, C: Dim> Storage<T, Dynamic, C> for VecStorage<T, Dynamic, C>where DefaultAllocator: Allocator<T, Dynamic, C, Buffer = Self>,

source§

impl<T: Scalar, R: DimName> Storage<T, R, Dynamic> for VecStorage<T, R, Dynamic>where DefaultAllocator: Allocator<T, R, Dynamic, Buffer = Self>,

§

type RStride = Const<1>

§

type CStride = R