#![allow(clippy::missing_safety_doc)]
use core::hash::Hash;
use core::ops::RangeBounds;
use crate::{RefMutT, RefT};
pub unsafe trait EntwineCore {
type ElementCtor: ElementCtor;
type RangeMut<'a>: EntwineCore<ElementCtor = Self::ElementCtor>
where
Self: 'a;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn range_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Option<Self::RangeMut<'_>>;
fn split_at_mut(&mut self, mid: usize) -> (Self::RangeMut<'_>, Self::RangeMut<'_>);
fn reverse(&mut self);
unsafe fn get_unchecked(&self, idx: usize) -> RefT<'_, Self>;
unsafe fn get_unchecked_mut(&mut self, idx: usize) -> RefMutT<'_, Self>;
}
unsafe impl<'e, E> EntwineCore for &'e mut E
where
E: EntwineCore + ?Sized,
{
type ElementCtor = E::ElementCtor;
type RangeMut<'a>
where
Self: 'a,
= E::RangeMut<'a>;
fn len(&self) -> usize {
E::len(self)
}
fn range_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Option<Self::RangeMut<'_>> {
E::range_mut(self, range)
}
fn split_at_mut(&mut self, mid: usize) -> (Self::RangeMut<'_>, Self::RangeMut<'_>) {
E::split_at_mut(self, mid)
}
fn reverse(&mut self) {
E::reverse(self)
}
unsafe fn get_unchecked(&self, idx: usize) -> RefT<'_, Self> {
E::get_unchecked(self, idx)
}
unsafe fn get_unchecked_mut(&mut self, idx: usize) -> RefMutT<'_, Self> {
E::get_unchecked_mut(self, idx)
}
fn is_empty(&self) -> bool {
E::is_empty(self)
}
}
pub trait ElementCtor: Sized {
type Value: Value<Self>;
type Ref<'a>: Ref<'a, Self>
where
Self: 'a;
type RefMut<'a>: RefMut<'a, Self>
where
Self: 'a;
type Ptr: Ptr<Self>;
type PtrMut: PtrMut<Self>;
}
pub unsafe trait Value<T: ElementCtor> {
fn is_zero_sized() -> bool;
fn as_ref(&self) -> T::Ref<'_>;
fn as_mut(&mut self) -> T::RefMut<'_>;
}
pub unsafe trait Ref<'a, T: ElementCtor>: Clone {
fn reborrow<'r>(self) -> T::Ref<'r>
where
'a: 'r;
fn to_ptr(&self) -> T::Ptr;
}
pub unsafe trait RefMut<'a, T: ElementCtor> {
fn reborrow_mut<'r>(self) -> T::RefMut<'r>
where
'a: 'r;
fn to_ref(&self) -> T::Ref<'_>;
fn to_mut_ptr(&mut self) -> T::PtrMut;
}
pub unsafe trait Ptr<T: ElementCtor>: Eq + Hash + Clone {
unsafe fn deref<'r>(&self) -> T::Ref<'r>;
fn null() -> Self;
unsafe fn add(&self, count: usize) -> Self;
unsafe fn offset(&self, count: isize) -> Self;
fn width(l: &Self, r: &Self) -> usize;
unsafe fn read(src: &Self) -> T::Value;
}
pub unsafe trait PtrMut<T: ElementCtor>: Eq + Hash + Clone {
unsafe fn deref_mut<'r>(&self) -> T::RefMut<'r>;
unsafe fn to_const(&self) -> T::Ptr;
fn null_mut() -> Self;
unsafe fn add(&self, count: usize) -> Self;
unsafe fn offset(&self, count: isize) -> Self;
fn width(l: &Self, r: &Self) -> usize;
unsafe fn write(dst: &Self, src: T::Value);
unsafe fn copy_nonoverlapping(src: &T::Ptr, dst: &Self, n: usize);
unsafe fn swap(a: &Self, b: &Self);
}