pub struct PageRef<H, T> { /* private fields */ }
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§
Source§impl<H, T> PageRef<H, T>
impl<H, T> PageRef<H, T>
Sourcepub unsafe fn header_mut(&mut self) -> &mut H
pub unsafe fn header_mut(&mut self) -> &mut H
Sourcepub unsafe fn data(self) -> *mut MaybeUninit<T>
pub unsafe fn data(self) -> *mut MaybeUninit<T>
Access to the start of the data array for this page as a mut pointer.
§Safety
You must synchronise all reads and writes.
Sourcepub unsafe fn layout(self) -> PageLayout<H, T>
pub unsafe fn layout(self) -> PageLayout<H, T>
Returns this page’s layout information as a PageLayout
.
§Safety
You must synchronise all reads and writes.
Sourcepub unsafe fn from_uninit(
raw_ptr: *mut u8,
header: H,
layout: PageLayout<H, T>,
) -> Self
pub unsafe fn from_uninit( raw_ptr: *mut u8, header: H, layout: PageLayout<H, T>, ) -> Self
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
.