linkrs_storage/edge/csr_variant/iter.rs
1use super::super::mutable_csr::VertexEdgesIter;
2use super::super::{
3 FrozenRowIter, ImmutableCsrIterator, MutableCsrIterator, Nbr, PureAllIter, PureRowIter,
4 SingleMutableCsrIterator, VertexId,
5};
6
7/// Iterator over CSR edges, supporting multiple implementation types
8pub enum CsrIterator<'a> {
9 /// Iterator over multi-edge CSR
10 Multiple(MutableCsrIterator<'a>),
11 /// Iterator over single-edge CSR
12 Single(SingleMutableCsrIterator<'a>),
13 /// Iterator over pure topology CSR
14 Pure(PureAllIter<'a>),
15 /// Iterator over bundled CSR
16 Bundled(PureAllIter<'a>),
17 /// Iterator over frozen packed CSR
18 Frozen(ImmutableCsrIterator<'a>),
19 /// Empty iterator
20 None,
21}
22
23impl<'a> Iterator for CsrIterator<'a> {
24 type Item = (VertexId, Nbr);
25
26 fn next(&mut self) -> Option<Self::Item> {
27 match self {
28 CsrIterator::Multiple(iter) => iter.next(),
29 CsrIterator::Single(iter) => iter.next(),
30 CsrIterator::Pure(iter) => iter.next(),
31 CsrIterator::Bundled(iter) => iter.next(),
32 CsrIterator::Frozen(iter) => iter.next(),
33 CsrIterator::None => None,
34 }
35 }
36}
37
38/// Borrowed per-vertex edge iterator covering every CSR strategy.
39///
40/// Allocation-free counterpart of `edges_of` at the variant level: each arm
41/// wraps the strategy's own iterator, so callers above the variant (shard
42/// sets, table scans) iterate one row without materializing a vector,
43/// regardless of the underlying layout. Records are assembled by value
44/// because the split halves live in separate slices.
45///
46/// Bundled rows yield topology only through this iterator: the inline value
47/// column stays unread. Callers needing values must use the paired value
48/// entry (`visit_physical_with_values` or the `bundled_value_*` accessors)
49/// instead of this walk alone, otherwise values are silently dropped.
50pub enum CsrRowIter<'a> {
51 /// Multi-edge row: primary block plus overflow chain walk.
52 Multiple(VertexEdgesIter<'a>),
53 /// Single-edge row: at most one assembled slot.
54 Single(std::option::IntoIter<Nbr>),
55 /// Pure topology row: borrowed primary plus overflow walk.
56 Pure(PureRowIter<'a>),
57 /// Bundled row: borrowed topology walk only. Values are not yielded;
58 /// resolve them through the paired value entry per edge.
59 Bundled(PureRowIter<'a>),
60 /// Frozen row: filtered packed-slice walk.
61 Frozen(FrozenRowIter<'a>),
62}
63
64impl<'a> Iterator for CsrRowIter<'a> {
65 type Item = Nbr;
66
67 fn next(&mut self) -> Option<Self::Item> {
68 match self {
69 CsrRowIter::Multiple(iter) => iter.next(),
70 CsrRowIter::Single(iter) => iter.next(),
71 CsrRowIter::Pure(iter) => iter.next(),
72 CsrRowIter::Bundled(iter) => iter.next(),
73 CsrRowIter::Frozen(iter) => iter.next(),
74 }
75 }
76}