pub unsafe trait Storage<T: Scalar, R: Dim, C: Dim = U1>: Debug + Sized {
type RStride: Dim;
type CStride: Dim;
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]ⓘNotable traits for &'_ [u8]impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
;
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>;
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.
Associated Types
Required methods
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
.
The spacing between consecutive row elements and consecutive column elements.
For example this returns (1, 5)
for a row-major matrix with 5 columns.
fn is_contiguous(&self) -> bool
fn is_contiguous(&self) -> bool
Indicates whether this data buffer stores its elements contiguously.
Retrieves the data buffer as a contiguous slice.
The matrix components may not be stored in a contiguous way, depending on the strides.
fn into_owned(self) -> Owned<T, R, C> where
DefaultAllocator: Allocator<T, R, C>,
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.
fn clone_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>,
Clones this data storage to one that does not contain any reference.
Provided methods
fn linear_index(&self, irow: usize, icol: usize) -> usize
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))
unsafe fn get_address_unchecked_linear(&self, i: usize) -> *const T
unsafe fn get_address_unchecked_linear(&self, i: usize) -> *const T
Gets the address of the i-th matrix component without performing bound-checking.
unsafe fn get_address_unchecked(&self, irow: usize, icol: usize) -> *const T
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.
unsafe fn get_unchecked_linear(&self, i: usize) -> &T
unsafe fn get_unchecked_linear(&self, i: usize) -> &T
Retrieves a reference to the i-th element without bound-checking.
unsafe fn get_unchecked(&self, irow: usize, icol: usize) -> &T
unsafe fn get_unchecked(&self, irow: usize, icol: usize) -> &T
Retrieves a reference to the i-th element without bound-checking.