package dict;
import brs.*;
import brs.visitor.*;
import java.util.*;
import listFW.*;
import listFW.factory.*;
/**
* An implementation of IDictionary using a BiTree to hold the
* DictionaryPairs.
* @since 04/14/2004 fix lookup bug.
*/
public class DictBT implements IDictionary {
/**
* Visitor to check for emptiness.
* Need only one for all DictBT.
* Non OO!
*/
private static IVisitor IsEmpty = new IVisitor() {
public Object emptyCase(BiTree host, Object input) {
return Boolean.TRUE;
}
public Object nonEmptyCase(BiTree host, Object input) {
return Boolean.FALSE;
}
};
/*
* A binary tree of DictionaryPairs ordered by key
*/
private BiTree _bt = new BiTree();
/*
* A trivial comparator for use by the binary search tree (BST)
* visitors
*/
private Comparator _comparator = new Comparator() {
public int compare(Object x, Object y) {
return ((Comparable)x).compareTo(y);
}
};
/*
* The visitors for basic binary search tree (BST) operations
*/
private IVisitor _finder = new BSTFinder(_comparator);
private IVisitor _inserter = new BSTInserter(_comparator);
private IVisitor _deleter = new BSTDeleter(_comparator);
/**
* Clears the contents of the dictionary leaving it empty.
*
* Implemented by replacing the existing BiTree with a new,
* empty one.
*/
public void clear() {
_bt = new BiTree();
}
/**
* Returns true if the dictionary is empty and false otherwise.
*
* Implemented as a visitor to BiTree.
*/
public boolean isEmpty() {
return ((Boolean)_bt.execute(IsEmpty, null)).booleanValue();
}
/**
* Returns false always.
*/
public boolean isFull() {
return false;
}
/**
* Returns an IList of DictionaryPairs corresponding to the entire
* contents of the dictionary. Like DictLRS, the DictionaryPairs
* are returned in the order defined by Comparable's compareTo().
*
* Implemented as a visitor to BiTree.
*/
public IList elements(final IListFactory lf) {
return (IList)_bt.execute(new IVisitor() {
public Object emptyCase(BiTree host, Object input) {
return input;
}
public Object nonEmptyCase(BiTree host, Object input) {
/*
* Construct the partial list consisting of the host and
* its right subtree.
*/
IList l = lf.makeNEList(host.getRootDat(),
(IList)host.getRightSubTree().execute(this, input));
/*
* Pass the partial list to the left subtree and return
* the list given by the left subtree.
*/
return (IList)host.getLeftSubTree().execute(this, l);
}
}, lf.makeEmptyList());
}
/**
* Returns the DictionaryPair with the given key. If there is not
* a DictionaryPair with the given key, returns null.
*
* Returns a DictionaryPair rather than the value alone so that
* the user can distinguish between not finding the key and
* finding the pair (key, null).
*
* Implemented using BiTree's visitor BSTFinder. Thus, we must
* pass (key, null) rather than key. (What would happen if we didn't?)
*/
public DictionaryPair lookup(Comparable key) {
BiTree result = (BiTree)_bt.execute(_finder, new DictionaryPair(key, null));
return (DictionaryPair)result.execute(new IVisitor() {
public Object emptyCase(BiTree host, Object inp) {
return null;
}
public Object nonEmptyCase(BiTree host, Object inp) {
return host.getRootDat();
}
},null);
}
/**
* Inserts the given key and value. If the given key is already
* in the dictionary, the given value replaces the key's old
* value.
*
* Implemented using BiTree's visitor BSTInserter.
*/
public void insert(Comparable key, Object value) {
_bt.execute(_inserter, new DictionaryPair(key, value));
}
/**
* Removes the DictionaryPair with the given key and returns it.
* If there is not a DictionaryPair with the given key, returns
* null.
*
* Implemented using BiTree's visitor BSTDeleter. Thus, we must
* pass (key, null) rather than key.
*/
public DictionaryPair remove(Comparable key) {
return (DictionaryPair)_bt.execute(_deleter,
new DictionaryPair(key, null));
}
/**
* Delegates the conversion to the BiTree toString().
*/
public String toString() {
return _bt.toString();
}
}