Skip to content

Commit 40fcf58

Browse files
committed
Extracts cache and call stack logic into separate modules for better code organization and reusability.
Removes unused feature `vec_peek_mut` to streamline dependencies.
1 parent 38a1987 commit 40fcf58

File tree

6 files changed

+62
-47
lines changed

6 files changed

+62
-47
lines changed

cache/src/cache.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use lru::LruCache;
2+
use std::{any::Any, num::NonZeroUsize, rc::Rc};
3+
4+
use crate::OperatorFunc;
5+
6+
const CACHE_CAP: usize = 128;
7+
8+
static mut CACHE: Option<LruCache<OperatorFunc, Rc<dyn Any>>> = None;
9+
10+
fn cache() -> &'static mut LruCache<OperatorFunc, Rc<dyn Any>> {
11+
#[allow(static_mut_refs)]
12+
unsafe {
13+
CACHE.get_or_insert_with(|| LruCache::new(NonZeroUsize::new(CACHE_CAP).unwrap()))
14+
}
15+
}
16+
17+
pub fn touch<T: 'static>(key: OperatorFunc) -> Option<Rc<T>> {
18+
cache()
19+
.get(&key)
20+
.map(Rc::clone)
21+
.filter(|rc| rc.is::<T>())
22+
.map(|rc| unsafe { Rc::from_raw(Rc::into_raw(rc) as *const T) })
23+
}
24+
25+
pub fn store_in_cache<T: 'static>(key: OperatorFunc, val: T) -> Rc<T> {
26+
let rc = Rc::new(val);
27+
cache().put(key, Rc::clone(&rc) as _);
28+
rc
29+
}
30+
31+
pub fn remove_from_cache(key: OperatorFunc) {
32+
cache().pop(&key);
33+
}

cache/src/call_stack.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use crate::OperatorFunc;
2+
3+
static mut CALL_STACK: Option<Vec<OperatorFunc>> = None;
4+
5+
fn call_stack() -> &'static mut Vec<OperatorFunc> {
6+
#[allow(static_mut_refs)]
7+
unsafe {
8+
CALL_STACK.get_or_insert_with(Vec::new)
9+
}
10+
}
11+
12+
pub fn push(op: OperatorFunc) {
13+
call_stack().push(op)
14+
}
15+
16+
pub fn last() -> Option<&'static OperatorFunc> {
17+
call_stack().last()
18+
}
19+
20+
pub fn pop() -> Option<OperatorFunc> {
21+
call_stack().pop()
22+
}

cache/src/lib.rs

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
use lru::LruCache;
2-
use std::{any::Any, num::NonZeroUsize, rc::Rc};
3-
41
pub enum Trace {
52
Push,
63
Pop,
@@ -13,40 +10,7 @@ pub enum MemoOperator {
1310

1411
pub type OperatorFunc = fn(MemoOperator);
1512

16-
const CACHE_CAP: usize = 128;
17-
18-
static mut CACHE: Option<LruCache<OperatorFunc, Rc<dyn Any>>> = None;
19-
20-
static mut CALL_STACK: Option<Vec<OperatorFunc>> = None;
21-
22-
fn cache() -> &'static mut LruCache<OperatorFunc, Rc<dyn Any>> {
23-
#[allow(static_mut_refs)]
24-
unsafe {
25-
CACHE.get_or_insert_with(|| LruCache::new(NonZeroUsize::new(CACHE_CAP).unwrap()))
26-
}
27-
}
28-
29-
pub fn call_stack() -> &'static mut Vec<OperatorFunc> {
30-
#[allow(static_mut_refs)]
31-
unsafe {
32-
CALL_STACK.get_or_insert_with(|| Vec::new())
33-
}
34-
}
35-
36-
pub fn touch<T: 'static>(key: OperatorFunc) -> Option<Rc<T>> {
37-
cache()
38-
.get(&key)
39-
.map(Rc::clone)
40-
.filter(|rc| rc.is::<T>())
41-
.map(|rc| unsafe { Rc::from_raw(Rc::into_raw(rc) as *const T) })
42-
}
43-
44-
pub fn store_in_cache<T: 'static>(key: OperatorFunc, val: T) -> Rc<T> {
45-
let rc = Rc::new(val);
46-
cache().put(key, Rc::clone(&rc) as _);
47-
rc
48-
}
13+
pub mod cache;
14+
pub mod call_stack;
4915

50-
pub fn remove_from_cache(key: OperatorFunc) {
51-
cache().pop(&key);
52-
}
16+
pub use cache::{remove_from_cache, store_in_cache, touch};

macros/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ pub fn memo(_attr: TokenStream, item: TokenStream) -> TokenStream {
6161
static mut dependents: Vec<cache::OperatorFunc> = Vec::new();
6262
match op {
6363
cache::MemoOperator::Memo(cache::Trace::Push) => {
64-
if let Some(last) = cache::call_stack().peek_mut() {
65-
unsafe { dependents.push(*last) };
64+
if let Some(last) = cache::call_stack::last() {
65+
unsafe { dependents.push(last.clone()) };
6666
}
67-
cache::call_stack().push(#op_ident);
67+
cache::call_stack::push(#op_ident);
6868
},
6969
cache::MemoOperator::Memo(cache::Trace::Pop) => {
70-
cache::call_stack().pop();
70+
cache::call_stack::pop();
7171
},
7272
cache::MemoOperator::Pop => {
7373
for dependent in unsafe { dependents.iter() } {

macros/tests/basic.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![feature(vec_peek_mut)]
2-
31
use macros::memo;
42

53
#[memo]

macros/tests/dep.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![feature(vec_peek_mut)]
2-
31
use macros::memo;
42

53
static mut SOURCE_A_CALLED: bool = false;

0 commit comments

Comments
 (0)