Struct Assume
pub struct Assume { pub alignment: bool, pub lifetimes: bool, pub safety: bool, pub validity: bool }
Configurable proof assumptions of TransmuteFrom.
When false, the respective proof obligation belongs to the compiler. When
true, the onus of the safety proof belongs to the programmer.
Fields
alignment: boolWhen
false,TransmuteFromis not implemented for transmutations that might violate the alignment requirements of references; e.g.:#![feature(transmutability)] use core::mem::TransmuteFrom; assert_eq!(align_of::<[u8; 2]>(), 1); assert_eq!(align_of::<u16>(), 2); let src: &[u8; 2] = &[0xFF, 0xFF]; // SAFETY: No safety obligations. let dst: &u16 = unsafe { <_ as TransmuteFrom<_>>::transmute(src) };When
true,TransmuteFromassumes that you have ensured that references in the transmuted value satisfy the alignment requirements of their referent types; e.g.:use ; let src: & = &; let maybe_dst: = if <*const _>is_aligned_to else ; assert!;lifetimes: boolWhen
false,TransmuteFromis not implemented for transmutations that extend the lifetimes of references.When
true,TransmuteFromassumes that you have ensured that references in the transmuted value do not outlive their referents.safety: boolWhen
false,TransmuteFromis not implemented for transmutations that might violate the library safety invariants of the destination type; e.g.:#![feature(transmutability)] use core::mem::TransmuteFrom; let src: u8 = 3; struct EvenU8 { // SAFETY: `val` must be an even number. val: u8, } // SAFETY: No safety obligations. let dst: EvenU8 = unsafe { <_ as TransmuteFrom<_>>::transmute(src) };When
true,TransmuteFromassumes that you have ensured that undefined behavior does not arise from using the transmuted value; e.g.:use ; let src: u8 = 42; let maybe_dst: = if src % 2 == 0 else ; assert!;validity: boolWhen
false,TransmuteFromis not implemented for transmutations that might violate the language-level bit-validity invariant of the destination type; e.g.:#![feature(transmutability)] use core::mem::TransmuteFrom; let src: u8 = 3; // SAFETY: No safety obligations. let dst: bool = unsafe { <_ as TransmuteFrom<_>>::transmute(src) };When
true,TransmuteFromassumes that you have ensured that the value being transmuted is a bit-valid instance of the transmuted value; e.g.:use ; let src: u8 = 1; let maybe_dst: = if src == 0 || src == 1 else ; assert_eq!;
Implementations
impl Assume
const NOTHING: Self = _;With this,
TransmuteFromdoes not assume you have ensured any safety obligations are met, and relies only upon its own analysis to (dis)prove transmutability.const ALIGNMENT: Self = _;With this,
TransmuteFromassumes only that you have ensured that references in the transmuted value satisfy the alignment requirements of their referent types. SeeAssume::alignmentfor examples.const LIFETIMES: Self = _;With this,
TransmuteFromassumes only that you have ensured that references in the transmuted value do not outlive their referents. SeeAssume::lifetimesfor examples.const SAFETY: Self = _;With this,
TransmuteFromassumes only that you have ensured that undefined behavior does not arise from using the transmuted value. SeeAssume::safetyfor examples.const VALIDITY: Self = _;With this,
TransmuteFromassumes only that you have ensured that the value being transmuted is a bit-valid instance of the transmuted value. SeeAssume::validityfor examples.const fn and(self, other_assumptions: Self) -> SelfCombine the assumptions of
selfandother_assumptions.This is especially useful for extending
Assumein generic contexts; e.g.:use ; /// Attempts to transmute `src` to `&Dst`. /// /// Returns `None` if `src` violates the alignment requirements of `&Dst`. /// /// # Safety /// /// The caller guarantees that the obligations required by `ASSUME`, except /// alignment, are satisfied. unsafe let src: & = &; // SAFETY: No safety obligations. let maybe_dst: = unsafe > };const fn but_not(self, other_assumptions: Self) -> SelfRemove
other_assumptionsthe obligations ofself; e.g.:use Assume; let assumptions = ALIGNMENT.and; let to_be_removed = SAFETY.and; assert_eq!;
Trait Implementations
impl Add for Assume
type Output = Assume;fn add(self, other_assumptions: Assume) -> Assume
impl Clone for Assume
fn clone(&self) -> Self
impl ConstParamTy_ for Assume
impl Copy for Assume
impl Debug for Assume
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl Eq for Assume
fn assert_fields_are_eq(&self)
impl PartialEq for Assume
fn eq(&self, other: &Self) -> bool
impl StructuralPartialEq for Assume
impl Sub for Assume
type Output = Assume;fn sub(self, other_assumptions: Assume) -> Assume
impl TrivialClone for Assume
Auto Trait Implementations
impl Freeze for Assume
impl RefUnwindSafe for Assume
impl Send for Assume
impl Sync for Assume
impl Unpin for Assume
impl UnsafeUnpin for Assume
impl UnwindSafe for Assume
Blanket Implementations
impl<T> Any for Assume
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Assume
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Assume
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Assume
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for Assume
fn from(t: T) -> TReturns the argument unchanged.
impl<T> Printable for Assume
where
T: Copy + Debug,
impl<T> SizeHint for Assume
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for Assume
impl<T, U> Into<U> for Assume
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for Assume
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for Assume
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>