Crates.io | pages |
lib.rs | pages |
version | 0.2.0 |
source | src |
created_at | 2021-08-13 10:23:57.247361 |
updated_at | 2021-08-14 14:51:15.173853 |
description | A dynamically-sized heap-backed data page. Comprises a user-chosen header and data array packed into a single allocation. |
homepage | https://github.com/irrustible/pages |
repository | https://github.com/irrustible/pages |
max_upload_size | |
id | 435649 |
size | 29,270 |
A dynamically-sized heap-backed data page. Comprises a user-chosen header and data array packed into a single allocation.
use pages::Page;
// 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
let item: *mut usize = self.0.data_mut()[0].as_mut_ptr();
unsafe { item.write(value); }
}
fn get(&mut self) -> Option<usize> {
if !(*self.0.header()) { return None; }
let item: *mut usize = self.0.data_mut()[0].as_mut_ptr();
*self.0.header_mut() = false; // free
Some(unsafe { *item })
}
}
fn main() {
let mut maybe = Maybe::new();
assert_eq!(maybe.get(), None);
maybe.put(42);
assert_eq!(maybe.get(), Some(42));
}
Copyright (c) 2021 James Laver, pages contributors.
Licensed under Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0), with LLVM Exceptions (https://spdx.org/licenses/LLVM-exception.html).
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.