reach_core/memory/
macros.rs1#[macro_export]
5#[doc(hidden)]
6macro_rules! _immutable_cell {
7 (or: $field:tt, $inner:ty, $error:ident::$($error_variant:tt)::*) => {
8 immutable_cell!(only or: $field, $inner, $error);
9 immutable_cell!(set: $field, $inner, $error::$($error_variant)::*);
10 };
11
12 (only or: $field:tt, $inner:ty, $error:ty) => {
13 paste::paste! {
14 pub fn [<$field _or>](&self, error: $error) -> Result<&$inner, $error> {
15 self.$field.get_or(error)
16 }
17 }
18 };
19
20 (or_init: $field:tt, $inner:ty, $error:ident) => {
21 immutable_cell!(only or: $field, $inner, $error);
22
23 paste::paste! {
24 pub fn [<$field _or_init>]<F>(&self, f: F) -> &$inner
25 where
26 F: FnOnce() -> $inner,
27 {
28 self.$field.get_or_init(f)
29 }
30 }
31 };
32
33 (set: $field:tt, $inner:ty, $error:ident::$($error_variant:tt)::*) => {
34 paste::paste! {
35 pub fn [<set_ $field>](&self, value: $inner) -> Result<(), $error> {
36 self.$field.set(value).map_err(|_| $error::$($error_variant)::*)
37 }
38 }
39 };
40}
41
42#[doc(inline)]
43pub use _immutable_cell as immutable_cell;