concision_core/ops/fft/cmp/
plan.rs

1/*
2   Appellation: plan <mod>
3   Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use 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}