concision_math/signal/fourier/
plan.rs1use 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}