Commit b4534a52 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Edge: efficiency changes.

- Extends JGraphT's DefaultEdge
- Removed equals and hashCode (were equivalent to Object's)
parent e523e438
Loading
Loading
Loading
Loading
+24 −62
Original line number Diff line number Diff line
package edg.graph;

import edg.constraint.AsteriskConstraint;
import edg.constraint.Constraint;
import edg.constraint.EdgeConstraint;
import edg.constraint.EmptyConstraint;
import org.jgrapht.graph.DefaultEdge;

import java.util.Objects;
import java.util.Random;

public class Edge
{
public class Edge extends DefaultEdge {

	public enum Type {
		ControlFlow, NonExecControlFlow,
		Structural, Control,
@@ -20,116 +19,79 @@ public class Edge
		Class, CallReq
	}

	private boolean mark;
	private final Type type;
	private final EdgeConstraint constraint;

	private boolean mark;
	private EdgeConstraint visibleConstraint;
	protected boolean traversable = true;
	private final int hash;

	public Edge(Type type)
	{
	public Edge(Type type) {
		this(type, type == Type.Structural || type == Type.Control ? AsteriskConstraint.getConstraint() : EmptyConstraint.getConstraint());
	}

	public Edge(Type type, EdgeConstraint constraint)
	{
	public Edge(Type type, EdgeConstraint constraint) {
		Objects.requireNonNull(type, "Edge type can't be null!");
		Objects.requireNonNull(constraint, "Constraint can't be null, use 'EmptyConstraint#getConstraint()'");
		this.type = type;
		this.constraint = constraint;
		this.visibleConstraint = constraint;
		this.hash = new Random().nextInt();
	}

	public void mark()
	{
	public void mark() {
		mark = true;
	}

	public boolean isMarked()
	{
	public boolean isMarked() {
		return mark;
	}

	public Type getType()
	{
	public Type getType() {
		return type;
	}

	public void resetVisibleConstraint() { this.visibleConstraint = this.constraint; }
	public EdgeConstraint getConstraint()
	{
	public void resetVisibleConstraint() {
		this.visibleConstraint = this.constraint;
	}

	public EdgeConstraint getConstraint() {
		return visibleConstraint;
	}
	public void setVisibleConstraint(EdgeConstraint constraint) { visibleConstraint = constraint;}

	public boolean isStructuralEdge()
	{
		return false;
	public void setVisibleConstraint(EdgeConstraint constraint) {
		visibleConstraint = constraint;
	}

	public boolean isTraversable()
	{
	public boolean isTraversable() {
		return traversable;
	}

	public boolean isControlFlowEdge()
	{
	public boolean isControlFlowEdge() {
		return type == Type.ControlFlow || type == Type.NonExecControlFlow;
	}

	public boolean isAST()
	{
	public boolean isAST() {
		return this instanceof NonTraversable && type == Type.Structural;
	}

	@Override
	public String toString()
	{
	public String toString() {
		String str = "type=" + type;
		if (constraint != null)
			str += ",constraint=" + constraint;
		return getClass().getSimpleName() + "[" + str + "]";
	}

	@Override
	public boolean equals(Object o)
	{
		return this == o;
//		if (this == o) return true;
//		if (o == null || getClass() != o.getClass())
//			return false;
//		Edge edge = (Edge) o;
//		return mark == edge.mark &&
//				type == edge.type &&
//				constraint.equals(edge.constraint);
	}

	@Override
	public int hashCode()
	{
		return hash;
	}

	public static class NonTraversable extends Edge
	{
		public NonTraversable(Edge edge)
		{
	public static class NonTraversable extends Edge {
		public NonTraversable(Edge edge) {
			super(edge.getType(), edge.getConstraint());
			mark();
			traversable = false;
		}

		public NonTraversable(Type type)
		{
		public NonTraversable(Type type) {
			super(type);
			traversable = false;
		}

		@Override
		public boolean isStructuralEdge() {
			return true;
		}
	}
}