/*
* 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.dfsolver;
import java.util.HashSet;
import java.util.Iterator;
import org.jikesrvm.compilers.opt.util.GraphNode;
import org.jikesrvm.compilers.opt.util.GraphNodeEnumeration;
/**
* DF_LatticeCell.java
*
* Represents a single lattice cell in a dataflow system.
*/
public abstract class DF_AbstractCell implements DF_LatticeCell {
/**
* Set of DF_Equations which use this lattice cell.
*/
private final HashSet<DF_Equation> uses;
/**
* Set of DF_Equations which define this lattice cell.
*/
private final HashSet<DF_Equation> defs;
/**
* Default Constructor
*/
public DF_AbstractCell() {
uses = new HashSet<DF_Equation>(1);
defs = new HashSet<DF_Equation>(1);
}
/**
* This constructor bounds the initial capacity to save space.
* @param capacity the initial capacity of the "uses" set
*/
public DF_AbstractCell(int capacity) {
uses = new HashSet<DF_Equation>(capacity);
defs = new HashSet<DF_Equation>(capacity);
}
/**
* Returns an enumeration of the equations in which this
* lattice cell is used.
* @return an enumeration of the equations in which this
* lattice cell is used
*/
public Iterator<DF_Equation> getUses() {
return uses.iterator();
}
/**
* Return an enumeration of the equations in which this
* lattice cell is defined.
* @return an enumeration of the equations in which this
* lattice cell is defined
*/
public Iterator<DF_Equation> getDefs() {
return defs.iterator();
}
/**
* Return a string representation of the cell
* @return a string representation of the cell
*/
public abstract String toString();
/**
* Note that this variable appears on the RHS of an equation.
*
* @param eq the equation
*/
public void addUse(DF_Equation eq) {
uses.add(eq);
}
/**
* Note that this variable appears on the LHS of an equation.
*
* @param eq the equation
*/
public void addDef(DF_Equation eq) {
defs.add(eq);
}
public GraphNodeEnumeration inNodes() {
return new GraphNodeEnumeration() {
private final Iterator<DF_Equation> i = defs.iterator();
public boolean hasMoreElements() { return i.hasNext(); }
public GraphNode next() { return i.next(); }
public GraphNode nextElement() { return next(); }
};
}
public GraphNodeEnumeration outNodes() {
return new GraphNodeEnumeration() {
private final Iterator<DF_Equation> i = uses.iterator();
public boolean hasMoreElements() { return i.hasNext(); }
public GraphNode next() { return i.next(); }
public GraphNode nextElement() { return next(); }
};
}
/**
* Field used for GraphNode interface. TODO: is this needed?
*/
private int index;
/**
* Implementation of GraphNode interface.
*/
public void setIndex(int i) {
index = i;
}
/**
* Implementation of GraphNode interface.
*/
public int getIndex() {
return index;
}
private int scratch;
public int getScratch() {
return scratch;
}
public int setScratch(int o) {
return (scratch = o);
}
}