use alloc::slice;
#[allow(unused_imports)]
use rawpointer::PointerExt;
use std::mem::MaybeUninit;
use crate::imp_prelude::*;
use crate::{Baseiter, ElementsBase, ElementsBaseMut};
use crate::dimension::offset_from_low_addr_ptr_to_logical_ptr;
use crate::iter::{self, AxisIter, AxisIterMut};
use crate::math_cell::MathCell;
use crate::IndexLonger;
impl<'a, A, D> ArrayView<'a, A, D>
where D: Dimension
{
pub fn reborrow<'b>(self) -> ArrayView<'b, A, D>
where 'a: 'b
{
unsafe { ArrayView::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
pub fn to_slice(&self) -> Option<&'a [A]>
{
if self.is_standard_layout() {
unsafe { Some(slice::from_raw_parts(self.parts.ptr.as_ptr(), self.len())) }
} else {
None
}
}
pub fn to_slice_memory_order(&self) -> Option<&'a [A]>
{
if self.is_contiguous() {
let offset = offset_from_low_addr_ptr_to_logical_ptr(&self.parts.dim, &self.parts.strides);
unsafe { Some(slice::from_raw_parts(self.parts.ptr.sub(offset).as_ptr(), self.len())) }
} else {
None
}
}
#[inline]
pub(crate) fn into_raw_view(self) -> RawArrayView<A, D>
{
unsafe { RawArrayView::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
}
impl<'a, A> ArrayView<'a, A, Ix0>
{
pub fn into_scalar(self) -> &'a A
{
self.index(Ix0())
}
}
impl<'a, A> ArrayViewMut<'a, A, Ix0>
{
pub fn into_scalar(self) -> &'a mut A
{
self.index(Ix0())
}
}
impl<'a, A, D> ArrayViewMut<'a, A, D>
where D: Dimension
{
pub fn into_slice(self) -> Option<&'a mut [A]>
{
self.try_into_slice().ok()
}
pub fn into_slice_memory_order(self) -> Option<&'a mut [A]>
{
self.try_into_slice_memory_order().ok()
}
pub fn into_cell_view(self) -> ArrayView<'a, MathCell<A>, D>
{
unsafe {
self.into_raw_view_mut()
.cast::<MathCell<A>>()
.deref_into_view()
}
}
pub(crate) unsafe fn into_maybe_uninit(self) -> ArrayViewMut<'a, MaybeUninit<A>, D>
{
self.into_raw_view_mut()
.cast::<MaybeUninit<A>>()
.deref_into_view_mut()
}
}
impl<A, D> RawArrayView<A, D>
where D: Dimension
{
#[inline]
pub(crate) fn into_base_iter(self) -> Baseiter<A, D>
{
unsafe { Baseiter::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
}
impl<A, D> RawArrayViewMut<A, D>
where D: Dimension
{
#[inline]
pub(crate) fn into_base_iter(self) -> Baseiter<A, D>
{
unsafe { Baseiter::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
}
impl<'a, A, D> ArrayView<'a, A, D>
where D: Dimension
{
#[inline]
pub(crate) fn into_base_iter(self) -> Baseiter<A, D>
{
unsafe { Baseiter::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
#[inline]
pub(crate) fn into_elements_base(self) -> ElementsBase<'a, A, D>
{
ElementsBase::new(self)
}
pub fn into_outer_iter(self) -> iter::AxisIter<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIter::new(self, Axis(0))
}
pub fn into_indexed_iter(self) -> iter::IndexedIter<'a, A, D>
{
iter::IndexedIter::new(self.into_elements_base())
}
pub fn into_axis_iter(self, axis: Axis) -> iter::AxisIter<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIter::new(self, axis)
}
pub fn into_axis_chunks_iter(self, axis: Axis, chunk_size: usize) -> iter::AxisChunksIter<'a, A, D>
where D: RemoveAxis
{
iter::AxisChunksIter::new(self, axis, chunk_size)
}
}
impl<'a, A, D> ArrayViewMut<'a, A, D>
where D: Dimension
{
pub(crate) fn into_view(self) -> ArrayView<'a, A, D>
{
unsafe { ArrayView::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
pub(crate) fn into_raw_view_mut(self) -> RawArrayViewMut<A, D>
{
unsafe { RawArrayViewMut::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
#[inline]
pub(crate) fn into_base_iter(self) -> Baseiter<A, D>
{
unsafe { Baseiter::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
}
#[inline]
pub(crate) fn into_elements_base(self) -> ElementsBaseMut<'a, A, D>
{
ElementsBaseMut::new(self)
}
pub(crate) fn try_into_slice(self) -> Result<&'a mut [A], Self>
{
if self.is_standard_layout() {
unsafe { Ok(slice::from_raw_parts_mut(self.parts.ptr.as_ptr(), self.len())) }
} else {
Err(self)
}
}
fn try_into_slice_memory_order(self) -> Result<&'a mut [A], Self>
{
if self.is_contiguous() {
let offset = offset_from_low_addr_ptr_to_logical_ptr(&self.parts.dim, &self.parts.strides);
unsafe { Ok(slice::from_raw_parts_mut(self.parts.ptr.sub(offset).as_ptr(), self.len())) }
} else {
Err(self)
}
}
pub fn into_outer_iter(self) -> iter::AxisIter<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIter::new(self.into_view(), Axis(0))
}
pub fn into_indexed_iter(self) -> iter::IndexedIter<'a, A, D>
{
iter::IndexedIter::new(self.into_view().into_elements_base())
}
pub fn into_axis_iter(self, axis: Axis) -> iter::AxisIter<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIter::new(self.into_view(), axis)
}
pub fn into_axis_chunks_iter(self, axis: Axis, chunk_size: usize) -> iter::AxisChunksIter<'a, A, D>
where D: RemoveAxis
{
iter::AxisChunksIter::new(self.into_view(), axis, chunk_size)
}
pub fn into_outer_iter_mut(self) -> iter::AxisIterMut<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIterMut::new(self, Axis(0))
}
pub fn into_indexed_iter_mut(self) -> iter::IndexedIterMut<'a, A, D>
{
iter::IndexedIterMut::new(self.into_elements_base())
}
pub fn into_axis_iter_mut(self, axis: Axis) -> iter::AxisIterMut<'a, A, D::Smaller>
where D: RemoveAxis
{
AxisIterMut::new(self, axis)
}
pub fn into_axis_chunks_iter_mut(self, axis: Axis, chunk_size: usize) -> iter::AxisChunksIterMut<'a, A, D>
where D: RemoveAxis
{
iter::AxisChunksIterMut::new(self, axis, chunk_size)
}
}