Crates.io | arc-ext |
lib.rs | arc-ext |
version | 0.1.0 |
source | src |
created_at | 2022-10-20 15:04:29.585404 |
updated_at | 2022-10-20 15:04:29.585404 |
description | Extensions for Arc |
homepage | |
repository | https://github.com/bbqsrc/arc-ext |
max_upload_size | |
id | 692513 |
size | 20,476 |
Extensions for Arc<T>
such as field projection.
The ArcExt
trait implementation extends Arc<T>
with .project
and .project_option
methods.
The projection enforces lifetimes, so that no reference to it can outlive the projection (and therefore is not unsound).
See the following example:
use arc_ext::ArcExt;
#[derive(Debug, PartialEq, Eq)]
struct Top {
nested: Nested,
string: String,
}
#[derive(Debug, PartialEq, Eq)]
struct Nested {
a: u32,
b: Box<[u8]>,
c: Option<Arc<Top>>,
}
fn test() {
let top = Arc::new(Top {
nested: Nested {
a: 32,
b: vec![1, 2, 3, 4].into_boxed_slice(),
c: Some(Arc::new(Top {
nested: Nested {
a: 12,
b: vec![99].into_boxed_slice(),
c: None,
},
string: "nested".to_string(),
})),
},
string: "owned str".to_string(),
});
let project = top.clone().project(|x| &x.nested.b);
assert_eq!(&[1, 2, 3, 4], &**project);
drop(project);
let project = top.clone().project_option(|x| x.nested.c.as_ref());
let opt = project.as_option().unwrap();
assert_eq!(top.nested.c.as_ref().unwrap(), opt);
}
This project is licensed under either of
at your option.