concision_math/signal/fourier/
plan.rs

1/*
2   Appellation: plan <mod>
3   Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use core::slice;
6
7use super::utils::fft_permutation;
8
9#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
10#[cfg_attr(
11    feature = "serde",
12    derive(serde_derive::Deserialize, serde_derive::Serialize)
13)]
14pub struct FftPlan {
15    len: usize,
16    plan: Vec<usize>,
17}
18
19impl FftPlan {
20    pub fn new(len: usize) -> Self {
21        Self {
22            len,
23            plan: Vec::with_capacity(len),
24        }
25    }
26
27    pub fn build(self) -> Self {
28        let plan = fft_permutation(self.len);
29        Self { plan, ..self }
30    }
31
32    pub fn clear(&mut self) {
33        self.len = 0;
34        self.plan.clear();
35    }
36
37    pub fn get(&self, index: usize) -> Option<&usize> {
38        self.plan().get(index)
39    }
40
41    pub fn iter(&self) -> slice::Iter<usize> {
42        self.plan().iter()
43    }
44
45    pub fn len(&self) -> usize {
46        self.len
47    }
48
49    pub fn plan(&self) -> &[usize] {
50        &self.plan
51    }
52
53    pub fn set(&mut self, len: usize) {
54        self.len = len;
55        self.plan = Vec::with_capacity(len);
56    }
57
58    pub fn with(self, len: usize) -> Self {
59        Self {
60            len,
61            plan: Vec::with_capacity(len),
62        }
63    }
64}
65
66impl AsRef<[usize]> for FftPlan {
67    fn as_ref(&self) -> &[usize] {
68        &self.plan
69    }
70}
71
72impl AsMut<[usize]> for FftPlan {
73    fn as_mut(&mut self) -> &mut [usize] {
74        &mut self.plan
75    }
76}
77
78impl Extend<usize> for FftPlan {
79    fn extend<T: IntoIterator<Item = usize>>(&mut self, iter: T) {
80        self.plan.extend(iter);
81    }
82}
83
84impl FromIterator<usize> for FftPlan {
85    fn from_iter<T: IntoIterator<Item = usize>>(iter: T) -> Self {
86        let plan = Vec::from_iter(iter);
87        Self {
88            len: plan.len(),
89            plan,
90        }
91    }
92}
93
94impl IntoIterator for FftPlan {
95    type Item = usize;
96    type IntoIter = std::vec::IntoIter<Self::Item>;
97
98    fn into_iter(self) -> Self::IntoIter {
99        self.plan.into_iter()
100    }
101}
102
103impl<'a> IntoIterator for &'a mut FftPlan {
104    type Item = &'a mut usize;
105    type IntoIter = slice::IterMut<'a, usize>;
106
107    fn into_iter(self) -> Self::IntoIter {
108        self.plan.iter_mut()
109    }
110}