package edu.berkeley.nlp.lm.map;
import java.io.Serializable;
import java.util.Iterator;
import edu.berkeley.nlp.lm.collections.Iterators;
/**
* Low-level hash map implementation which is actually just an array (used for
* unigrams)
*
* @author adampauls
*
*/
final class UnigramHashMap implements Serializable, HashMap
{
public static long EMPTY_KEY = -1;
/**
*
*/
private static final long serialVersionUID = 1L;
private final long numWords;
private final AbstractNgramMap<?> ngramMap;
public UnigramHashMap(final long numWords, final AbstractNgramMap<?> ngramMap) {
this.numWords = numWords;
this.ngramMap = ngramMap;
}
/*
* (non-Javadoc)
*
* @see edu.berkeley.nlp.lm.map.HashMap#put(long)
*/
@Override
public long put(final long key) {
return ngramMap.wordOf(key);
}
@Override
public final long getOffset(final long key) {
final long word = ngramMap.wordOf(key);
return (word < 0 || word >= numWords) ? EMPTY_KEY : word;
}
@Override
public long getKey(final long contextOffset) {
return ngramMap.combineToKey((int) contextOffset, 0L);
}
@Override
public boolean isEmptyKey(final long key) {
return key == EMPTY_KEY;
}
@Override
public long size() {
return numWords;
}
@Override
public Iterable<Long> keys() {
return Iterators.able(new RangeIterator(numWords));
}
@Override
public double getLoadFactor() {
return 1.0;
}
@Override
public long getCapacity() {
return numWords;
}
private static class RangeIterator implements Iterator<Long>
{
private final long numWords;
private long i = 0;
public RangeIterator(final long numWords) {
this.numWords = numWords;
}
@Override
public boolean hasNext() {
return i < numWords;
}
@Override
public Long next() {
return i++;
}
@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Method not yet implemented");
}
}
@Override
public boolean hasContexts(final int word) {
return (word >= 0 || word < numWords);
}
}