#![cfg(feature = "unsafe_alloc")]
use super::StableLayout;
use alloc::vec::Vec;
use core::{
fmt::Debug,
ops::{Deref, DerefMut},
slice,
};
#[repr(C)]
pub struct StableVec<T>
where
T: StableLayout,
{
ptr: *mut T,
len: usize,
cap: usize,
}
unsafe impl<T: StableLayout> StableLayout for StableVec<T> {}
impl<T> Deref for StableVec<T>
where
T: StableLayout,
{
type Target = [T];
#[inline(always)]
fn deref(&self) -> &[T] {
unsafe { slice::from_raw_parts(self.ptr, self.len) }
}
}
impl<T> DerefMut for StableVec<T>
where
T: StableLayout,
{
#[inline(always)]
fn deref_mut(&mut self) -> &mut [T] {
unsafe { slice::from_raw_parts_mut(self.ptr, self.len) }
}
}
impl<T: Debug> Debug for StableVec<T>
where
T: StableLayout,
{
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
Debug::fmt(self.deref(), f)
}
}
impl<T> From<Vec<T>> for StableVec<T>
where
T: StableLayout,
{
fn from(vec: Vec<T>) -> Self {
let mut md_vec = core::mem::ManuallyDrop::new(vec);
let cap = md_vec.capacity();
let len = md_vec.len();
let ptr = md_vec.as_mut_ptr();
Self { ptr, len, cap }
}
}
impl<T> From<StableVec<T>> for Vec<T>
where
T: StableLayout,
{
fn from(sv: StableVec<T>) -> Self {
unsafe { Vec::from_raw_parts(sv.ptr, sv.len, sv.cap) }
}
}
impl<T> Default for StableVec<T>
where
T: StableLayout,
{
#[inline(always)]
fn default() -> Self {
Self::from(Vec::default())
}
}