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