| use std::ops::{Deref, Index, IndexMut}; |
| |
| use super::Frozen; |
| use crate::data::{DataMap, DataMapMut}; |
| use crate::graph::Graph; |
| use crate::graph::{GraphIndex, IndexType}; |
| use crate::visit::{Data, GraphProp, IntoNeighborsDirected, IntoNodeIdentifiers, NodeIndexable}; |
| use crate::visit::{ |
| GetAdjacencyMatrix, IntoEdges, IntoEdgesDirected, NodeCompactIndexable, NodeCount, |
| }; |
| use crate::visit::{IntoEdgeReferences, IntoNeighbors, IntoNodeReferences, Visitable}; |
| use crate::{Direction, EdgeType}; |
| |
| impl<'a, G> Frozen<'a, G> { |
| /// Create a new `Frozen` from a mutable reference to a graph. |
| pub fn new(gr: &'a mut G) -> Self { |
| Frozen(gr) |
| } |
| } |
| |
| /// Deref allows transparent access to all shared reference (read-only) |
| /// functionality in the underlying graph. |
| impl<'a, G> Deref for Frozen<'a, G> { |
| type Target = G; |
| fn deref(&self) -> &G { |
| self.0 |
| } |
| } |
| |
| impl<'a, G, I> Index<I> for Frozen<'a, G> |
| where |
| G: Index<I>, |
| { |
| type Output = G::Output; |
| fn index(&self, i: I) -> &G::Output { |
| self.0.index(i) |
| } |
| } |
| |
| impl<'a, G, I> IndexMut<I> for Frozen<'a, G> |
| where |
| G: IndexMut<I>, |
| { |
| fn index_mut(&mut self, i: I) -> &mut G::Output { |
| self.0.index_mut(i) |
| } |
| } |
| |
| impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>> |
| where |
| Ty: EdgeType, |
| Ix: IndexType, |
| { |
| /// Index the `Graph` by two indices, any combination of |
| /// node or edge indices is fine. |
| /// |
| /// **Panics** if the indices are equal or if they are out of bounds. |
| pub fn index_twice_mut<T, U>( |
| &mut self, |
| i: T, |
| j: U, |
| ) -> ( |
| &mut <Graph<N, E, Ty, Ix> as Index<T>>::Output, |
| &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output, |
| ) |
| where |
| Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>, |
| T: GraphIndex, |
| U: GraphIndex, |
| { |
| self.0.index_twice_mut(i, j) |
| } |
| } |
| |
| macro_rules! access0 { |
| ($e:expr) => { |
| $e.0 |
| }; |
| } |
| |
| Data! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| DataMap! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| DataMapMut! {delegate_impl [['a, G], G, Frozen<'a, G>, access0]} |
| GetAdjacencyMatrix! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| IntoEdgeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoEdges! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoEdgesDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoNeighbors! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoNeighborsDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoNodeIdentifiers! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| IntoNodeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} |
| NodeCompactIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| NodeCount! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| NodeIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| GraphProp! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |
| Visitable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} |