/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#![allow(unsafe_code)]
use std::mem::ManuallyDrop; use std::ops::Deref; use std::ptr;
/// An unsafe box, derefs to `T`. pub(super) struct UnsafeBox<T> {
inner: ManuallyDrop<Box<T>>,
}
/// Creates a new box from a pointer. /// /// # Safety /// /// The input should point to a valid `T`. pub(super) unsafefn from_raw(ptr: *mut T) -> Self { Self {
inner: ManuallyDrop::new(Box::from_raw(ptr)),
}
}
/// Creates a new unsafe box from an existing one. /// /// # Safety /// /// There is no refcounting or whatever else in an unsafe box, so this /// operation can lead to double frees. pub(super) unsafefn clone(this: &Self) -> Self { Self {
inner: ptr::read(&this.inner),
}
}
/// Returns a mutable reference to the inner value of this unsafe box. /// /// # Safety /// /// Given `Self::clone`, nothing prevents anyone from creating /// multiple mutable references to the inner value, which is completely UB. pub(crate) unsafefn deref_mut(this: &mutSelf) -> &mut T {
&mut this.inner
}
/// Drops the inner value of this unsafe box. /// /// # Safety /// /// Given this doesn't consume the unsafe box itself, this has the same /// safety caveats as `ManuallyDrop::drop`. pub(super) unsafefn drop(this: &mutSelf) {
ManuallyDrop::drop(&mut this.inner)
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.