/******************************************************************************* * Copyright (c) 2002 - 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.wala.util.graph.impl; import java.util.Iterator; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.debug.UnimplementedError; import com.ibm.wala.util.graph.INodeWithNumberedEdges; import com.ibm.wala.util.graph.NumberedEdgeManager; import com.ibm.wala.util.intset.IntIterator; import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.SparseIntSet; /** * An object that delegates edge management to the nodes, {@link INodeWithNumberedEdges} */ public class DelegatingNumberedEdgeManager<T extends INodeWithNumberedEdges> implements NumberedEdgeManager<T> { private final DelegatingNumberedNodeManager<T> nodeManager; public DelegatingNumberedEdgeManager(DelegatingNumberedNodeManager<T> nodeManager) { if (nodeManager == null) { throw new IllegalArgumentException("nodeManager is null"); } this.nodeManager = nodeManager; } // TODO: optimization is possible private class IntSetNodeIterator implements Iterator<T> { private final IntIterator delegate; IntSetNodeIterator(IntIterator delegate) { this.delegate = delegate; } @Override public boolean hasNext() { return delegate.hasNext(); } @Override public T next() { return nodeManager.getNode(delegate.next()); } @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } } /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ @Override public Iterator<T> getPredNodes(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); } INodeWithNumberedEdges en = N; IntSet pred = en.getPredNumbers(); Iterator<T> empty = EmptyIterator.instance(); return (pred == null) ? empty : (Iterator<T>) new IntSetNodeIterator(pred.intIterator()); } @Override public IntSet getPredNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("N cannot be null"); } INodeWithNumberedEdges en = node; IntSet pred = en.getPredNumbers(); return (pred == null) ? new SparseIntSet() : pred; } /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ @Override public int getPredNodeCount(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); } INodeWithNumberedEdges en = N; IntSet s = en.getPredNumbers(); if (s == null) { return 0; } else { return s.size(); } } /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ @Override public Iterator<T> getSuccNodes(T N) { if (N == null) { throw new IllegalArgumentException("N cannot be null"); } INodeWithNumberedEdges en = N; IntSet succ = en.getSuccNumbers(); Iterator<T> empty = EmptyIterator.instance(); return (succ == null) ? empty : (Iterator<T>) new IntSetNodeIterator(succ.intIterator()); } /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ @Override public int getSuccNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); } INodeWithNumberedEdges en = N; IntSet s = en.getSuccNumbers(); return s == null ? 0 : s.size(); } /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, com.ibm.wala.util.graph.Node) */ @Override public void addEdge(T src, T dst) { if (dst == null || src == null) { throw new IllegalArgumentException("parameter is null"); } src.addSucc(dst.getGraphNodeId()); dst.addPred(src.getGraphNodeId()); } @Override public void removeEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node is null"); } INodeWithNumberedEdges n = node; n.removeAllIncidentEdges(); } /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ @Override public void removeIncomingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); } INodeWithNumberedEdges n = node; n.removeIncomingEdges(); } /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ @Override public void removeOutgoingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); } INodeWithNumberedEdges n = node; n.removeOutgoingEdges(); } @Override public boolean hasEdge(T src, T dst) throws IllegalArgumentException { if (dst == null) { throw new IllegalArgumentException("dst == null"); } return getSuccNodeNumbers(src).contains(dst.getGraphNodeId()); } @Override public IntSet getSuccNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("node cannot be null"); } INodeWithNumberedEdges en = node; IntSet succ = en.getSuccNumbers(); return (succ == null) ? new SparseIntSet() : succ; } }