Skip to main content

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}