Skip to content

Commit 3d40e65

Browse files
committed
sameold: drop slice-ring-buffer
Replace `SliceRingBuffer` with a standard `VecDeque` in our FIR filter `Window` implementation. The crate dependency is dropped.
1 parent ce1c4a7 commit 3d40e65

3 files changed

Lines changed: 19 additions & 65 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/sameold/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ log = "0.4"
1818
nalgebra = "^0.33.2"
1919
num-complex = "^0.4"
2020
num-traits = "^0.2"
21-
slice-ring-buffer = "^0.3"
2221

2322
[dev-dependencies]
2423
assert_approx_eq = "1.1.0"

crates/sameold/src/receiver/filter.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
//! wind.push(&[1.0f32, 2.0f32, 3.0f32, 4.0f32]);
6363
//! ```
6464
65+
use std::collections::VecDeque;
6566
use std::convert::AsRef;
6667

6768
use nalgebra::base::Scalar;
6869
use nalgebra::DVector;
6970
use num_traits::{One, Zero};
70-
use slice_ring_buffer::SliceRingBuffer;
7171

7272
/// FIR filter coefficients
7373
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq)]
@@ -215,7 +215,7 @@ where
215215
/// Implements a fixed-size lookback window for FIR filters
216216
/// or other purposes.
217217
#[derive(Clone, Debug)]
218-
pub struct Window<T>(SliceRingBuffer<T>)
218+
pub struct Window<T>(VecDeque<T>)
219219
where
220220
T: Copy + Scalar + Zero;
221221

@@ -226,27 +226,19 @@ where
226226
{
227227
/// Create empty window, filling it with zeros
228228
///
229-
/// Creates a new `Window` with the given `len`gth, with
230-
/// `len > 0`.
229+
/// Creates a new `Window` with the given `len`gth
231230
pub fn new(len: usize) -> Self {
232-
assert!(len > 0);
233-
234-
let mut out = Self(SliceRingBuffer::with_capacity(len));
235-
for _i in 0..len {
236-
out.0.push_front(T::zero());
237-
}
238-
assert_eq!(len, out.0.len());
239-
out
231+
let mut q = VecDeque::with_capacity(len);
232+
q.resize(len, T::zero());
233+
Self(q)
240234
}
241235

242236
/// Reset to zero initial conditions
243237
///
244238
/// Clear the window, filling it with zeros
245239
pub fn reset(&mut self) {
246-
let len = self.0.len();
247-
self.0.clear();
248-
for _i in 0..len {
249-
self.0.push_front(T::zero());
240+
for s in &mut self.0 {
241+
*s = T::zero()
250242
}
251243
}
252244

@@ -279,7 +271,7 @@ where
279271
std::mem::drop(self.0.drain(0..input.len()));
280272

281273
// add new
282-
self.0.extend_from_slice(input.as_ref());
274+
self.0.extend(input.as_ref());
283275
}
284276

285277
/// Append a scalar to the sample window
@@ -290,7 +282,7 @@ where
290282
/// sample in the Window.
291283
#[inline]
292284
pub fn push_scalar(&mut self, input: T) -> T {
293-
let out = self.0.pop_front().unwrap();
285+
let out = self.0.pop_front().unwrap_or(T::zero());
294286
self.0.push_back(input);
295287
out
296288
}
@@ -313,7 +305,7 @@ where
313305
}
314306

315307
/// Obtain the inner SliceRingBuffer
316-
pub fn inner(&self) -> &SliceRingBuffer<T> {
308+
pub fn inner(&self) -> &VecDeque<T> {
317309
&self.0
318310
}
319311

@@ -336,10 +328,10 @@ where
336328
{
337329
type Item = T;
338330

339-
type IntoIter = std::iter::Copied<core::slice::Iter<'a, T>>;
331+
type IntoIter = std::iter::Copied<std::collections::vec_deque::Iter<'a, T>>;
340332

341333
fn into_iter(self) -> Self::IntoIter {
342-
self.0.as_slice().into_iter().copied()
334+
self.0.iter().copied()
343335
}
344336
}
345337

@@ -443,6 +435,8 @@ mod tests {
443435
assert_eq!(vec![0.0f32, 0.0f32, 0.0f32, 0.0f32], wind.to_vec());
444436
wind.push(&[1.0f32]);
445437
assert_eq!(vec![0.0f32, 0.0f32, 0.0f32, 1.0f32], wind.to_vec());
438+
wind.push(&[]);
439+
assert_eq!(vec![0.0f32, 0.0f32, 0.0f32, 1.0f32], wind.to_vec());
446440

447441
wind.push(&[2.0f32]);
448442
assert_eq!(vec![0.0f32, 0.0f32, 1.0f32, 2.0f32], wind.to_vec());
@@ -458,6 +452,10 @@ mod tests {
458452
assert_eq!(4, wind.len());
459453
assert_eq!(vec![2.0f32, 3.0f32, 4.0f32, 10.0f32], wind.to_vec());
460454

455+
// exactly enough to fill
456+
wind.push(&[5.0f32, 4.0f32, 3.0f32, 2.0f32]);
457+
assert_eq!(vec![5.0f32, 4.0f32, 3.0f32, 2.0f32], wind.to_vec());
458+
461459
wind.reset();
462460
assert_eq!(4, wind.len());
463461
assert_eq!(vec![0.0f32, 0.0f32, 0.0f32, 0.0f32], wind.to_vec());

0 commit comments

Comments
 (0)