data_pile/
seqno_iter.rs

1use crate::{flatfile::FlatFile, seqno::SeqNoIndex, SharedMmap};
2use std::sync::Arc;
3
4/// This structure allows to iterate over records in the order they were added
5/// to this database.
6pub struct SeqNoIter {
7    data: Arc<FlatFile>,
8    index: Arc<SeqNoIndex>,
9    seqno: usize,
10}
11
12impl SeqNoIter {
13    pub(crate) fn new(data: Arc<FlatFile>, index: Arc<SeqNoIndex>, seqno: usize) -> Self {
14        Self { data, index, seqno }
15    }
16
17    fn next_impl(&mut self) -> Option<SharedMmap> {
18        let offset = self.index.get_pointer_to_value(self.seqno)? as usize;
19        let next_offset = self
20            .index
21            .get_pointer_to_value(self.seqno + 1)
22            .map(|value| value as usize)
23            .unwrap_or_else(|| self.data.len());
24        let length = next_offset - offset;
25        let item = self.data.get_record_at_offset(offset, length)?;
26        self.seqno += 1;
27        Some(item)
28    }
29}
30
31impl Iterator for SeqNoIter {
32    type Item = SharedMmap;
33
34    fn next(&mut self) -> Option<Self::Item> {
35        self.next_impl()
36    }
37}