1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//! An owned, heap-backed, dynamically-sized data page comprising a user-chosen
//! header and data array packed into a single allocation. It is an owned object and
//! 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));
//! ```
#![no_std]
extern crate alloc;

mod layout;
pub use layout::PageLayout;

mod page;
pub use page::*;

mod page_ref;
pub use page_ref::*;