micromegas_transit/
heterogeneous_queue.rs1use crate::UserDefinedType;
2
3pub trait HeterogeneousQueue {
4 type Item;
5 fn iter(&self) -> QueueIterator<'_, Self, Self::Item>
6 where
7 Self: Sized;
8 fn len_bytes(&self) -> usize;
9 fn nb_objects(&self) -> usize;
10 fn capacity_bytes(&self) -> usize;
11 fn read_value_at_offset(&self, offset: usize) -> (Self::Item, usize);
12 fn new(buffer_size: usize) -> Self;
13 fn reflect_contained() -> Vec<UserDefinedType>;
14 fn as_bytes(&self) -> &[u8];
15}
16
17pub struct QueueIterator<'a, QueueT, ValueT> {
18 queue: &'a QueueT,
19 offset: usize,
20 phantom: std::marker::PhantomData<&'a ValueT>,
21}
22
23impl<'a, QueueT, ValueT> QueueIterator<'a, QueueT, ValueT> {
24 pub fn begin(queue: &'a QueueT) -> Self {
25 let offset = 0;
26 Self {
27 queue,
28 offset,
29 phantom: std::marker::PhantomData,
30 }
31 }
32}
33
34impl<QueueT: HeterogeneousQueue, ValueT> core::iter::Iterator
35 for QueueIterator<'_, QueueT, ValueT>
36{
37 type Item = QueueT::Item;
38
39 fn next(&mut self) -> Option<Self::Item> {
40 if self.offset >= self.queue.len_bytes() {
41 None
42 } else {
43 let (obj, next_offset) = self.queue.read_value_at_offset(self.offset);
44 self.offset = next_offset;
45 Some(obj)
46 }
47 }
48}