Skip to main content

linkrs_storage/edge/single_mutable_csr/
iter.rs

1//! Full-table iterator for `SingleMutableCsr`.
2
3use linkrs_core::types::{Timestamp, VertexId};
4
5use super::super::{Nbr, INVALID_EDGE_ID};
6use super::SingleMutableCsr;
7
8pub struct SingleMutableCsrIterator<'a> {
9    csr: &'a SingleMutableCsr,
10    current_vertex: usize,
11    ts: Timestamp,
12    include_deleted: bool,
13}
14
15impl<'a> SingleMutableCsrIterator<'a> {
16    pub fn new(csr: &'a SingleMutableCsr, ts: Timestamp) -> Self {
17        Self {
18            csr,
19            current_vertex: 0,
20            ts,
21            include_deleted: false,
22        }
23    }
24
25    /// Iterator over every stored entry, including tombstoned ones.
26    pub fn new_all(csr: &'a SingleMutableCsr) -> Self {
27        Self {
28            csr,
29            current_vertex: 0,
30            ts: 0,
31            include_deleted: true,
32        }
33    }
34}
35
36impl<'a> Iterator for SingleMutableCsrIterator<'a> {
37    type Item = (VertexId, Nbr);
38
39    fn next(&mut self) -> Option<Self::Item> {
40        while self.current_vertex < self.csr.vertex_capacity() {
41            let vid = self.current_vertex;
42            self.current_vertex += 1;
43
44            let nbr = if self.include_deleted {
45                self.csr
46                    .slot_at(vid)
47                    .filter(|n| n.edge_id != INVALID_EDGE_ID)
48            } else {
49                self.csr.get_edge_any_dst(vid as u32, self.ts)
50            };
51            if let Some(nbr) = nbr {
52                return Some((VertexId::from_u32(u32::try_from(vid).ok()?), nbr));
53            }
54        }
55        None
56    }
57}
58
59impl SingleMutableCsr {
60    pub fn iter(&self, ts: Timestamp) -> SingleMutableCsrIterator<'_> {
61        SingleMutableCsrIterator::new(self, ts)
62    }
63
64    /// Iterate over all physically present entries, including tombstoned ones.
65    pub fn iter_all(&self) -> SingleMutableCsrIterator<'_> {
66        SingleMutableCsrIterator::new_all(self)
67    }
68}