1#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub enum Source {
5 Exact,
6 Measured,
7}
8
9#[derive(Clone, Copy, Debug, PartialEq)]
11pub struct Dropped {
12 pub hz: f64,
13 pub db: f64,
14}
15
16macro_rules! rules {
17 ($($variant:ident => $text:literal,)+) => {
18 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
19 pub enum Rule {
20 $($variant,)+
21 }
22
23 impl Rule {
24 pub fn as_str(self) -> &'static str {
26 match self {
27 $(Rule::$variant => $text,)+
28 }
29 }
30
31 pub fn named(text: &str) -> Option<Rule> {
32 match text {
33 $($text => Some(Rule::$variant),)+
34 _ => None,
35 }
36 }
37 }
38 };
39}
40
41rules! {
42 LineSpectrumExact => "line spectrum, no crop",
43 LineSpectrumSummed => "line spectrum, summed directly",
44 LineSpectrumMixed => "line spectrum, placed and summed",
45 BandLimited => "band-limited projection",
46 CroppedPair => "cropped pair, tail truncated",
47 PointSampled => "point sampling",
48 InverseSpectrum => "inverse spectrum",
49 Istft => "inverse short-time transform",
50 Reading => "reading",
51 Added => "sum, addend by addend",
52}
53
54#[derive(Clone, Debug, PartialEq)]
55pub enum Detail {
56 Lines {
57 rule: Rule,
58 placed: usize,
60 summed: usize,
61 dropped: Vec<Dropped>,
62 dropped_more: usize,
63 terms: Option<usize>,
64 tail_db: Option<f64>,
65 },
66 Continuous {
67 rule: Rule,
68 },
69 Cropped {
70 rule: Rule,
71 tail_db: Option<f64>,
72 },
73 Point {
74 rule: Rule,
75 alias_db: Option<f64>,
76 },
77 Spectrum {
78 rule: Rule,
79 wrap_db: f64,
80 },
81 Roundtrip {
82 rule: Rule,
83 edited: bool,
84 },
85 Reading {
87 rule: Rule,
88 },
89 Added {
91 parts: Vec<Detail>,
92 },
93}
94
95#[derive(Clone, Copy, Debug, PartialEq, Eq)]
96pub struct Cost {
97 pub flops: u128,
98 pub budget: u128,
99}
100
101#[derive(Clone, Debug, PartialEq)]
103pub struct Pruned {
104 pub db: f64,
105 pub cuts: Vec<(String, i64)>,
106}
107
108#[derive(Clone, Debug, PartialEq)]
109pub struct Label {
110 pub source: Source,
111 pub profile: &'static str,
112 pub rate: u32,
113 pub detail: Detail,
114 pub cost: Option<Cost>,
115 pub moved: Option<f64>,
117 pub pruned: Option<Pruned>,
118}
119
120impl Label {
121 pub fn measured(profile: &'static str, rate: u32) -> Label {
122 Label {
123 source: Source::Measured,
124 profile,
125 rate,
126 detail: Detail::Reading {
127 rule: Rule::Reading,
128 },
129 cost: None,
130 moved: None,
131 pruned: None,
132 }
133 }
134
135 pub fn new(source: Source, profile: &'static str, rate: u32, detail: Detail) -> Label {
136 Label {
137 source,
138 profile,
139 rate,
140 detail,
141 cost: None,
142 moved: None,
143 pruned: None,
144 }
145 }
146
147 pub fn costing(self, flops: u128, budget: u128) -> Label {
148 Label {
149 cost: Some(Cost { flops, budget }),
150 ..self
151 }
152 }
153
154 pub fn rule(&self) -> Rule {
155 self.detail.rule()
156 }
157}
158
159impl Detail {
160 pub fn rule(&self) -> Rule {
161 match *self {
162 Detail::Lines { rule, .. }
163 | Detail::Continuous { rule }
164 | Detail::Cropped { rule, .. }
165 | Detail::Point { rule, .. }
166 | Detail::Spectrum { rule, .. }
167 | Detail::Roundtrip { rule, .. }
168 | Detail::Reading { rule } => rule,
169 Detail::Added { .. } => Rule::Added,
170 }
171 }
172}