use crate::{Array, MutableArrayImpl, RawAccessMut, Stride};
pub trait DataContainer {
type Item: Copy + Default;
fn number_of_elements(&self) -> usize;
}
pub trait ValueDataContainer: DataContainer {
unsafe fn get_unchecked_value(&self, index: usize) -> Self::Item;
}
pub trait RefDataContainer: DataContainer {
unsafe fn get_unchecked(&self, index: usize) -> &Self::Item;
}
pub trait RefDataContainerMut: DataContainer {
unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut Self::Item;
}
pub unsafe trait DisjointRefDataContainerMut: RefDataContainerMut {}
pub trait ModifiableDataContainer: DataContainer {
unsafe fn set_unchecked_value(&mut self, index: usize, value: Self::Item);
}
pub trait ResizeableDataContainer: DataContainer {
fn resize(&mut self, new_len: usize);
}
pub trait RawAccessDataContainer: DataContainer {
fn data(&self) -> Option<&[Self::Item]>;
}
pub trait MutableRawAccessDataContainer: RawAccessDataContainer {
fn data_mut(&mut self) -> Option<&mut [Self::Item]>;
}
pub unsafe trait StableRawAccessDataContainer: MutableRawAccessDataContainer {}
pub trait ContainerType {
type Type: ContainerTypeRepr + RowMajorArrayFromContainerType + ArrayFromContainerType;
fn type_as_str(&self) -> &'static str {
Self::Type::STR
}
}
pub trait ContainerTypeRepr {
const STR: &str;
}
pub trait ArrayFromContainerType {
type OutputImpl<Item, const NDIM: usize>: MutableArrayImpl<Item, NDIM>
+ RawAccessMut<Item = Item>
+ Stride<NDIM>
where
Item: Copy + Default;
fn new_arr<Item, const NDIM: usize>(
shape: [usize; NDIM],
) -> Array<Self::OutputImpl<Item, NDIM>, NDIM>
where
Item: Copy + Default;
}
pub trait RowMajorArrayFromContainerType {
type OutputImpl<Item, const NDIM: usize>: MutableArrayImpl<Item, NDIM>
+ RawAccessMut<Item = Item>
+ Stride<NDIM>
where
Item: Copy + Default;
fn new_row_major_arr<Item, const NDIM: usize>(
shape: [usize; NDIM],
) -> Array<Self::OutputImpl<Item, NDIM>, NDIM>
where
Item: Copy + Default;
}
pub trait ContainerTypeSelector<U: ContainerTypeRepr, V: ContainerTypeRepr> {
type Type: ContainerTypeRepr + ArrayFromContainerType + RowMajorArrayFromContainerType;
}