linkrs_storage/edge/single_mutable_csr/
iter.rs1use 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 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 pub fn iter_all(&self) -> SingleMutableCsrIterator<'_> {
66 SingleMutableCsrIterator::new_all(self)
67 }
68}