rustfft/
fft_cache.rs

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}