/**
* <copyright>
* </copyright>
*
* $Id$
*/
package net.sf.orcc.graph.impl;
import java.util.Collection;
import java.util.List;
import net.sf.orcc.graph.Edge;
import net.sf.orcc.graph.Graph;
import net.sf.orcc.graph.GraphFactory;
import net.sf.orcc.graph.GraphPackage;
import net.sf.orcc.graph.Vertex;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
/**
* <!-- begin-user-doc --> An implementation of the model object '
* <em><b>Graph</b></em>'. <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link net.sf.orcc.graph.impl.GraphImpl#getEdges <em>Edges</em>}</li>
* <li>{@link net.sf.orcc.graph.impl.GraphImpl#getVertices <em>Vertices</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class GraphImpl extends VertexImpl implements Graph {
/**
* The cached value of the '{@link #getEdges() <em>Edges</em>}' containment reference list.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getEdges()
* @generated
* @ordered
*/
protected EList<Edge> edges;
/**
* The cached value of the '{@link #getVertices() <em>Vertices</em>}' containment reference list.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #getVertices()
* @generated
* @ordered
*/
protected EList<Vertex> vertices;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected GraphImpl() {
super();
}
@Override
public void add(Edge edge) {
getEdges().add(edge);
}
@Override
public void add(Vertex vertex) {
getVertices().add(vertex);
}
@Override
public Edge add(Vertex source, Vertex target) {
Edge edge = GraphFactory.eINSTANCE.createEdge();
edge.setSource(source);
edge.setTarget(target);
getEdges().add(edge);
return edge;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case GraphPackage.GRAPH__EDGES:
return getEdges();
case GraphPackage.GRAPH__VERTICES:
return getVertices();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd,
int featureID, NotificationChain msgs) {
switch (featureID) {
case GraphPackage.GRAPH__EDGES:
return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
case GraphPackage.GRAPH__VERTICES:
return ((InternalEList<?>) getVertices()).basicRemove(otherEnd,
msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case GraphPackage.GRAPH__EDGES:
return edges != null && !edges.isEmpty();
case GraphPackage.GRAPH__VERTICES:
return vertices != null && !vertices.isEmpty();
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case GraphPackage.GRAPH__EDGES:
getEdges().clear();
getEdges().addAll((Collection<? extends Edge>) newValue);
return;
case GraphPackage.GRAPH__VERTICES:
getVertices().clear();
getVertices().addAll((Collection<? extends Vertex>) newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return GraphPackage.Literals.GRAPH;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case GraphPackage.GRAPH__EDGES:
getEdges().clear();
return;
case GraphPackage.GRAPH__VERTICES:
getVertices().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public EList<Edge> getEdges() {
if (edges == null) {
edges = new EObjectContainmentEList<Edge>(Edge.class, this,
GraphPackage.GRAPH__EDGES);
}
return edges;
}
@Override
public Vertex getFirst() {
Vertex first = null;
for (Vertex vertex : getVertices()) {
if (vertex.getIncoming().isEmpty()) {
if (first != null) {
// first vertex already found, returns null
return null;
}
first = vertex;
}
}
return first;
}
@Override
public Vertex getLast() {
Vertex last = null;
for (Vertex vertex : getVertices()) {
if (vertex.getOutgoing().isEmpty()) {
if (last != null) {
// last vertex already found, returns null
return null;
}
last = vertex;
}
}
return last;
}
@Override
public Vertex getVertex(String name) {
for (Vertex vertex : getVertices()) {
if (name.equals(vertex.getLabel())) {
return vertex;
}
}
return null;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public EList<Vertex> getVertices() {
if (vertices == null) {
vertices = new EObjectContainmentEList<Vertex>(Vertex.class, this,
GraphPackage.GRAPH__VERTICES);
}
return vertices;
}
@Override
public void remove(Edge edge) {
edge.setSource(null);
edge.setTarget(null);
getEdges().remove(edge);
}
@Override
public void remove(Vertex vertex) {
removeEdgesOf(vertex);
getVertices().remove(vertex);
}
@Override
public void removeEdges(List<? extends Edge> edges) {
// disconnect the edges to remove them from incoming/outgoing
// trick so that this method works without the need to copy edges
int i = 0;
int size = edges.size();
while (i < edges.size()) {
Edge edge = edges.get(i);
// disconnect this edge
edge.setSource(null);
edge.setTarget(null);
// remove edge from this graph
getEdges().remove(edge);
// only increment if the list's size did not change
if (size == edges.size()) {
i++;
}
}
}
@Override
public void removeEdgesOf(Vertex vertex) {
removeEdges(vertex.getIncoming());
removeEdges(vertex.getOutgoing());
}
@Override
public void removeVertices(List<? extends Vertex> vertices) {
for (Vertex vertex : vertices) {
removeEdgesOf(vertex);
}
getVertices().removeAll(vertices);
}
} // GraphImpl