package edu.uci.ics.jung.graph.util;
import java.io.Serializable;
import java.util.Collection;
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.Forest;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.Tree;
import edu.uci.ics.jung.graph.UndirectedGraph;
/**
* Provides specialized implementations of <code>GraphDecorator</code>.
* Currently these wrapper types include "synchronized" and "unmodifiable".
*
* <p>
* The methods of this class may each throw a <code>NullPointerException</code>
* if the graphs or class objects provided to them are null.
*
* @author Tom Nelson
*/
public class Graphs {
/**
* Returns a synchronized graph backed by the passed argument graph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which a synchronized wrapper is to be created
* @return a synchronized graph backed by the passed argument graph
*/
public static <V, E> Graph<V, E> synchronizedGraph(Graph<V, E> graph) {
return new SynchronizedGraph<V, E>(graph);
}
/**
* Returns a synchronized DirectedGraph backed by the passed DirectedGraph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which a synchronized wrapper is to be created
* @return a synchronized DirectedGraph backed by the passed DirectedGraph
*/
public static <V, E> DirectedGraph<V, E> synchronizedDirectedGraph(
DirectedGraph<V, E> graph) {
return new SynchronizedDirectedGraph<V, E>(graph);
}
/**
* Returns a synchronized UndirectedGraph backed by the passed
* UndirectedGraph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which a synchronized wrapper is to be created
* @return a synchronized UndirectedGraph backed by the passed
* UndirectedGraph
*/
public static <V, E> UndirectedGraph<V, E> synchronizedUndirectedGraph(
UndirectedGraph<V, E> graph) {
return new SynchronizedUndirectedGraph<V, E>(graph);
}
/**
* Returns a synchronized Forest backed by the passed Forest.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param forest
* the forest for which a synchronized wrapper is to be created
* @return a synchronized Forest backed by the passed Forest
*/
public static <V, E> SynchronizedForest<V, E> synchronizedForest(
Forest<V, E> forest) {
return new SynchronizedForest<V, E>(forest);
}
/**
* Returns a synchronized Tree backed by the passed Tree.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param tree
* the tree for which a synchronized wrapper is to be created
* @return a synchronized Tree backed by the passed Tree
*/
public static <V, E> SynchronizedTree<V, E> synchronizedTree(
Tree<V, E> tree) {
return new SynchronizedTree<V, E>(tree);
}
/**
* Returns an unmodifiable Graph backed by the passed Graph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which the unmodifiable wrapper is to be returned
* @return an unmodifiable Graph backed by the passed Graph
*/
public static <V, E> Graph<V, E> unmodifiableGraph(Graph<V, E> graph) {
return new UnmodifiableGraph<V, E>(graph);
}
/**
* Returns an unmodifiable <code>DirectedGraph</code> backed by the passed
* graph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which the unmodifiable wrapper is to be returned
* @return an unmodifiable <code>DirectedGraph</code> backed by the passed
* graph
*/
public static <V, E> DirectedGraph<V, E> unmodifiableDirectedGraph(
DirectedGraph<V, E> graph) {
return new UnmodifiableDirectedGraph<V, E>(graph);
}
/**
* Returns an unmodifiable <code>UndirectedGraph</code> backed by the passed
* graph.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param graph
* the graph for which the unmodifiable wrapper is to be returned
* @return an unmodifiable <code>UndirectedGraph</code> backed by the passed
* graph
*/
public static <V, E> UndirectedGraph<V, E> unmodifiableUndirectedGraph(
UndirectedGraph<V, E> graph) {
return new UnmodifiableUndirectedGraph<V, E>(graph);
}
/**
* Returns an unmodifiable <code>Tree</code> backed by the passed tree.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param tree
* the tree for which the unmodifiable wrapper is to be returned
* @return an unmodifiable <code>Tree</code> backed by the passed tree
*/
public static <V, E> UnmodifiableTree<V, E> unmodifiableTree(
Tree<V, E> tree) {
return new UnmodifiableTree<V, E>(tree);
}
/**
* Returns an unmodifiable <code>Forest</code> backed by the passed forest.
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param forest
* the forest for which the unmodifiable wrapper is to be
* returned
* @return an unmodifiable <code>Forest</code> backed by the passed forest
*/
public static <V, E> UnmodifiableForest<V, E> unmodifiableForest(
Forest<V, E> forest) {
return new UnmodifiableForest<V, E>(forest);
}
@SuppressWarnings("serial")
static abstract class SynchronizedAbstractGraph<V, E>
implements Graph<V, E>, Serializable {
protected Graph<V, E> delegate;
private SynchronizedAbstractGraph(Graph<V, E> delegate) {
if (delegate == null) {
throw new NullPointerException();
}
this.delegate = delegate;
}
/**
* @see edu.uci.ics.jung.graph.Graph#getDefaultEdgeType()
*/
@Override
public EdgeType getDefaultEdgeType() {
return delegate.getDefaultEdgeType();
}
/**
* @see edu.uci.ics.jung.graph.Graph#addEdge(Object, Object, Object,
* EdgeType)
*/
@Override
public synchronized boolean addEdge(E e, V v1, V v2,
EdgeType edgeType) {
return delegate.addEdge(e, v1, v2, edgeType);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#addEdge(Object, Collection,
* EdgeType)
*/
@Override
public synchronized boolean addEdge(E e,
Collection<? extends V> vertices, EdgeType edgeType) {
return delegate.addEdge(e, vertices, edgeType);
}
/**
* @see edu.uci.ics.jung.graph.Graph#addEdge(Object, Object, Object)
*/
@Override
public synchronized boolean addEdge(E e, V v1, V v2) {
return delegate.addEdge(e, v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#addVertex(java.lang.Object)
*/
@Override
public synchronized boolean addVertex(V vertex) {
return delegate.addVertex(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#isIncident(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isIncident(V vertex, E edge) {
return delegate.isIncident(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#isNeighbor(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isNeighbor(V v1, V v2) {
return delegate.isNeighbor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#degree(java.lang.Object)
*/
@Override
public synchronized int degree(V vertex) {
return delegate.degree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#findEdge(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized E findEdge(V v1, V v2) {
return delegate.findEdge(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#findEdgeSet(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized Collection<E> findEdgeSet(V v1, V v2) {
return delegate.findEdgeSet(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdges()
*/
@Override
public synchronized Collection<E> getEdges() {
return delegate.getEdges();
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEdges(EdgeType)
*/
@Override
public synchronized Collection<E> getEdges(EdgeType edgeType) {
return delegate.getEdges(edgeType);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEndpoints(java.lang.Object)
*/
@Override
public synchronized Pair<V> getEndpoints(E edge) {
return delegate.getEndpoints(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentEdges(java.lang.Object)
*/
@Override
public synchronized Collection<E> getIncidentEdges(V vertex) {
return delegate.getIncidentEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentVertices(java.lang.Object)
*/
@Override
public synchronized Collection<V> getIncidentVertices(E edge) {
return delegate.getIncidentVertices(edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getInEdges(java.lang.Object)
*/
@Override
public synchronized Collection<E> getInEdges(V vertex) {
return delegate.getInEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getNeighbors(java.lang.Object)
*/
@Override
public synchronized Collection<V> getNeighbors(V vertex) {
return delegate.getNeighbors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getOpposite(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized V getOpposite(V vertex, E edge) {
return delegate.getOpposite(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getOutEdges(java.lang.Object)
*/
@Override
public synchronized Collection<E> getOutEdges(V vertex) {
return delegate.getOutEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getPredecessors(java.lang.Object)
*/
@Override
public synchronized Collection<V> getPredecessors(V vertex) {
return delegate.getPredecessors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSuccessors(java.lang.Object)
*/
@Override
public synchronized Collection<V> getSuccessors(V vertex) {
return delegate.getSuccessors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getVertices()
*/
@Override
public synchronized Collection<V> getVertices() {
return delegate.getVertices();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdgeCount()
*/
@Override
public synchronized int getEdgeCount() {
return delegate.getEdgeCount();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdgeCount(EdgeType)
*/
@Override
public synchronized int getEdgeCount(EdgeType edge_type) {
return delegate.getEdgeCount(edge_type);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getVertexCount()
*/
@Override
public synchronized int getVertexCount() {
return delegate.getVertexCount();
}
/**
* @see edu.uci.ics.jung.graph.Graph#inDegree(java.lang.Object)
*/
@Override
public synchronized int inDegree(V vertex) {
return delegate.inDegree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEdgeType(java.lang.Object)
*/
@Override
public synchronized EdgeType getEdgeType(E edge) {
return delegate.getEdgeType(edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isPredecessor(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isPredecessor(V v1, V v2) {
return delegate.isPredecessor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isSuccessor(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isSuccessor(V v1, V v2) {
return delegate.isSuccessor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getNeighborCount(java.lang.Object)
*/
@Override
public synchronized int getNeighborCount(V vertex) {
return delegate.getNeighborCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getPredecessorCount(java.lang.Object)
*/
@Override
public synchronized int getPredecessorCount(V vertex) {
return delegate.getPredecessorCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSuccessorCount(java.lang.Object)
*/
@Override
public synchronized int getSuccessorCount(V vertex) {
return delegate.getSuccessorCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#outDegree(java.lang.Object)
*/
@Override
public synchronized int outDegree(V vertex) {
return delegate.outDegree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#removeEdge(java.lang.Object)
*/
@Override
public synchronized boolean removeEdge(E edge) {
return delegate.removeEdge(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#removeVertex(java.lang.Object)
*/
@Override
public synchronized boolean removeVertex(V vertex) {
return delegate.removeVertex(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getDest(java.lang.Object)
*/
@Override
public synchronized V getDest(E directed_edge) {
return delegate.getDest(directed_edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSource(java.lang.Object)
*/
@Override
public synchronized V getSource(E directed_edge) {
return delegate.getSource(directed_edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isDest(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isDest(V vertex, E edge) {
return delegate.isDest(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isSource(java.lang.Object,
* java.lang.Object)
*/
@Override
public synchronized boolean isSource(V vertex, E edge) {
return delegate.isSource(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentCount(Object)
*/
@Override
public synchronized int getIncidentCount(E edge) {
return delegate.getIncidentCount(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#addEdge(java.lang.Object,
* java.util.Collection)
*/
@Override
public synchronized boolean addEdge(E hyperedge,
Collection<? extends V> vertices) {
return delegate.addEdge(hyperedge, vertices);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#containsEdge(java.lang.Object)
*/
@Override
public synchronized boolean containsEdge(E edge) {
return delegate.containsEdge(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#containsVertex(java.lang.Object)
*/
@Override
public synchronized boolean containsVertex(V vertex) {
return delegate.containsVertex(vertex);
}
@Override
public Graph<V, E> newInstance() {
return delegate.newInstance();
}
}
@SuppressWarnings("serial")
static class SynchronizedGraph<V, E> extends SynchronizedAbstractGraph<V, E>
implements Serializable {
private SynchronizedGraph(Graph<V, E> delegate) {
super(delegate);
}
}
@SuppressWarnings("serial")
static class SynchronizedUndirectedGraph<V, E>
extends SynchronizedAbstractGraph<V, E>
implements UndirectedGraph<V, E>, Serializable {
private SynchronizedUndirectedGraph(UndirectedGraph<V, E> delegate) {
super(delegate);
}
}
@SuppressWarnings("serial")
static class SynchronizedDirectedGraph<V, E>
extends SynchronizedAbstractGraph<V, E>
implements DirectedGraph<V, E>, Serializable {
private SynchronizedDirectedGraph(DirectedGraph<V, E> delegate) {
super(delegate);
}
@Override
public synchronized V getDest(E directed_edge) {
return ((DirectedGraph<V, E>) delegate).getDest(directed_edge);
}
@Override
public synchronized V getSource(E directed_edge) {
return ((DirectedGraph<V, E>) delegate).getSource(directed_edge);
}
@Override
public synchronized boolean isDest(V vertex, E edge) {
return ((DirectedGraph<V, E>) delegate).isDest(vertex, edge);
}
@Override
public synchronized boolean isSource(V vertex, E edge) {
return ((DirectedGraph<V, E>) delegate).isSource(vertex, edge);
}
}
@SuppressWarnings("serial")
static class SynchronizedTree<V, E> extends SynchronizedForest<V, E>
implements Tree<V, E> {
/**
* Creates a new instance based on the provided {@code delegate}.
*
* @param delegate
*/
public SynchronizedTree(Tree<V, E> delegate) {
super(delegate);
}
@Override
public synchronized int getDepth(V vertex) {
return ((Tree<V, E>) delegate).getDepth(vertex);
}
@Override
public synchronized int getHeight() {
return ((Tree<V, E>) delegate).getHeight();
}
@Override
public synchronized V getRoot() {
return ((Tree<V, E>) delegate).getRoot();
}
}
@SuppressWarnings("serial")
static class SynchronizedForest<V, E>
extends SynchronizedDirectedGraph<V, E> implements Forest<V, E> {
/**
* Creates a new instance based on the provided {@code delegate}.
*
* @param delegate
*/
public SynchronizedForest(Forest<V, E> delegate) {
super(delegate);
}
@Override
public synchronized Collection<Tree<V, E>> getTrees() {
return ((Forest<V, E>) delegate).getTrees();
}
@Override
public int getChildCount(V vertex) {
return ((Forest<V, E>) delegate).getChildCount(vertex);
}
@Override
public Collection<E> getChildEdges(V vertex) {
return ((Forest<V, E>) delegate).getChildEdges(vertex);
}
@Override
public Collection<V> getChildren(V vertex) {
return ((Forest<V, E>) delegate).getChildren(vertex);
}
@Override
public V getParent(V vertex) {
return ((Forest<V, E>) delegate).getParent(vertex);
}
@Override
public E getParentEdge(V vertex) {
return ((Forest<V, E>) delegate).getParentEdge(vertex);
}
}
@SuppressWarnings("serial")
static abstract class UnmodifiableAbstractGraph<V, E>
implements Graph<V, E>, Serializable {
protected Graph<V, E> delegate;
private UnmodifiableAbstractGraph(Graph<V, E> delegate) {
if (delegate == null) {
throw new NullPointerException();
}
this.delegate = delegate;
}
/**
* @see edu.uci.ics.jung.graph.Graph#getDefaultEdgeType()
*/
@Override
public EdgeType getDefaultEdgeType() {
return delegate.getDefaultEdgeType();
}
/**
* @see edu.uci.ics.jung.graph.Graph#addEdge(Object, Object, Object,
* EdgeType)
*/
@Override
public boolean addEdge(E e, V v1, V v2, EdgeType edgeType) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Graph#addEdge(Object, Collection,
* EdgeType)
*/
@Override
public boolean addEdge(E e, Collection<? extends V> vertices,
EdgeType edgeType) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Graph#addEdge(Object, Object, Object)
*/
@Override
public boolean addEdge(E e, V v1, V v2) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#addVertex(java.lang.Object)
*/
@Override
public boolean addVertex(V vertex) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#isIncident(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isIncident(V vertex, E edge) {
return delegate.isIncident(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#isNeighbor(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isNeighbor(V v1, V v2) {
return delegate.isNeighbor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#degree(java.lang.Object)
*/
@Override
public int degree(V vertex) {
return delegate.degree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#findEdge(java.lang.Object,
* java.lang.Object)
*/
@Override
public E findEdge(V v1, V v2) {
return delegate.findEdge(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#findEdgeSet(java.lang.Object,
* java.lang.Object)
*/
@Override
public Collection<E> findEdgeSet(V v1, V v2) {
return delegate.findEdgeSet(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdges()
*/
@Override
public Collection<E> getEdges() {
return delegate.getEdges();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdgeCount()
*/
@Override
public int getEdgeCount() {
return delegate.getEdgeCount();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getEdgeCount(EdgeType)
*/
@Override
public int getEdgeCount(EdgeType edge_type) {
return delegate.getEdgeCount(edge_type);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getVertexCount()
*/
@Override
public int getVertexCount() {
return delegate.getVertexCount();
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEdges(edu.uci.ics.jung.graph.util.EdgeType)
*/
@Override
public Collection<E> getEdges(EdgeType edgeType) {
return delegate.getEdges(edgeType);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEndpoints(java.lang.Object)
*/
@Override
public Pair<V> getEndpoints(E edge) {
return delegate.getEndpoints(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentEdges(java.lang.Object)
*/
@Override
public Collection<E> getIncidentEdges(V vertex) {
return delegate.getIncidentEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentVertices(java.lang.Object)
*/
@Override
public Collection<V> getIncidentVertices(E edge) {
return delegate.getIncidentVertices(edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getInEdges(java.lang.Object)
*/
@Override
public Collection<E> getInEdges(V vertex) {
return delegate.getInEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getNeighbors(java.lang.Object)
*/
@Override
public Collection<V> getNeighbors(V vertex) {
return delegate.getNeighbors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getOpposite(java.lang.Object,
* java.lang.Object)
*/
@Override
public V getOpposite(V vertex, E edge) {
return delegate.getOpposite(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getOutEdges(java.lang.Object)
*/
@Override
public Collection<E> getOutEdges(V vertex) {
return delegate.getOutEdges(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getPredecessors(java.lang.Object)
*/
@Override
public Collection<V> getPredecessors(V vertex) {
return delegate.getPredecessors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSuccessors(java.lang.Object)
*/
@Override
public Collection<V> getSuccessors(V vertex) {
return delegate.getSuccessors(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getVertices()
*/
@Override
public Collection<V> getVertices() {
return delegate.getVertices();
}
/**
* @see edu.uci.ics.jung.graph.Graph#inDegree(java.lang.Object)
*/
@Override
public int inDegree(V vertex) {
return delegate.inDegree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getEdgeType(java.lang.Object)
*/
@Override
public EdgeType getEdgeType(E edge) {
return delegate.getEdgeType(edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isPredecessor(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isPredecessor(V v1, V v2) {
return delegate.isPredecessor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isSuccessor(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isSuccessor(V v1, V v2) {
return delegate.isSuccessor(v1, v2);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getNeighborCount(java.lang.Object)
*/
@Override
public int getNeighborCount(V vertex) {
return delegate.getNeighborCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getPredecessorCount(java.lang.Object)
*/
@Override
public int getPredecessorCount(V vertex) {
return delegate.getPredecessorCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSuccessorCount(java.lang.Object)
*/
@Override
public int getSuccessorCount(V vertex) {
return delegate.getSuccessorCount(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Graph#outDegree(java.lang.Object)
*/
@Override
public int outDegree(V vertex) {
return delegate.outDegree(vertex);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#removeEdge(java.lang.Object)
*/
@Override
public boolean removeEdge(E edge) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#removeVertex(java.lang.Object)
*/
@Override
public boolean removeVertex(V vertex) {
throw new UnsupportedOperationException();
}
/**
* @see edu.uci.ics.jung.graph.Graph#getDest(java.lang.Object)
*/
@Override
public V getDest(E directed_edge) {
return delegate.getDest(directed_edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#getSource(java.lang.Object)
*/
@Override
public V getSource(E directed_edge) {
return delegate.getSource(directed_edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isDest(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isDest(V vertex, E edge) {
return delegate.isDest(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Graph#isSource(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean isSource(V vertex, E edge) {
return delegate.isSource(vertex, edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#getIncidentCount(Object)
*/
@Override
public int getIncidentCount(E edge) {
return delegate.getIncidentCount(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#addEdge(java.lang.Object,
* java.util.Collection)
*/
@Override
public boolean addEdge(E hyperedge, Collection<? extends V> vertices) {
return delegate.addEdge(hyperedge, vertices);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#containsEdge(java.lang.Object)
*/
@Override
public boolean containsEdge(E edge) {
return delegate.containsEdge(edge);
}
/**
* @see edu.uci.ics.jung.graph.Hypergraph#containsVertex(java.lang.Object)
*/
@Override
public boolean containsVertex(V vertex) {
return delegate.containsVertex(vertex);
}
@Override
public Graph<V, E> newInstance() {
return delegate.newInstance();
}
}
@SuppressWarnings("serial")
static class UnmodifiableGraph<V, E> extends UnmodifiableAbstractGraph<V, E>
implements Serializable {
private UnmodifiableGraph(Graph<V, E> delegate) {
super(delegate);
}
}
@SuppressWarnings("serial")
static class UnmodifiableDirectedGraph<V, E>
extends UnmodifiableAbstractGraph<V, E>
implements DirectedGraph<V, E>, Serializable {
private UnmodifiableDirectedGraph(DirectedGraph<V, E> delegate) {
super(delegate);
}
@Override
public V getDest(E directed_edge) {
return ((DirectedGraph<V, E>) delegate).getDest(directed_edge);
}
@Override
public V getSource(E directed_edge) {
return ((DirectedGraph<V, E>) delegate).getSource(directed_edge);
}
@Override
public boolean isDest(V vertex, E edge) {
return ((DirectedGraph<V, E>) delegate).isDest(vertex, edge);
}
@Override
public boolean isSource(V vertex, E edge) {
return ((DirectedGraph<V, E>) delegate).isSource(vertex, edge);
}
}
@SuppressWarnings("serial")
static class UnmodifiableUndirectedGraph<V, E>
extends UnmodifiableAbstractGraph<V, E>
implements UndirectedGraph<V, E>, Serializable {
private UnmodifiableUndirectedGraph(UndirectedGraph<V, E> delegate) {
super(delegate);
}
}
@SuppressWarnings("serial")
static class UnmodifiableForest<V, E> extends UnmodifiableGraph<V, E>
implements Forest<V, E>, Serializable {
private UnmodifiableForest(Forest<V, E> delegate) {
super(delegate);
}
@Override
public Collection<Tree<V, E>> getTrees() {
return ((Forest<V, E>) delegate).getTrees();
}
@Override
public int getChildCount(V vertex) {
return ((Forest<V, E>) delegate).getChildCount(vertex);
}
@Override
public Collection<E> getChildEdges(V vertex) {
return ((Forest<V, E>) delegate).getChildEdges(vertex);
}
@Override
public Collection<V> getChildren(V vertex) {
return ((Forest<V, E>) delegate).getChildren(vertex);
}
@Override
public V getParent(V vertex) {
return ((Forest<V, E>) delegate).getParent(vertex);
}
@Override
public E getParentEdge(V vertex) {
return ((Forest<V, E>) delegate).getParentEdge(vertex);
}
}
@SuppressWarnings("serial")
static class UnmodifiableTree<V, E> extends UnmodifiableForest<V, E>
implements Tree<V, E>, Serializable {
private UnmodifiableTree(Tree<V, E> delegate) {
super(delegate);
}
@Override
public int getDepth(V vertex) {
return ((Tree<V, E>) delegate).getDepth(vertex);
}
@Override
public int getHeight() {
return ((Tree<V, E>) delegate).getHeight();
}
@Override
public V getRoot() {
return ((Tree<V, E>) delegate).getRoot();
}
@Override
public Collection<Tree<V, E>> getTrees() {
return ((Tree<V, E>) delegate).getTrees();
}
}
}