blob: e1e05249455a61934b5b4cb26b19ed529cda5c50 [file] [log] [blame]
tome3489412014-08-29 02:30:38 -07001package org.onlab.graph;
2
3import com.google.common.collect.ImmutableSet;
4import com.google.common.collect.ImmutableSetMultimap;
5
6import java.util.Objects;
7import java.util.Set;
8
9import static com.google.common.base.Preconditions.checkNotNull;
10
11/**
12 * Immutable graph implemented using adjacency lists.
13 *
14 * @param <V> vertex type
15 * @param <E> edge type
16 */
17public class AdjacencyListsGraph<V extends Vertex, E extends Edge<V>> implements Graph<V, E> {
18
19 private final Set<V> vertexes;
20 private final Set<E> edges;
21
22 private final ImmutableSetMultimap<V, E> sources;
23 private final ImmutableSetMultimap<V, E> destinations;
24
tome3489412014-08-29 02:30:38 -070025 /**
26 * Creates a graph comprising of the specified vertexes and edges.
27 *
28 * @param vertexes set of graph vertexes
29 * @param edges set of graph edges
30 */
31 public AdjacencyListsGraph(Set<V> vertexes, Set<E> edges) {
32 checkNotNull(vertexes, "Vertex set cannot be null");
33 checkNotNull(edges, "Edge set cannot be null");
34
35 // Record ingress/egress edges for each vertex.
36 ImmutableSetMultimap.Builder<V, E> srcMap = ImmutableSetMultimap.builder();
37 ImmutableSetMultimap.Builder<V, E> dstMap = ImmutableSetMultimap.builder();
38
39 // Also make sure that all edge end-points are added as vertexes
40 ImmutableSet.Builder<V> actualVertexes = ImmutableSet.builder();
41 actualVertexes.addAll(vertexes);
42
43 for (E edge : edges) {
44 srcMap.put(edge.src(), edge);
45 actualVertexes.add(edge.src());
46 dstMap.put(edge.dst(), edge);
47 actualVertexes.add(edge.dst());
48 }
49
50 // Make an immutable copy of the edge and vertex sets
51 this.edges = ImmutableSet.copyOf(edges);
52 this.vertexes = actualVertexes.build();
53
54 // Build immutable copies of sources and destinations edge maps
55 sources = srcMap.build();
56 destinations = dstMap.build();
57 }
58
59 @Override
60 public Set<V> getVertexes() {
61 return vertexes;
62 }
63
64 @Override
65 public Set<E> getEdges() {
66 return edges;
67 }
68
69 @Override
70 public Set<E> getEdgesFrom(V src) {
71 return sources.get(src);
72 }
73
74 @Override
75 public Set<E> getEdgesTo(V dst) {
76 return destinations.get(dst);
77 }
78
79 @Override
80 public boolean equals(Object obj) {
81 if (obj instanceof AdjacencyListsGraph) {
82 AdjacencyListsGraph that = (AdjacencyListsGraph) obj;
83 return this.getClass() == that.getClass() &&
84 Objects.equals(this.vertexes, that.vertexes) &&
85 Objects.equals(this.edges, that.edges);
86 }
87 return false;
88 }
89
90 @Override
91 public int hashCode() {
92 return Objects.hash(vertexes, edges);
93 }
94
95 @Override
96 public String toString() {
97 return com.google.common.base.Objects.toStringHelper(this)
98 .add("vertexes", vertexes)
99 .add("edges", edges)
100 .toString();
101 }
102}