1
2use std::ops::{Deref, Index, IndexMut};
3
4use graph::Graph;
5use super::Frozen;
6use graph::{IndexType, GraphIndex};
7use {
8 Direction,
9 EdgeType,
10};
11use visit::{Data, IntoNodeIdentifiers, GraphProp, NodeIndexable, IntoNeighborsDirected};
12use visit::{IntoNeighbors, IntoNodeReferences, IntoEdgeReferences, Visitable};
13use visit::{NodeCompactIndexable, GetAdjacencyMatrix, NodeCount, IntoEdges, IntoEdgesDirected};
14use data::{DataMap, DataMapMut};
15
16
17impl<'a, G> Frozen<'a, G> {
18 pub fn new(gr: &'a mut G) -> Self {
20 Frozen(gr)
21 }
22}
23
24impl<'a, G> Deref for Frozen<'a, G> {
27 type Target = G;
28 fn deref(&self) -> &G { self.0 }
29}
30
31impl<'a, G, I> Index<I> for Frozen<'a, G>
32 where G: Index<I>
33{
34 type Output = G::Output;
35 fn index(&self, i: I) -> &G::Output { self.0.index(i) }
36}
37
38impl<'a, G, I> IndexMut<I> for Frozen<'a, G>
39 where G: IndexMut<I>
40{
41 fn index_mut(&mut self, i: I) -> &mut G::Output { self.0.index_mut(i) }
42}
43
44impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>>
45 where Ty: EdgeType,
46 Ix: IndexType,
47{
48 pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
53 -> (&mut <Graph<N, E, Ty, Ix> as Index<T>>::Output,
54 &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output)
55 where Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>,
56 T: GraphIndex,
57 U: GraphIndex,
58 {
59 self.0.index_twice_mut(i, j)
60 }
61}
62
63macro_rules! access0 {
64 ($e:expr) => ($e.0);
65}
66
67Data!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
68DataMap!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
69DataMapMut!{delegate_impl [['a, G], G, Frozen<'a, G>, access0]}
70GetAdjacencyMatrix!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
71IntoEdgeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
72IntoEdges!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
73IntoEdgesDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
74IntoNeighbors!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
75IntoNeighborsDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
76IntoNodeIdentifiers!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
77IntoNodeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
78NodeCompactIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
79NodeCount!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
80NodeIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
81GraphProp!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
82Visitable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
83
84
85