package org.spaceroots.rkcheck;
import java.util.Vector;
import java.util.TreeSet;
import java.util.Iterator;
/**
* This class generates all trees set for any order.
* @see DerivationTree
* @version $Id: DerivationTreesSetGenerator.java,v 1.2 2002/08/18 13:42:25 luc Exp $
* @author L. Maisonobe
*/
public class DerivationTreesSetGenerator {
/** Build an empty generator.
*/
public DerivationTreesSetGenerator() {
all = new Vector();
}
/** Build the derivation trees up to a specified order.
* @param maxOrder maximal order for which to build the trees
*/
private void buildTrees(int maxOrder) {
TreeSet oldTrees = null;
if (all.isEmpty()) {
// first call, we have no trees set for now
// begin with one set containing one basic tree
oldTrees = new TreeSet();
oldTrees.add(new DerivationTree());
all.add (oldTrees);
} else {
// get the last computed set
oldTrees = (TreeSet) all.elementAt(all.size() - 1);
}
// add new sets as needed
for (int order = all.size(); order < maxOrder; ++order) {
TreeSet newTrees = new TreeSet();
for (Iterator iter = oldTrees.iterator(); iter.hasNext();) {
DerivationTree dt = (DerivationTree) iter.next();
newTrees.addAll(dt.listUpperTrees());
}
oldTrees = newTrees;
all.add (oldTrees);
}
}
/** Get the trees set for the specified order.
* @param order order of the desired trees (must be strictly positive)
* @return the set of trees of the specified order, this set
* contains {@link DerivationTree} elements
*/
public TreeSet getTreesSet(int order) {
if (order < 1) {
throw new IllegalArgumentException("invalid order: " + order
+ " (should be strictly positive)");
}
if (all.size() < order) {
buildTrees(order);
}
return (TreeSet) all.elementAt(order - 1);
}
/** Table of the derivation trees sets. */
Vector all;
}
Ads help maintain this website.