pages/lib.rs
1//! An owned, heap-backed, dynamically-sized data page comprising a user-chosen
2//! header and data array packed into a single allocation. It is an owned object and
3//! the internal representation is a [`NonNull`].
4//!
5//! ## Example
6//!
7//! ```
8//! use pages::Page;
9//! use core::mem::MaybeUninit;
10//! // A really crappy replacement for Box<Option<usize>>
11//! struct Maybe(Page::<bool, usize>);
12//! impl Maybe {
13//! fn new() -> Self { Maybe(Page::new(false, 1)) }
14//! fn put(&mut self, value: usize) {
15//! *self.0.header_mut() = true; // occupied
16//! unsafe { self.0.data().write(MaybeUninit::new(value)) };
17//! }
18//! fn get(&mut self) -> Option<usize> {
19//! if !(*self.0.header()) { return None; }
20//! *self.0.header_mut() = false; // free
21//! Some(unsafe { self.0.data().read().assume_init() })
22//! }
23//! }
24//!
25//! let mut maybe = Maybe::new();
26//! assert_eq!(maybe.get(), None);
27//! maybe.put(42);
28//! assert_eq!(maybe.get(), Some(42));
29//! ```
30#![no_std]
31extern crate alloc;
32
33mod layout;
34pub use layout::PageLayout;
35
36mod page;
37pub use page::*;
38
39mod page_ref;
40pub use page_ref::*;