use crate::{Array, ConstInit, Deref, DerefMut, MaybeUninit, MemPod};
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/dst")]
pub unsafe trait DstBuf {
type Inner: MemPod;
fn as_ref(&self) -> &[MaybeUninit<Self::Inner>];
fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>];
fn extend(&mut self, len: usize) -> Result<(), ()>;
fn round_to_words(bytes: usize) -> usize {
super::round_to_words::<Self::Inner>(bytes)
}
}
#[rustfmt::skip]
unsafe impl<T, U> DstBuf for &mut T where U: MemPod, T: DstBuf<Inner = U> {
type Inner = T::Inner;
fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
(**self).as_ref()
}
fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
(**self).as_mut()
}
fn extend(&mut self, len: usize) -> Result<(), ()> {
(**self).extend(len)
}
}
unsafe impl<T: MemPod, const CAP: usize> DstBuf for [MaybeUninit<T>; CAP] {
type Inner = T;
fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
self
}
fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
self
}
fn extend(&mut self, len: usize) -> Result<(), ()> {
if len > CAP { Err(()) } else { Ok(()) }
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
unsafe impl<T: MemPod> DstBuf for crate::Vec<MaybeUninit<T>> {
type Inner = T;
fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
self
}
fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
self
}
fn extend(&mut self, len: usize) -> Result<(), ()> {
if len > self.len() {
self.resize(len, MaybeUninit::uninit());
let cap = self.capacity();
self.resize(cap, MaybeUninit::uninit());
}
Ok(())
}
}
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/dst")]
#[derive(Debug)]
pub struct DstArray<T, const CAP: usize> {
inner: Array<MaybeUninit<T>, CAP>,
}
impl<T, const CAP: usize> Deref for DstArray<T, CAP> {
type Target = Array<MaybeUninit<T>, CAP>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<T, const CAP: usize> DerefMut for DstArray<T, CAP> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<T: MemPod, const CAP: usize> Default for DstArray<T, CAP> {
fn default() -> Self {
Self { inner: Array::new([MaybeUninit::uninit(); CAP]) }
}
}
impl<T: MemPod, const CAP: usize> ConstInit for DstArray<T, CAP> {
const INIT: Self = Self {
inner: Array::new_bare([MaybeUninit::uninit(); CAP]),
};
}
#[rustfmt::skip]
unsafe impl<T: MemPod, const CAP: usize> DstBuf for DstArray<T, CAP> {
type Inner = T;
fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
&self.inner
}
fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
&mut self.inner
}
fn extend(&mut self, len: usize) -> Result<(), ()> {
if len > CAP { Err(()) } else { Ok(()) }
}
}
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/dst")]
pub type DstArrayUsize<const CAP: usize> = DstArray<usize, CAP>;
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/dst")]
#[cfg(feature = "alloc")]
#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
pub type DstVecUsize = crate::Vec<MaybeUninit<usize>>;