swh_graph/views/
webgraph.rs1use webgraph::prelude::*;
8
9use crate::graph::*;
10
11pub struct WebgraphAdapter<G: SwhForwardGraph>(pub G);
49
50impl<G: SwhForwardGraph> SequentialLabeling for WebgraphAdapter<G> {
51 type Label = usize;
52 type Lender<'node>
53 = LenderSwhForwardGraph<'node, G>
54 where
55 Self: 'node;
56
57 #[inline(always)]
58 fn num_nodes(&self) -> usize {
59 SwhGraph::num_nodes(&self.0)
60 }
61
62 #[inline(always)]
63 fn num_arcs_hint(&self) -> Option<u64> {
64 Some(SwhGraph::num_arcs(&self.0))
65 }
66
67 #[inline(always)]
68 fn iter_from(&self, node_id: usize) -> Self::Lender<'_> {
69 LenderSwhForwardGraph {
70 graph: &self.0,
71 node_id,
72 }
73 }
74}
75
76impl<G: SwhForwardGraph> RandomAccessLabeling for WebgraphAdapter<G> {
77 type Labels<'succ>
78 = <G as SwhForwardGraph>::Successors<'succ>
79 where
80 Self: 'succ;
81
82 #[inline(always)]
83 fn num_arcs(&self) -> u64 {
84 SwhGraph::num_arcs(&self.0)
85 }
86
87 #[inline(always)]
88 fn outdegree(&self, node_id: usize) -> usize {
89 SwhForwardGraph::outdegree(&self.0, node_id)
90 }
91
92 #[inline(always)]
93 fn labels(&self, node_id: NodeId) -> Self::Labels<'_> {
94 SwhForwardGraph::successors(&self.0, node_id)
95 }
96}
97
98impl<G: SwhForwardGraph> SequentialGraph for WebgraphAdapter<G> {}
99impl<G: SwhForwardGraph> RandomAccessGraph for WebgraphAdapter<G> {}
100
101pub struct LenderSwhForwardGraph<'node, G: SwhForwardGraph> {
103 graph: &'node G,
104 node_id: NodeId,
105}
106
107impl<'succ, G: SwhForwardGraph> lender::Lending<'succ> for LenderSwhForwardGraph<'_, G> {
108 type Lend = (usize, G::Successors<'succ>);
109}
110
111impl<'succ, G: SwhForwardGraph> NodeLabelsLender<'succ> for LenderSwhForwardGraph<'_, G> {
112 type Label = usize;
113 type IntoIterator = G::Successors<'succ>;
114}
115
116impl<G: SwhForwardGraph> lender::Lender for LenderSwhForwardGraph<'_, G> {
117 fn next(&mut self) -> Option<<Self as lender::Lending<'_>>::Lend> {
118 let node_id = self.node_id;
119 if node_id >= self.graph.num_nodes() {
120 return None;
121 }
122 self.node_id += 1;
123 Some((node_id, self.graph.successors(node_id)))
127 }
128}