/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.util;
/**
* SpaceEffGraphEdge is a generic graph edge. Extend this to implement
* specific graph edge types, or use it as a generic edge.
* SpaceEffGraphEdges are directed, and therefore, have a from-node and
* a to-node.
*/
public class SpaceEffGraphEdge implements GraphEdge {
/**
* End node.
*/
protected SpaceEffGraphNode _toNode;
/**
* Start node.
*/
protected SpaceEffGraphNode _fromNode;
/**
* The following word is defined for several uses. The first 4 bits
* are reserved for SpaceEffGraph. Classes that subclass this one
* can use the remaining 28 bits
*/
protected int flags;
static final int VISITED = 0x10000000; // general purpose
static final int BACK_EDGE = 0x20000000; // edge information
static final int DOMINATOR = 0x40000000; // edge information
static final int INFO_MASK = 0x0fffffff;
public final boolean visited() {
return (flags & VISITED) != 0;
}
public final boolean backEdge() {
return (flags & BACK_EDGE) != 0;
}
public final boolean dominatorEdge() {
return (flags & DOMINATOR) != 0;
}
public final void setVisited() {
flags |= VISITED;
}
public final void setBackEdge() {
flags |= BACK_EDGE;
}
public final void setDominatorEdge() {
flags |= DOMINATOR;
}
public final void clearVisited() {
flags &= ~VISITED;
}
public final void clearBackEdge() {
flags &= ~BACK_EDGE;
}
public final void clearDominatorEdge() {
flags &= ~DOMINATOR;
}
public final int getInfo() {
return flags & INFO_MASK;
}
public final void setInfo(int value) {
flags = (flags & ~INFO_MASK) | (value & INFO_MASK);
}
/**
* Get the end node for the edge.
* @return end node for the edge
*/
public final SpaceEffGraphNode toNode() {
return _toNode;
}
/**
* Get the start node for the edge.
* @return start node for the edge
*/
public final SpaceEffGraphNode fromNode() {
return _fromNode;
}
/**
* Set end node.
* WARNING: use with caution
* @param toNode new end node
*/
final void setToNode(SpaceEffGraphNode toNode) {
_toNode = toNode;
}
/**
* Set start node.
* WARNING: use with caution
* @param fromNode new start node
*/
final void setFromNode(SpaceEffGraphNode fromNode) {
_fromNode = fromNode;
}
/**
* Constructs an empty edge.
*/
SpaceEffGraphEdge() {
// explicitly defined to get package-private constructor
}
/**
* Constructs an edge starting at a given node and ending at a given node.
* @param fromNode start node
* @param toNode end node
*/
protected SpaceEffGraphEdge(SpaceEffGraphNode fromNode, SpaceEffGraphNode toNode) {
_toNode = toNode;
_fromNode = fromNode;
}
/**
* Delete this edge from the graph.
*/
final void delete() {
_fromNode.removeOut(this);
_toNode.removeIn(this);
}
/**
* Returns the string representation of the edge type.
* @return string representation of the edge type
*/
public String getTypeString() {
return "";
}
/**
* Returns the string representation of the end node (used for printing).
* @return string representation of the end node
*/
public String toNodeString() {
return "---> " + _toNode;
}
/**
* Returns the string representation of the start node (used for printing).
* @return string representation of the start node
*/
public String fromNodeString() {
return "<--- " + _fromNode;
}
/**
* Get the end node for the edge.
* @return end node for the edge
*/
@Override
public final GraphNode to() {
return _toNode;
}
/**
* Get the start node for the edge.
* @return start node for the edge
*/
@Override
public final GraphNode from() {
return _fromNode;
}
/**
* Links inlined from LinkedListElement2.
*/
protected SpaceEffGraphEdge nextIn, nextOut;
/**
* Get the next in edge.
* @return next in edge.
*/
public final SpaceEffGraphEdge getNextIn() {
return nextIn;
}
/**
* Get the next out edge.
* @return next out edge.
*/
public final SpaceEffGraphEdge getNextOut() {
return nextOut;
}
/**
* Append a given edge after this edge as an in edge.
* @param e the edge to append
*/
final void appendIn(SpaceEffGraphEdge e) {
nextIn = e;
}
/**
* Append a given edge after this edge as an out edge.
* @param e the edge to append
*/
final void appendOut(SpaceEffGraphEdge e) {
nextOut = e;
}
}