@@ -35,7 +35,13 @@ impl<const N: usize, const M: usize> CircularBuffer<N, M> {
35
35
}
36
36
37
37
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
39
45
}
40
46
41
47
pub fn contains ( & self , item : & [ u8 ] ) -> bool {
@@ -79,13 +85,11 @@ impl<const N: usize, const M: usize> CircularBuffer<N, M> {
79
85
}
80
86
81
87
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
83
91
} else {
84
- if self . offset == 0 {
85
- N as u8 - 1
86
- } else {
87
- self . offset - 1
88
- }
92
+ self . offset - 1
89
93
} ;
90
94
91
95
Some ( & self . items [ index as usize ] )
@@ -257,4 +261,28 @@ mod tests {
257
261
assert ! ( buffer. get( 1 ) . unwrap( ) [ ..16 ] . eq( & item3) ) ;
258
262
assert ! ( buffer. get( 2 ) . unwrap( ) [ ..32 ] . eq( & item4) ) ;
259
263
}
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
+ }
260
288
}
0 commit comments