forked from M-Labs/nalgebra
Merge pull request #922 from Cryptjar/impl-into-slice
Allow to extract the inner slices of SliceStorage
This commit is contained in:
commit
0a5bd520a4
@ -451,6 +451,12 @@ impl<'a, T: Scalar + Copy> From<&'a [T]> for DVectorSlice<'a, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, T: Scalar> From<DVectorSlice<'a, T>> for &'a [T] {
|
||||||
|
fn from(vec: DVectorSlice<'a, T>) -> &'a [T] {
|
||||||
|
vec.data.into_slice()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, T: Scalar + Copy> From<&'a mut [T]> for DVectorSliceMut<'a, T> {
|
impl<'a, T: Scalar + Copy> From<&'a mut [T]> for DVectorSliceMut<'a, T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(slice: &'a mut [T]) -> Self {
|
fn from(slice: &'a mut [T]) -> Self {
|
||||||
@ -458,6 +464,12 @@ impl<'a, T: Scalar + Copy> From<&'a mut [T]> for DVectorSliceMut<'a, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, T: Scalar> From<DVectorSliceMut<'a, T>> for &'a mut [T] {
|
||||||
|
fn from(vec: DVectorSliceMut<'a, T>) -> &'a mut [T] {
|
||||||
|
vec.data.into_slice_mut()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 2]>
|
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 2]>
|
||||||
for OMatrix<T, R, C>
|
for OMatrix<T, R, C>
|
||||||
where
|
where
|
||||||
|
@ -77,6 +77,23 @@ macro_rules! slice_storage_impl(
|
|||||||
$T::from_raw_parts(storage.$get_addr(start.0, start.1), shape, strides)
|
$T::from_raw_parts(storage.$get_addr(start.0, start.1), shape, strides)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl <'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim>
|
||||||
|
$T<'a, T, R, C, RStride, CStride>
|
||||||
|
where
|
||||||
|
Self: ContiguousStorage<T, R, C>
|
||||||
|
{
|
||||||
|
/// Extracts the original slice from this storage
|
||||||
|
pub fn into_slice(self) -> &'a [T] {
|
||||||
|
let (nrows, ncols) = self.shape();
|
||||||
|
if nrows.value() != 0 && ncols.value() != 0 {
|
||||||
|
let sz = self.linear_index(nrows.value() - 1, ncols.value() - 1);
|
||||||
|
unsafe { slice::from_raw_parts(self.ptr, sz + 1) }
|
||||||
|
} else {
|
||||||
|
unsafe { slice::from_raw_parts(self.ptr, 0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -108,6 +125,23 @@ impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Clone
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim>
|
||||||
|
SliceStorageMut<'a, T, R, C, RStride, CStride>
|
||||||
|
where
|
||||||
|
Self: ContiguousStorageMut<T, R, C>,
|
||||||
|
{
|
||||||
|
/// Extracts the original slice from this storage
|
||||||
|
pub fn into_slice_mut(self) -> &'a mut [T] {
|
||||||
|
let (nrows, ncols) = self.shape();
|
||||||
|
if nrows.value() != 0 && ncols.value() != 0 {
|
||||||
|
let sz = self.linear_index(nrows.value() - 1, ncols.value() - 1);
|
||||||
|
unsafe { slice::from_raw_parts_mut(self.ptr, sz + 1) }
|
||||||
|
} else {
|
||||||
|
unsafe { slice::from_raw_parts_mut(self.ptr, 0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! storage_impl(
|
macro_rules! storage_impl(
|
||||||
($($T: ident),* $(,)*) => {$(
|
($($T: ident),* $(,)*) => {$(
|
||||||
unsafe impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Storage<T, R, C>
|
unsafe impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Storage<T, R, C>
|
||||||
|
Loading…
Reference in New Issue
Block a user