6262//! wind.push(&[1.0f32, 2.0f32, 3.0f32, 4.0f32]);
6363//! ```
6464
65+ use std:: collections:: VecDeque ;
6566use std:: convert:: AsRef ;
6667
6768use nalgebra:: base:: Scalar ;
6869use nalgebra:: DVector ;
6970use 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 > )
219219where
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