package net.sf.jlinkgrammar; import java.util.Arrays; /** * TODO add javadoc * */ public class PPLinkset { int hash_table_size; int population; PPLinksetNode hash_table[]; /* data actually lives here */ static PPLinkset PPLinkset_open(int size) { PPLinkset ls; if (size == 0) return null; ls = new PPLinkset(); initialize(ls, size); return ls; } static void initialize(PPLinkset ls, int size) { ls.hash_table_size = size * GlobalBean.LINKSET_SPARSENESS; ls.population = 0; ls.hash_table = new PPLinksetNode[ls.hash_table_size]; clear_hash_table(ls); } static int PPLinkset_add(PPLinkset ls, String str) { /* returns 0 if already there, 1 if new. Stores only the pointer */ if (ls == null) throw new RuntimeException("PPLinkset internal error: Trying to add to a null set"); if (add_internal(ls, str) == null) return 0; ls.population++; return 1; } static boolean PPLinkset_match(PPLinkset ls, String str) { /* Set query. Returns 1 if str pp-matches something in the set, 0 otherwise */ int hashval; PPLinksetNode p; if (ls == null) return false; hashval = compute_hash(ls, str); p = ls.hash_table[hashval]; while (p != null) { if (Postprocessor.post_process_match(p.str, str)) return true; p = p.next; } return false; } static boolean PPLinkset_match_bw(PPLinkset ls, String str) { int hashval; PPLinksetNode p; if (ls == null) return false; hashval = compute_hash(ls, str); p = ls.hash_table[hashval]; while (p != null) { if (Postprocessor.post_process_match(str, p.str)) return true; p = p.next; } return false; } static int PPLinkset_population(PPLinkset ls) { return (ls == null) ? 0 : ls.population; } static PPLinksetNode add_internal(PPLinkset ls, String str) { PPLinksetNode p, n; int hashval; /* look for str (exactly) in linkset */ hashval = compute_hash(ls, str); for (p = ls.hash_table[hashval]; p != null; p = p.next) if (p.str.equals(str)) return null; /* already present */ /* create a new node for u; stick it at head of linked list */ n = new PPLinksetNode(); n.next = ls.hash_table[hashval]; n.str = str; ls.hash_table[hashval] = n; return n; } static int compute_hash(PPLinkset ls, String str) { /* hash is computed from capitalized prefix only */ int i, hashval; hashval = GlobalBean.LINKSET_SEED_VALUE; for (i = 0; i < str.length() && Character.isUpperCase(str.charAt(i)); i++) hashval = str.charAt(i) + 31 * hashval; hashval = hashval % ls.hash_table_size; if (hashval < 0) hashval = -hashval; return hashval; } static void PPLinkset_clear(PPLinkset ls) { /* clear dangling linked lists, but retain hash table itself */ if (ls == null) return; clear_hash_table(ls); ls.population = 0; } static void clear_hash_table(PPLinkset ls) { Arrays.fill(ls.hash_table, null); } }