Trait wnf::NoUninit

source ·
pub unsafe trait NoUninit { }
Expand description

A marker trait for types without uninitialized (padding) bytes

This is modelled after the NoUninit trait of the bytemuck crate.

In order for writing a value of a type T to a WNF state to be sound, T is required to implement NoUninit.

§Implementation

This trait is already implemented by the wnf crate for many primitive types and types from the standard library. There are several ways to implement it for your own types:

use wnf::{derive_from_bytemuck_v1, OwnedState};

#[derive(bytemuck::NoUninit, bytemuck::AnyBitPattern, Copy, Clone)]
#[repr(transparent)]
struct MyType(u32);

derive_from_bytemuck_v1!(NoUninit for MyType);
derive_from_bytemuck_v1!(AnyBitPattern for MyType);

let state: OwnedState<MyType> = OwnedState::create_temporary()?;
state.set(&MyType(42))?;
let data = state.get()?;

assert_eq!(data.0, 42);
use wnf::{derive_from_zerocopy, OwnedState};

#[derive(zerocopy::FromBytes, zerocopy::FromZeroes, zerocopy::AsBytes, Copy, Clone)]
#[repr(transparent)]
struct MyType(u32);

derive_from_zerocopy!(NoUninit for MyType);
derive_from_zerocopy!(AnyBitPattern for MyType);

let state: OwnedState<MyType> = OwnedState::create_temporary()?;
state.set(&MyType(42))?;
let data = state.get()?;

assert_eq!(data.0, 42);

§Safety

Implementing this trait for a type T is sound if the memory representation of any T contains no uninitialized (i.e. padding) bytes.

Implementations on Foreign Types§

source§

impl NoUninit for Option<NonZeroI8>

source§

impl NoUninit for Option<NonZeroI16>

source§

impl NoUninit for Option<NonZeroI32>

source§

impl NoUninit for Option<NonZeroI64>

source§

impl NoUninit for Option<NonZeroI128>

source§

impl NoUninit for Option<NonZeroIsize>

source§

impl NoUninit for Option<NonZeroU8>

source§

impl NoUninit for Option<NonZeroU16>

source§

impl NoUninit for Option<NonZeroU32>

source§

impl NoUninit for Option<NonZeroU64>

source§

impl NoUninit for Option<NonZeroU128>

source§

impl NoUninit for Option<NonZeroUsize>

source§

impl NoUninit for bool

source§

impl NoUninit for char

source§

impl NoUninit for f32

source§

impl NoUninit for f64

source§

impl NoUninit for i8

source§

impl NoUninit for i16

source§

impl NoUninit for i32

source§

impl NoUninit for i64

source§

impl NoUninit for i128

source§

impl NoUninit for isize

source§

impl NoUninit for u8

source§

impl NoUninit for u16

source§

impl NoUninit for u32

source§

impl NoUninit for u64

source§

impl NoUninit for u128

source§

impl NoUninit for ()

source§

impl NoUninit for usize

source§

impl NoUninit for PhantomPinned

source§

impl NoUninit for NonZeroI8

source§

impl NoUninit for NonZeroI16

source§

impl NoUninit for NonZeroI32

source§

impl NoUninit for NonZeroI64

source§

impl NoUninit for NonZeroI128

source§

impl NoUninit for NonZeroIsize

source§

impl NoUninit for NonZeroU8

source§

impl NoUninit for NonZeroU16

source§

impl NoUninit for NonZeroU32

source§

impl NoUninit for NonZeroU64

source§

impl NoUninit for NonZeroU128

source§

impl NoUninit for NonZeroUsize

source§

impl<T> NoUninit for [T]
where T: NoUninit,

source§

impl<T> NoUninit for PhantomData<T>
where T: ?Sized,

source§

impl<T> NoUninit for ManuallyDrop<T>
where T: NoUninit + ?Sized,

source§

impl<T> NoUninit for Wrapping<T>
where T: NoUninit,

source§

impl<T, const N: usize> NoUninit for [T; N]
where T: NoUninit,

Implementors§