@@ -35,7 +35,13 @@ impl<const N: usize, const M: usize> CircularBuffer<N, M> {
3535 }
3636
3737 pub fn find_index ( & self , item : & [ u8 ] ) -> Option < usize > {
38- self . items . iter ( ) . position ( |x| x. eq ( item) )
38+ for i in 0 ..self . num_items as usize {
39+ let idx = ( self . offset as usize + i) % N ;
40+ if self . items [ idx] == item {
41+ return Some ( i) ;
42+ }
43+ }
44+ None
3945 }
4046
4147 pub fn contains ( & self , item : & [ u8 ] ) -> bool {
@@ -79,13 +85,11 @@ impl<const N: usize, const M: usize> CircularBuffer<N, M> {
7985 }
8086
8187 let index = if self . num_items < N as u8 {
82- self . num_items as u8 - 1
88+ self . num_items - 1
89+ } else if self . offset == 0 {
90+ N as u8 - 1
8391 } else {
84- if self . offset == 0 {
85- N as u8 - 1
86- } else {
87- self . offset - 1
88- }
92+ self . offset - 1
8993 } ;
9094
9195 Some ( & self . items [ index as usize ] )
@@ -257,4 +261,28 @@ mod tests {
257261 assert ! ( buffer. get( 1 ) . unwrap( ) [ ..16 ] . eq( & item3) ) ;
258262 assert ! ( buffer. get( 2 ) . unwrap( ) [ ..32 ] . eq( & item4) ) ;
259263 }
264+
265+ #[ test]
266+ fn test_ignore_empty_items ( ) {
267+ let mut buffer = TestBuffer :: new ( ) ;
268+ let zero_item = [ 0u8 ; 32 ] ;
269+ assert ! ( !buffer. contains( & zero_item) ) ;
270+
271+ let item1 = [ 1u8 ; 32 ] ;
272+ buffer. push ( & item1) ;
273+ assert ! ( !buffer. contains( & zero_item) ) ;
274+
275+ buffer. push ( & zero_item) ;
276+ assert ! ( buffer. contains( & zero_item) ) ;
277+
278+ let item2 = [ 2u8 ; 32 ] ;
279+ let item3 = [ 3u8 ; 32 ] ;
280+ let item4 = [ 4u8 ; 32 ] ;
281+
282+ buffer. push ( & item2) ;
283+ buffer. push ( & item3) ;
284+ buffer. push ( & item4) ;
285+
286+ assert ! ( !buffer. contains( & zero_item) ) ;
287+ }
260288}
0 commit comments