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::*;