micromegas_transit/
heterogeneous_queue.rs

1use 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}