#cache #proc-macro #struct-fields #field

macro struct_cache_field

Proc macro for caching method to struct field

2 releases

0.0.2 Aug 19, 2024
0.0.1 Aug 4, 2024

#2051 in Rust patterns

MIT/Apache

16KB
319 lines

struct_cache_field

struct_cache_field crate provides macros that cache method results to struct fields.

Licence

MIT or Apache-2.0.

COPYRIGHT


lib.rs:

struct_cache_field

struct_cache_field provides procedual macros to declare/manage cache fields for methods.

Usage

#[struct_cache_field::impl_cached_method]
impl Hoge {
    pub fn two_times_x(&self) -> u64 {
        2 * self.x
    }

    fn x_plus_1(&mut self) -> u64 {
        self.x = self.x + 1;
        self.x
    }
}

#[struct_cache_field::add_cache_field]
struct Hoge {
    x: u64,
}

fn main() {
    let mut hoge = Hoge {
        x: 1,
        __cache_fields__: Default::default(),
    };

    assert_eq!(hoge.two_times_x(), &2);
    assert_eq!(hoge.two_times_x(), &2);
    hoge.x = 2;
    assert_eq!(hoge.two_times_x(), &2);

    assert_eq!(hoge.x_plus_1(), &3);
    assert_eq!(hoge.x_plus_1(), &3);
    hoge.x = 3;
    assert_eq!(hoge.x_plus_1(), &3);
}

#[impl_cached_method] generates a struct to hold caches for methods.

struct __struct_cache_field__HogeCacheFields {
    two_times_x: ::core::cell::OnceCell<u64>,
    x_plus_1: ::core::cell::OnceCell<u64>,
}

#[add_cache_field] adds it to the original struct definition.

struct Hoge {
    x: u64,
    __cache_fields__: __struct_cache_field__HogeCacheFields,
}

Note that currently procedural macro in expression position is currently not supported. So, you need to initialize __cache_fields__ with Default::default() by yourself.

You MUST use both #[impl_cached_method] and #[add_cache_field] together. If you use only #[impl_cached_method], it can cause a compile error in other crates. Because this crate uses type-name-keyed compile time storage. In the above example, #[impl_cached_method] registeres data with key "Hoge", and #[add_cache_field] consumes it.

Dependencies

~1.5–8.5MB
~84K SLoC