Trait bytemuck::TransparentWrapper [−][src]
pub unsafe trait TransparentWrapper<Inner: ?Sized> { fn wrap(s: Inner) -> Self
where
Self: Sized,
Inner: Sized, { ... } fn wrap_ref(s: &Inner) -> &Self { ... } fn wrap_mut(s: &mut Inner) -> &mut Self { ... } fn wrap_slice(s: &[Inner]) -> &[Self]
where
Self: Sized,
Inner: Sized, { ... } fn wrap_slice_mut(s: &mut [Inner]) -> &mut [Self]
where
Self: Sized,
Inner: Sized, { ... } fn peel(s: Self) -> Inner
where
Self: Sized,
Inner: Sized, { ... } fn peel_ref(s: &Self) -> &Inner { ... } fn peel_mut(s: &mut Self) -> &mut Inner { ... } fn peel_slice(s: &[Self]) -> &[Inner]
where
Self: Sized,
Inner: Sized, { ... } fn peel_slice_mut(s: &mut [Self]) -> &mut [Inner]
where
Self: Sized,
Inner: Sized, { ... } }
Expand description
A trait which indicates that a type is a #[repr(transparent)] wrapper
around the Inner value.
This allows safely copy transmuting between the Inner type and the
TransparentWrapper type. Functions like wrap_{} convert from the inner
type to the wrapper type and peel_{} functions do the inverse conversion
from the wrapper type to the inner type. We deliberately do not call the
wrapper-removing methods “unwrap” because at this point that word is too
strongly tied to the Option/ Result methods.
Safety
The safety contract of TransparentWrapper is relatively simple:
For a given Wrapper which implements TransparentWrapper<Inner>:
-
Wrappermust be a wrapper aroundInnerwith an identical data representations. This either means that it must be a#[repr(transparent)]struct which contains a either a field of typeInner(or a field of some other transparent wrapper forInner) as the only non-ZST field. -
Any fields other than the
Innerfield must be trivially constructable ZSTs, for examplePhantomData,PhantomPinned, etc. -
The
Wrappermay not impose additional alignment requirements overInner.- Note: this is currently guaranteed by
repr(transparent), but there have been discussions of lifting it, so it’s stated here explicitly.
- Note: this is currently guaranteed by
-
All functions on
TransparentWrappermay not be overridden.
Caveats
If the wrapper imposes additional constraints upon the inner type which are
required for safety, it’s responsible for ensuring those still hold – this
generally requires preventing access to instances of the inner type, as
implementing TransparentWrapper<U> for T means anybody can call
T::cast_ref(any_instance_of_u).
For example, it would be invalid to implement TransparentWrapper for str
to implement TransparentWrapper around [u8] because of this.
Examples
Basic
use bytemuck::TransparentWrapper; #[repr(transparent)] struct MyWrapper(SomeStruct); unsafe impl TransparentWrapper<SomeStruct> for MyWrapper {} // interpret a reference to &SomeStruct as a &MyWrapper let thing = SomeStruct::default(); let inner_ref: &MyWrapper = MyWrapper::wrap_ref(&thing); // Works with &mut too. let mut mut_thing = SomeStruct::default(); let inner_mut: &mut MyWrapper = MyWrapper::wrap_mut(&mut mut_thing);
Use with dynamically sized types
use bytemuck::TransparentWrapper; #[repr(transparent)] struct Slice<T>([T]); unsafe impl<T> TransparentWrapper<[T]> for Slice<T> {} let s = Slice::wrap_ref(&[1u32, 2, 3]); assert_eq!(&s.0, &[1, 2, 3]); let mut buf = [1, 2, 3u8]; let sm = Slice::wrap_mut(&mut buf);
Provided methods
Convert the inner type into the wrapper type.
Convert a reference to the inner type into a reference to the wrapper type.
Convert a mutable reference to the inner type into a mutable reference to the wrapper type.
fn wrap_slice(s: &[Inner]) -> &[Self] where
Self: Sized,
Inner: Sized,
[src]
fn wrap_slice(s: &[Inner]) -> &[Self] where
Self: Sized,
Inner: Sized,
[src]Convert a slice to the inner type into a slice to the wrapper type.
fn wrap_slice_mut(s: &mut [Inner]) -> &mut [Self] where
Self: Sized,
Inner: Sized,
[src]
fn wrap_slice_mut(s: &mut [Inner]) -> &mut [Self] where
Self: Sized,
Inner: Sized,
[src]Convert a mutable slice to the inner type into a mutable slice to the wrapper type.
Convert the wrapper type into the inner type.
Convert a reference to the wrapper type into a reference to the inner type.
Convert a mutable reference to the wrapper type into a mutable reference to the inner type.
fn peel_slice(s: &[Self]) -> &[Inner] where
Self: Sized,
Inner: Sized,
[src]
fn peel_slice(s: &[Self]) -> &[Inner] where
Self: Sized,
Inner: Sized,
[src]Convert a slice to the wrapped type into a slice to the inner type.
fn peel_slice_mut(s: &mut [Self]) -> &mut [Inner] where
Self: Sized,
Inner: Sized,
[src]
fn peel_slice_mut(s: &mut [Self]) -> &mut [Inner] where
Self: Sized,
Inner: Sized,
[src]Convert a mutable slice to the wrapped type into a mutable slice to the inner type.