content: 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);
  	}
  
  }