1use std::{collections::HashMap, sync::Arc};
2
3use crate::{Fft, FftDirection};
4
5pub(crate) struct FftCache<T> {
6 forward_cache: HashMap<usize, Arc<dyn Fft<T>>>,
7 inverse_cache: HashMap<usize, Arc<dyn Fft<T>>>,
8}
9impl<T> FftCache<T> {
10 pub fn new() -> Self {
11 Self {
12 forward_cache: HashMap::new(),
13 inverse_cache: HashMap::new(),
14 }
15 }
16 #[allow(unused)]
17 pub fn contains_fft(&self, len: usize, direction: FftDirection) -> bool {
18 match direction {
19 FftDirection::Forward => self.forward_cache.contains_key(&len),
20 FftDirection::Inverse => self.inverse_cache.contains_key(&len),
21 }
22 }
23 pub fn get(&self, len: usize, direction: FftDirection) -> Option<Arc<dyn Fft<T>>> {
24 match direction {
25 FftDirection::Forward => self.forward_cache.get(&len),
26 FftDirection::Inverse => self.inverse_cache.get(&len),
27 }
28 .map(Arc::clone)
29 }
30 pub fn insert(&mut self, fft: &Arc<dyn Fft<T>>) {
31 let cloned = Arc::clone(fft);
32 let len = cloned.len();
33
34 match cloned.fft_direction() {
35 FftDirection::Forward => self.forward_cache.insert(len, cloned),
36 FftDirection::Inverse => self.inverse_cache.insert(len, cloned),
37 };
38 }
39}