package gov.nasa.jpl.mbee.mdk.generator.graphs; import java.util.HashSet; import java.util.Set; public abstract class AbstractGraph<VertexType, EdgeType extends Edge<VertexType>> implements Graph<VertexType, EdgeType> { protected Set<VertexType> V; protected Set<EdgeType> E; public AbstractGraph() { V = new HashSet<VertexType>(); E = new HashSet<EdgeType>(); } @Override public Set<VertexType> getVertices() { return V; } @Override public Set<EdgeType> getEdges() { return E; } @Override public void clear() { V.clear(); E.clear(); } @Override public boolean addVertex(VertexType vertex) { return V.add(vertex); } @Override public boolean addVertices(Set<VertexType> vertices) { boolean added = false; for (VertexType v : vertices) { added = addVertex(v) || added; } return added; } @Override public boolean removeVertex(VertexType vertex) { boolean removed = V.remove(vertex); if (removed) { E.removeAll(findEdgesOf(vertex)); } return removed; } @Override public boolean removeVertices(Set<VertexType> vertices) { boolean removed = false; for (VertexType v : vertices) { removed = removeVertex(v) || removed; } return removed; } @Override public boolean addEdge(EdgeType edge) { boolean added = E.add(edge); if (added) { V.addAll(edge.getVertices()); } return added; } @Override public boolean addEdges(Set<EdgeType> edges) { boolean added = false; for (EdgeType e : edges) { added = addEdge(e) || added; } return added; } @Override public boolean removeEdge(EdgeType edge) { return E.remove(edge); } @Override public boolean removeEdges(Set<EdgeType> edges) { boolean removed = false; for (EdgeType e : edges) { removed = removeEdge(e) || removed; } return removed; } @Override public Set<EdgeType> findEdgesOf(VertexType vertex) { Set<EdgeType> edges = new HashSet<EdgeType>(); for (EdgeType e : E) { if (e.containsVertex(vertex)) { edges.add(e); } } return edges; } @Override public Set<EdgeType> findEdgesOf(Set<VertexType> vertices) { Set<EdgeType> edges = new HashSet<EdgeType>(); if (vertices.isEmpty()) { return edges; } else { for (EdgeType e : E) { if (e.containsAllVertices(vertices)) { edges.add(e); } } return edges; } } @Override public Set<VertexType> findNeighborsOf(VertexType vertex) { Set<VertexType> vertices = new HashSet<VertexType>(); for (EdgeType e : findEdgesOf(vertex)) { vertices.addAll(e.getVertices()); } vertices.remove(vertex); return vertices; } }