use alloc::borrow::ToOwned;
use core::{
borrow::{Borrow, BorrowMut},
ops::{Deref, DerefMut},
};
use crate::{
Array,
ArrayBase,
ArrayPartsSized,
ArrayPartsUnsized,
ArrayRef,
Data,
DataMut,
Dimension,
LayoutRef,
RawData,
RawDataMut,
RawRef,
};
impl<S, D> Deref for ArrayBase<S, D>
where S: Data
{
type Target = ArrayRef<S::Elem, D>;
fn deref(&self) -> &Self::Target
{
let parts: &ArrayPartsUnsized<S::Elem, D> = &self.parts;
let ptr = (parts as *const ArrayPartsUnsized<S::Elem, D>) as *const ArrayRef<S::Elem, D>;
unsafe { &*ptr }
}
}
impl<S, D> DerefMut for ArrayBase<S, D>
where
S: DataMut,
D: Dimension,
{
fn deref_mut(&mut self) -> &mut Self::Target
{
self.ensure_unique();
let parts: &mut ArrayPartsUnsized<S::Elem, D> = &mut self.parts;
let ptr = (parts as *mut ArrayPartsUnsized<S::Elem, D>) as *mut ArrayRef<S::Elem, D>;
unsafe { &mut *ptr }
}
}
impl<A, D> Deref for ArrayRef<A, D>
{
type Target = RawRef<A, D>;
fn deref(&self) -> &Self::Target
{
unsafe { &*((self as *const ArrayRef<A, D>) as *const RawRef<A, D>) }
}
}
impl<A, D> DerefMut for ArrayRef<A, D>
{
fn deref_mut(&mut self) -> &mut Self::Target
{
unsafe { &mut *((self as *mut ArrayRef<A, D>) as *mut RawRef<A, D>) }
}
}
impl<A, D> Deref for RawRef<A, D>
{
type Target = LayoutRef<A, D>;
fn deref(&self) -> &Self::Target
{
&self.0
}
}
impl<A, D> DerefMut for RawRef<A, D>
{
fn deref_mut(&mut self) -> &mut Self::Target
{
&mut self.0
}
}
impl<A, S, D> AsRef<RawRef<A, D>> for ArrayBase<S, D>
where S: RawData<Elem = A>
{
fn as_ref(&self) -> &RawRef<A, D>
{
let parts: &ArrayPartsUnsized<S::Elem, D> = &self.parts;
let ptr = (parts as *const ArrayPartsUnsized<S::Elem, D>) as *const RawRef<S::Elem, D>;
unsafe { &*ptr }
}
}
impl<A, S, D> AsMut<RawRef<A, D>> for ArrayBase<S, D>
where S: RawDataMut<Elem = A>
{
fn as_mut(&mut self) -> &mut RawRef<A, D>
{
let parts: &mut ArrayPartsUnsized<S::Elem, D> = &mut self.parts;
let ptr = (parts as *mut ArrayPartsUnsized<S::Elem, D>) as *mut RawRef<S::Elem, D>;
unsafe { &mut *ptr }
}
}
impl<A, S, D> AsRef<LayoutRef<A, D>> for ArrayBase<S, D>
where S: RawData<Elem = A>
{
fn as_ref(&self) -> &LayoutRef<A, D>
{
let parts: &ArrayPartsUnsized<S::Elem, D> = &self.parts;
let ptr = (parts as *const ArrayPartsUnsized<S::Elem, D>) as *const LayoutRef<S::Elem, D>;
unsafe { &*ptr }
}
}
impl<A, S, D> AsMut<LayoutRef<A, D>> for ArrayBase<S, D>
where S: RawData<Elem = A>
{
fn as_mut(&mut self) -> &mut LayoutRef<A, D>
{
let parts: &mut ArrayPartsUnsized<S::Elem, D> = &mut self.parts;
let ptr = (parts as *mut ArrayPartsUnsized<S::Elem, D>) as *mut LayoutRef<S::Elem, D>;
unsafe { &mut *ptr }
}
}
impl<A, D> AsRef<RawRef<A, D>> for ArrayRef<A, D>
{
fn as_ref(&self) -> &RawRef<A, D>
{
self
}
}
impl<A, D> AsMut<RawRef<A, D>> for ArrayRef<A, D>
{
fn as_mut(&mut self) -> &mut RawRef<A, D>
{
self
}
}
impl<A, D> AsRef<LayoutRef<A, D>> for ArrayRef<A, D>
{
fn as_ref(&self) -> &LayoutRef<A, D>
{
self
}
}
impl<A, D> AsMut<LayoutRef<A, D>> for ArrayRef<A, D>
{
fn as_mut(&mut self) -> &mut LayoutRef<A, D>
{
self
}
}
impl<A, D> AsRef<LayoutRef<A, D>> for RawRef<A, D>
{
fn as_ref(&self) -> &LayoutRef<A, D>
{
self
}
}
impl<A, D> AsMut<LayoutRef<A, D>> for RawRef<A, D>
{
fn as_mut(&mut self) -> &mut LayoutRef<A, D>
{
self
}
}
impl<A, D> AsRef<RawRef<A, D>> for RawRef<A, D>
{
fn as_ref(&self) -> &RawRef<A, D>
{
self
}
}
impl<A, D> AsMut<RawRef<A, D>> for RawRef<A, D>
{
fn as_mut(&mut self) -> &mut RawRef<A, D>
{
self
}
}
impl<A, D> AsRef<LayoutRef<A, D>> for LayoutRef<A, D>
{
fn as_ref(&self) -> &LayoutRef<A, D>
{
self
}
}
impl<A, D> AsMut<LayoutRef<A, D>> for LayoutRef<A, D>
{
fn as_mut(&mut self) -> &mut LayoutRef<A, D>
{
self
}
}
impl<A, D: Clone> Clone for ArrayPartsSized<A, D>
{
fn clone(&self) -> Self
{
Self {
dim: self.dim.clone(),
strides: self.strides.clone(),
ptr: self.ptr,
_dst_control: [0; 0],
}
}
}
impl<A, D: Clone + Copy> Copy for ArrayPartsSized<A, D> {}
impl<S, D> Borrow<RawRef<S::Elem, D>> for ArrayBase<S, D>
where S: RawData
{
fn borrow(&self) -> &RawRef<S::Elem, D>
{
self.as_ref()
}
}
impl<S, D> BorrowMut<RawRef<S::Elem, D>> for ArrayBase<S, D>
where S: RawDataMut
{
fn borrow_mut(&mut self) -> &mut RawRef<S::Elem, D>
{
self.as_mut()
}
}
impl<S, D> Borrow<ArrayRef<S::Elem, D>> for ArrayBase<S, D>
where S: Data
{
fn borrow(&self) -> &ArrayRef<S::Elem, D>
{
self
}
}
impl<S, D> BorrowMut<ArrayRef<S::Elem, D>> for ArrayBase<S, D>
where
S: DataMut,
D: Dimension,
{
fn borrow_mut(&mut self) -> &mut ArrayRef<S::Elem, D>
{
self
}
}
impl<A, D> ToOwned for ArrayRef<A, D>
where
A: Clone,
D: Dimension,
{
type Owned = Array<A, D>;
fn to_owned(&self) -> Self::Owned
{
self.to_owned()
}
fn clone_into(&self, target: &mut Array<A, D>)
{
target.zip_mut_with(self, |tgt, src| tgt.clone_from(src));
}
}
impl<A, S, D> ArrayBase<S, D>
where S: RawData<Elem = A>
{
pub fn as_layout_ref(&self) -> &LayoutRef<A, D>
{
self.as_ref()
}
pub fn as_layout_ref_mut(&mut self) -> &mut LayoutRef<A, D>
{
self.as_mut()
}
pub fn as_raw_ref(&self) -> &RawRef<A, D>
{
self.as_ref()
}
pub fn as_raw_ref_mut(&mut self) -> &mut RawRef<A, D>
where S: RawDataMut<Elem = A>
{
self.as_mut()
}
}
#[allow(dead_code)]
fn test_no_swap_via_doctests() {}