1use super::{
20 Directed, DirectedEdge, FiniteGraph, GraphIter, GraphIterator, GraphType, IndexDigraph, IndexGraph, Undirected,
21};
22use std::ptr::NonNull;
23
24pub trait GraphTypeRef<'a>: Clone {
26 type Node: Copy + Eq;
28
29 type Edge: Copy + Eq;
31}
32
33pub trait FiniteGraphRef<'a>: GraphTypeRef<'a> {
37 type NodeIt: GraphIterator<Self, Item = Self::Node>;
39
40 type EdgeIt: GraphIterator<Self, Item = Self::Edge>;
42
43 fn num_nodes(&self) -> usize;
45
46 fn nodes_iter(&self) -> Self::NodeIt;
48
49 fn nodes(&self) -> GraphIter<Self, Self::NodeIt>
51 where
52 Self: Sized,
53 {
54 GraphIter(FiniteGraphRef::nodes_iter(self), self)
55 }
56
57 fn num_edges(&self) -> usize;
59
60 fn edges_iter(&self) -> Self::EdgeIt;
64
65 fn edges(&self) -> GraphIter<Self, Self::EdgeIt>
69 where
70 Self: Sized,
71 {
72 GraphIter(FiniteGraphRef::edges_iter(self), self)
73 }
74
75 fn enodes(&self, e: Self::Edge) -> (Self::Node, Self::Node);
79}
80
81pub trait FiniteDigraphRef<'a>: FiniteGraphRef<'a> {
85 fn src(&self, e: Self::Edge) -> Self::Node;
86 fn snk(&self, e: Self::Edge) -> Self::Node;
87}
88
89pub trait UndirectedRef<'a>: GraphTypeRef<'a> {
93 type NeighIt: GraphIterator<Self, Item = (Self::Edge, Self::Node)>;
95
96 fn neigh_iter(&self, u: Self::Node) -> Self::NeighIt;
98
99 fn neighs(&self, u: Self::Node) -> super::GraphIter<Self, Self::NeighIt>
101 where
102 Self: Sized,
103 {
104 GraphIter(UndirectedRef::neigh_iter(self, u), self)
105 }
106}
107
108pub trait DirectedRef<'a>: UndirectedRef<'a> {
112 type OutIt: GraphIterator<Self, Item = (Self::Edge, Self::Node)>;
114
115 type InIt: GraphIterator<Self, Item = (Self::Edge, Self::Node)>;
117
118 type IncidentIt: GraphIterator<Self, Item = (Self::DirectedEdge, Self::Node)>;
120
121 type DirectedEdge: DirectedEdge<Edge = Self::Edge> + Copy + Eq;
123
124 fn out_iter(&self, u: Self::Node) -> Self::OutIt;
129
130 fn outedges(&self, u: Self::Node) -> super::GraphIter<Self, Self::OutIt>
132 where
133 Self: Sized,
134 {
135 GraphIter(DirectedRef::out_iter(self, u), self)
136 }
137
138 fn in_iter(&self, u: Self::Node) -> Self::InIt;
140
141 fn inedges(&self, u: Self::Node) -> super::GraphIter<Self, Self::InIt>
143 where
144 Self: Sized,
145 {
146 GraphIter(DirectedRef::in_iter(self, u), self)
147 }
148
149 fn incident_iter(&self, u: Self::Node) -> Self::IncidentIt;
151
152 fn incident_edges(&self, u: Self::Node) -> super::GraphIter<Self, Self::IncidentIt>
154 where
155 Self: Sized,
156 {
157 GraphIter(DirectedRef::incident_iter(self, u), self)
158 }
159}
160
161pub trait IndexGraphRef<'a>: UndirectedRef<'a> {
165 fn node_id(&self, u: Self::Node) -> usize;
167
168 fn id2node(&self, id: usize) -> Self::Node;
172
173 fn edge_id(&self, e: Self::Edge) -> usize;
177
178 fn id2edge(&self, id: usize) -> Self::Edge;
184}
185
186pub trait IndexDigraphRef<'a>: IndexGraphRef<'a> + DirectedRef<'a> {}
188
189#[derive(Clone)]
190pub struct WrapIt<I>(pub I);
191
192impl<'a, G, I> GraphIterator<&'a G> for WrapIt<I>
193where
194 I: GraphIterator<G>,
195{
196 type Item = I::Item;
197
198 fn next(&mut self, g: &&'a G) -> Option<Self::Item> {
199 self.0.next(*g)
200 }
201
202 fn size_hint(&self, g: &&'a G) -> (usize, Option<usize>) {
203 self.0.size_hint(*g)
204 }
205
206 fn count(self, g: &&'a G) -> usize {
207 self.0.count(*g)
208 }
209}
210
211impl<I> From<I> for WrapIt<I> {
212 fn from(it: I) -> WrapIt<I> {
213 WrapIt(it)
214 }
215}
216
217impl<'a, G> GraphTypeRef<'a> for &'a G
220where
221 G: GraphType,
222{
223 type Node = G::Node<'a>;
224 type Edge = G::Edge<'a>;
225}
226
227impl<'a, G> FiniteGraphRef<'a> for &'a G
228where
229 G: FiniteGraph,
230{
231 type NodeIt = WrapIt<G::NodeIt<'a>>;
232
233 type EdgeIt = WrapIt<G::EdgeIt<'a>>;
234
235 fn num_nodes(&self) -> usize {
236 (*self).num_nodes()
237 }
238
239 fn nodes_iter(&self) -> Self::NodeIt {
240 (*self).nodes_iter().into()
241 }
242
243 fn num_edges(&self) -> usize {
244 (*self).num_edges()
245 }
246
247 fn edges_iter(&self) -> Self::EdgeIt {
248 (*self).edges_iter().into()
249 }
250
251 fn enodes(&self, e: Self::Edge) -> (Self::Node, Self::Node) {
252 (*self).enodes(e)
253 }
254}
255
256impl<'a, G> UndirectedRef<'a> for &'a G
257where
258 G: Undirected,
259{
260 type NeighIt = WrapIt<G::NeighIt<'a>>;
261
262 fn neigh_iter(&self, u: Self::Node) -> Self::NeighIt {
263 (*self).neigh_iter(u).into()
264 }
265}
266
267impl<'a, G> DirectedRef<'a> for &'a G
268where
269 G: Directed,
270{
271 type OutIt = WrapIt<G::OutIt<'a>>;
272
273 type InIt = WrapIt<G::InIt<'a>>;
274
275 type IncidentIt = WrapIt<G::IncidentIt<'a>>;
276
277 type DirectedEdge = G::DirectedEdge<'a>;
278
279 fn out_iter(&self, u: Self::Node) -> Self::OutIt {
280 (*self).out_iter(u).into()
281 }
282
283 fn in_iter(&self, u: Self::Node) -> Self::InIt {
284 (*self).in_iter(u).into()
285 }
286
287 fn incident_iter(&self, u: Self::Node) -> Self::IncidentIt {
288 (*self).incident_iter(u).into()
289 }
290}
291
292impl<'a, G> IndexGraphRef<'a> for &'a G
293where
294 G: IndexGraph,
295{
296 fn node_id(&self, u: Self::Node) -> usize {
297 (*self).node_id(u)
298 }
299
300 fn edge_id(&self, e: Self::Edge) -> usize {
301 (*self).edge_id(e)
302 }
303
304 fn id2node(&self, id: usize) -> Self::Node {
305 (*self).id2node(id)
306 }
307
308 fn id2edge(&self, id: usize) -> Self::Edge {
309 (*self).id2edge(id)
310 }
311}
312
313impl<'a, G> IndexDigraphRef<'a> for &'a G where G: IndexDigraph {}
314
315impl<G, I> GraphIterator<NonNull<G>> for WrapIt<I>
318where
319 I: GraphIterator<G>,
320{
321 type Item = I::Item;
322
323 fn next(&mut self, g: &NonNull<G>) -> Option<Self::Item> {
324 unsafe { self.0.next(g.as_ref()) }
325 }
326
327 fn size_hint(&self, g: &NonNull<G>) -> (usize, Option<usize>) {
328 unsafe { self.0.size_hint(g.as_ref()) }
329 }
330
331 fn count(self, g: &NonNull<G>) -> usize {
332 unsafe { self.0.count(g.as_ref()) }
333 }
334}
335
336impl<'a, G> GraphTypeRef<'a> for NonNull<G>
337where
338 G: GraphType,
339{
340 type Node = G::Node<'a>;
341 type Edge = G::Edge<'a>;
342}
343
344impl<'a, G> FiniteGraphRef<'a> for NonNull<G>
345where
346 G: FiniteGraph + 'a,
347{
348 type NodeIt = WrapIt<G::NodeIt<'a>>;
349
350 type EdgeIt = WrapIt<G::EdgeIt<'a>>;
351
352 fn num_nodes(&self) -> usize {
353 unsafe { self.as_ref().num_nodes() }
354 }
355
356 fn nodes_iter(&self) -> Self::NodeIt {
357 unsafe { self.as_ref().nodes_iter().into() }
358 }
359
360 fn num_edges(&self) -> usize {
361 unsafe { self.as_ref().num_edges() }
362 }
363
364 fn edges_iter(&self) -> Self::EdgeIt {
365 unsafe { self.as_ref().edges_iter().into() }
366 }
367
368 fn enodes(&self, e: Self::Edge) -> (Self::Node, Self::Node) {
369 unsafe { self.as_ref().enodes(e) }
370 }
371}
372
373impl<'a, G> UndirectedRef<'a> for NonNull<G>
374where
375 G: Undirected + 'a,
376{
377 type NeighIt = WrapIt<G::NeighIt<'a>>;
378
379 fn neigh_iter(&self, u: Self::Node) -> Self::NeighIt {
380 unsafe { self.as_ref().neigh_iter(u).into() }
381 }
382}
383
384impl<'a, G> DirectedRef<'a> for NonNull<G>
385where
386 G: Directed + 'a,
387{
388 type OutIt = WrapIt<G::OutIt<'a>>;
389
390 type InIt = WrapIt<G::InIt<'a>>;
391
392 type IncidentIt = WrapIt<G::IncidentIt<'a>>;
393
394 type DirectedEdge = G::DirectedEdge<'a>;
395
396 fn out_iter(&self, u: Self::Node) -> Self::OutIt {
397 unsafe { self.as_ref().out_iter(u).into() }
398 }
399
400 fn in_iter(&self, u: Self::Node) -> Self::InIt {
401 unsafe { self.as_ref().in_iter(u).into() }
402 }
403
404 fn incident_iter(&self, u: Self::Node) -> Self::IncidentIt {
405 unsafe { self.as_ref().incident_iter(u).into() }
406 }
407}
408
409impl<'a, G> IndexGraphRef<'a> for NonNull<G>
410where
411 G: IndexGraph + 'a,
412{
413 fn node_id(&self, u: Self::Node) -> usize {
414 unsafe { self.as_ref().node_id(u) }
415 }
416
417 fn edge_id(&self, e: Self::Edge) -> usize {
418 unsafe { self.as_ref().edge_id(e) }
419 }
420
421 fn id2node(&self, id: usize) -> Self::Node {
422 unsafe { self.as_ref().id2node(id) }
423 }
424
425 fn id2edge(&self, id: usize) -> Self::Edge {
426 unsafe { self.as_ref().id2edge(id) }
427 }
428}
429
430impl<'a, G> IndexDigraphRef<'a> for NonNull<G> where G: IndexDigraph + 'a {}