Struct pages::PageRef [−][src]
#[repr(transparent)]pub struct PageRef<H, T> { /* fields omitted */ }
Expand description
A mutable pointer to a dynamically-sized heap-backed data page
comprising a user-chosen header and data array packed into a
single allocation. The internal representation is a NonNull
.
Example
use pages::Page; use core::mem::MaybeUninit; // A really crappy replacement for Box<Option<usize>> struct Maybe(Page::<bool, usize>); impl Maybe { fn new() -> Self { Maybe(Page::new(false, 1)) } fn put(&mut self, value: usize) { *self.0.header_mut() = true; // occupied unsafe { self.0.data().write(MaybeUninit::new(value)) }; } fn get(&mut self) -> Option<usize> { if !(*self.0.header()) { return None; } *self.0.header_mut() = false; // free Some(unsafe { self.0.data().read().assume_init() }) } } let mut maybe = Maybe::new(); assert_eq!(maybe.get(), None); maybe.put(42); assert_eq!(maybe.get(), Some(42));
Notes
Data is exposed as a MaybeUninit
pointer for maximum flexibility.
Unfortunately this means we’re unable to automatically drop the data
for you in our destructor. You could cause a memory leak if you don’t.
Implementations
Access to the start of the data array for this page as a mut pointer.
Safety
You must synchronise all reads and writes.
Returns this page’s layout information as a PageLayout
.
Safety
You must synchronise all reads and writes.
Creates a new PageRef
from a pointer to uninitialised memory, a header and
a PageLayout
.
Safety
The pointer must have been allocated according to the provided PageLayout
.
Trait Implementations
Auto Trait Implementations
impl<H, T> RefUnwindSafe for PageRef<H, T> where
H: RefUnwindSafe,
T: RefUnwindSafe,
impl<H, T> UnwindSafe for PageRef<H, T> where
H: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more