Features to support indexmap
joshlf opened this issue · 0 comments
joshlf commented
Container transmutation (#114) + safe transmute
With container transmutation + safe transmute, we could support [Bucket<T>] -> Slice<T>
transmutation, e.g. used in this code:
#[repr(transparent)]
pub struct Slice<T> {
pub(crate) entries: [Bucket<T>],
}
// SAFETY: `Slice<T>` is a transparent wrapper around `[Bucket<T>]`,
// and reference lifetimes are bound together in function signatures.
#[allow(unsafe_code)]
impl<T> Slice<T> {
pub(super) const fn from_slice(entries: &[Bucket<T>]) -> &Self {
unsafe { &*(entries as *const [Bucket<T>] as *const Self) }
}
pub(super) fn from_boxed(entries: Box<[Bucket<T>]>) -> Box<Self> {
unsafe { Box::from_raw(Box::into_raw(entries) as *mut Self) }
}
fn into_boxed(self: Box<Self>) -> Box<[Bucket<T>]> {
unsafe { Box::from_raw(Box::into_raw(self) as *mut [Bucket<T>]) }
}
}