package graphutils;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import misc.MultiHashMap;
public abstract class AbstractTwoWayGraph<V, E extends Edge<V>> extends
AbstractGraph<V, E>
{
private MultiHashMap<V, E> inNeighborhood;
public AbstractTwoWayGraph()
{
super();
inNeighborhood = new MultiHashMap<V, E>();
}
public List<E> ingoingEdges(V dst)
{
failIfNotContained(dst);
List<E> list = inNeighborhood.get(dst);
return list != null ? list : new LinkedList<E>();
}
public int inDegree(V vertex)
{
return ingoingEdges(vertex).size();
}
public void addEdge(E edge)
{
super.addEdge(edge);
inNeighborhood.add(edge.getDestination(), edge);
}
@Override
public void removeEdgesFrom(V source)
{
for (E edge : outgoingEdges(source))
{
ingoingEdges(edge.getDestination()).remove(edge);
}
super.removeEdgesFrom(source);
}
@Override
public void removeEdgesTo(V destination)
{
for (E edge : ingoingEdges(destination))
{
outgoingEdges(edge.getSource()).remove(edge);
}
inNeighborhood.removeAll(destination);
}
public void removeEdge(V src, V dst)
{
super.removeEdge(src, dst);
List<E> edges = inNeighborhood.get(dst);
Iterator<E> it = edges.iterator();
E edge;
while (it.hasNext())
{
edge = it.next();
if (edge.getSource() == src)
{
it.remove();
}
}
}
}