Skip to content
Arc.java 2.51 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.arcs;
Javier Costa's avatar
Javier Costa committed

import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.io.Attribute;
import tfm.arcs.cfg.ControlFlowArc;
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.GraphNode;
Javier Costa's avatar
Javier Costa committed

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

Javier Costa's avatar
Javier Costa committed
public abstract class Arc extends DefaultEdge {
    /** @see tfm.arcs.cfg.ControlFlowArc */
    public final boolean isControlFlowArc() {
        return this instanceof ControlFlowArc;
Javier Costa's avatar
Javier Costa committed
    }

    public final ControlFlowArc asControlFlowArc() {
        if (isControlFlowArc())
            return (ControlFlowArc) this;
        throw new UnsupportedOperationException("Not a ControlFlowArc");
    }
Javier Costa's avatar
Javier Costa committed

    /** @see tfm.arcs.cfg.ControlFlowArc.NonExecutable */
    public final boolean isExecutableControlFlowArc() {
        return this instanceof ControlFlowArc &&
                !(this instanceof ControlFlowArc.NonExecutable);
    }

    /** @see tfm.arcs.pdg.ControlDependencyArc */
    public final boolean isControlDependencyArc() {
        return this instanceof ControlDependencyArc;
    }
Javier Costa's avatar
Javier Costa committed

    public final ControlDependencyArc asControlDependencyArc() {
        if (isControlDependencyArc())
            return (ControlDependencyArc) this;
        throw new UnsupportedOperationException("Not a ControlDependencyArc");
Javier Costa's avatar
Javier Costa committed
    }

    /** @see tfm.arcs.pdg.DataDependencyArc */
    public final boolean isDataDependencyArc() {
        return this instanceof DataDependencyArc;
    }
    public final DataDependencyArc asDataDependencyArc() {
        if (isDataDependencyArc())
            return (DataDependencyArc) this;
        throw new UnsupportedOperationException("Not a DataDependencyArc");
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed
    @Override
    public String toString() {
        return String.format("%s{%d -> %d}", getClass().getName(),
                ((GraphNode<?>) getSource()).getId(), ((GraphNode<?>) getTarget()).getId());
Javier Costa's avatar
Javier Costa committed
    }

    public String getLabel() {
        return "";
Javier Costa's avatar
Javier Costa committed
    }

    public Map<String, Attribute> getDotAttributes() {
        return new HashMap<>();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null)
            return false;
        if (!o.getClass().equals(this.getClass()))
            return false;
        return Objects.equals(getSource(), ((Arc) o).getSource()) &&
                Objects.equals(getTarget(), ((Arc) o).getTarget());
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed
    @Override
    public int hashCode() {
        return Objects.hash(getClass(), getSource(), getTarget());
Javier Costa's avatar
Javier Costa committed
}