Source code

Revision control

Copy as Markdown

Other Tools

use crate::{Pod, Zeroable};↩
/// Marker trait for "plain old data" types that are valid for any bit pattern.↩
///↩
/// The requirements for this is very similar to [`Pod`], except that the type↩
/// can allow uninit (or padding) bytes. This limits what you can do with a type↩
/// of this kind, but also broadens the included types to `repr(C)` `struct`s↩
/// that contain padding as well as `union`s. Notably, you can only cast↩
/// *immutable* references and *owned* values into [`AnyBitPattern`] types, not↩
/// *mutable* references.↩
///↩
/// [`Pod`] is a subset of [`AnyBitPattern`], meaning that any `T: Pod` is also↩
/// [`AnyBitPattern`] but any `T: AnyBitPattern` is not necessarily [`Pod`].↩
///↩
/// [`AnyBitPattern`] is a subset of [`Zeroable`], meaning that any `T:↩
/// AnyBitPattern` is also [`Zeroable`], but any `T: Zeroable` is not↩
/// necessarily [`AnyBitPattern`]↩
///↩
/// # Derive↩
///↩
/// A `#[derive(AnyBitPattern)]` macro is provided under the `derive` feature↩
/// flag which will automatically validate the requirements of this trait and↩
/// implement the trait for you for both structs and enums. This is the↩
/// recommended method for implementing the trait, however it's also possible to↩
/// do manually. If you implement it manually, you *must* carefully follow the↩
/// below safety rules.↩
///↩
/// * *NOTE: even `C-style`, fieldless enums are intentionally **excluded** from↩
/// this trait, since it is **unsound** for an enum to have a discriminant↩
/// value that is not one of its defined variants.↩
///↩
/// # Safety↩
///↩
/// Similar to [`Pod`] except we disregard the rule about it must not contain↩
/// uninit bytes. Still, this is a quite strong guarantee about a type, so *be↩
/// careful* when implementing it manually.↩
///↩
/// * The type must be inhabited (eg: no↩
/// [Infallible](core::convert::Infallible)).↩
/// * The type must be valid for any bit pattern of its backing memory.↩
/// * Structs need to have all fields also be `AnyBitPattern`.↩
/// * It is disallowed for types to contain pointer types, `Cell`, `UnsafeCell`,↩
/// atomics, and any other forms of interior mutability.↩
/// * More precisely: A shared reference to the type must allow reads, and↩
/// *only* reads. RustBelt's separation logic is based on the notion that a↩
/// type is allowed to define a sharing predicate, its own invariant that must↩
/// hold for shared references, and this predicate is the reasoning that allow↩
/// it to deal with atomic and cells etc. We require the sharing predicate to↩
/// be trivial and permit only read-only access.↩
/// * There's probably more, don't mess it up (I mean it).↩
pub unsafe trait AnyBitPattern:↩
Zeroable + Sized + Copy + 'static↩
{↩
}↩
unsafe impl<T: Pod> AnyBitPattern for T {}↩
#[cfg(feature = "zeroable_maybe_uninit")]↩
#[cfg_attr(↩
feature = "nightly_docs",↩
doc(cfg(feature = "zeroable_maybe_uninit"))↩
)]↩
unsafe impl<T> AnyBitPattern for core::mem::MaybeUninit<T> where T: AnyBitPattern
{}↩