-
Notifications
You must be signed in to change notification settings - Fork 142
Open
Description
This is one possible avenue for supporting #114.
A draft implementation is in #1736.
Most container transmutations require three components:
Src: FromBytes + IntoBytes + ImmutableandDst: FromBytes + IntoBytes + Immutablesize_of::<Src>() == size_of::<Dst>()andalign_of::<Src>() == align_of::<Dst>()- Some way of invoking the right
into_rawandfrom_rawassociated functions on the container type
Currently, macros like transmute_ref! have the ability to enforce conditions (1) and (2). It should be possible in principle to support condition (3) using a trait:
#[doc(hidden)]
pub unsafe trait Container {
type Element;
type Raw;
fn into_raw(self) -> Self::Raw;
unsafe fn from_raw(Self::Raw) -> Self;
}The associated Raw type is needed because not all containers use the same raw representations. For example, Arc uses *const T while Vec uses (*mut T, usize, usize).
A few open questions:
- In order to perform the size and alignment checks, we need Rust to be able to infer the types of certain variables. This is easy with
transmute_ref!, but how would we do it when those types are inside containers? Off the top of my head, I think it should be possible via a function likefn unwrap<C: Container>(c: C) -> C::Element. - Can we relax the trait bounds only in certain cases? E.g.,
Arconly requiresSrc: IntoBytes + ImmutableandDst: FromBytes + Immutable, but does not requireSrc: FromBytesorDst: IntoBytes
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels