1use crate::{FnCache, FnCacheMany};
2
3use std::sync::Arc;
4
5pub struct VecCache<'f, O> {
16 pub(crate) cache: Vec<O>,
17 f: Arc<dyn Fn(&mut Self, &usize) -> O + 'f + Send + Sync>,
18}
19
20impl<'f, O> FnCache<usize, O> for VecCache<'f, O> {
21 fn get(&mut self, input: usize) -> &O {
22 let len = self.cache.len();
23
24 if len <= input {
25 self.cache.reserve(input - len + 1);
26 }
27
28 while self.cache.len() <= input {
29 let next = self.cache.len();
30 let next_val = self.compute(next);
31 self.cache.push(next_val);
32 }
33
34 self.cache.get(input).unwrap()
35 }
36}
37
38impl<'f, O> FnCacheMany<usize, O> for VecCache<'f, O> {
39 fn get_many<const N: usize>(&mut self, inputs: [usize; N]) -> [&O; N] {
40 let len = self.cache.len();
41 let max = inputs.iter().max().copied().unwrap_or(0);
42
43 if len <= max {
44 self.cache.reserve(max - len + 1);
45 }
46
47 for i in inputs {
48 self.get(i);
49 }
50
51 inputs.map(|i| self.cache.get(i).unwrap())
52 }
53}
54
55impl<'f, O> VecCache<'f, O> {
56 pub fn new<F>(f: F) -> Self
60 where
61 F: Fn(&usize) -> O + 'f + Send + Sync,
62 {
63 Self::recursive(move |_, x| f(x))
64 }
65
66 pub fn recursive<F>(f: F) -> Self
70 where
71 F: Fn(&mut Self, &usize) -> O + 'f + Send + Sync,
72 {
73 VecCache {
74 cache: Vec::default(),
75 f: Arc::new(f),
76 }
77 }
78
79 fn compute(&mut self, input: usize) -> O {
80 (self.f.clone())(self, &input)
81 }
82
83 pub fn clear(&mut self) {
86 self.cache.clear();
87 }
88
89 pub fn len(&self) -> usize {
91 self.cache.len()
92 }
93
94 pub fn reserve(&mut self, additional: usize) {
98 self.cache.reserve(additional)
99 }
100}