Skip to content

Commit 21eea9f

Browse files
authored
added logic to ignore empty items in circular buffers (#14)
1 parent cafb024 commit 21eea9f

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

api/src/types/circular_buffer.rs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)