formualizer_eval/engine/
cache.rs

1//! Pass-scoped caches for criteria masks (flats removed)
2
3use std::collections::HashMap;
4
5use crate::engine::masks::DenseMask;
6
7/// Key for criteria mask cache
8pub type CriteriaKey = String;
9
10/// Pass-scoped cache for criteria masks
11pub struct CriteriaMaskCache {
12    cache: HashMap<String, DenseMask>,
13    entries_cap: usize,
14}
15
16impl CriteriaMaskCache {
17    pub fn new(entries_cap: usize) -> Self {
18        Self {
19            cache: HashMap::new(),
20            entries_cap,
21        }
22    }
23
24    pub fn get(&self, key: &str) -> Option<DenseMask> {
25        self.cache.get(key).cloned()
26    }
27
28    pub fn insert(&mut self, key: String, mask: DenseMask) -> bool {
29        // Simple LRU-like behavior: if at capacity, remove oldest
30        if self.cache.len() >= self.entries_cap && !self.cache.contains_key(&key) {
31            if let Some(first_key) = self.cache.keys().next().cloned() {
32                self.cache.remove(&first_key);
33            }
34        }
35        self.cache.insert(key, mask);
36        true
37    }
38
39    pub fn clear(&mut self) {
40        self.cache.clear();
41    }
42
43    pub fn len(&self) -> usize {
44        self.cache.len()
45    }
46
47    pub fn is_empty(&self) -> bool {
48        self.cache.is_empty()
49    }
50}