package org.basex.util.hash; import org.basex.util.Array; import org.basex.util.TokenBuilder; /** * This is an efficient hash map for tokens, * extending the {@link TokenSet hash set}. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public class TokenMap extends TokenSet { /** Hash values. */ private byte[][] values = new byte[CAP][]; /** * Indexes the specified keys and values. * If the key exists, the value is updated. * @param key key * @param val value */ public final void add(final byte[] key, final byte[] val) { // array bounds are checked before array is resized.. final int i = add(key); values[Math.abs(i)] = val; } /** * Returns the value for the specified key. * @param key key to be found * @return value or {@code null} if nothing was found */ public final byte[] get(final byte[] key) { return key != null ? values[id(key)] : null; } @Override public int delete(final byte[] key) { final int i = super.delete(key); values[i] = null; return i; } /** * Returns the specified value. * @param p value index * @return value */ public final byte[] value(final int p) { return values[p]; } @Override protected final void rehash() { super.rehash(); values = Array.copyOf(values, size << 1); } @Override public final String toString() { final TokenBuilder tb = new TokenBuilder("TokenMap["); final byte[][] ks = keys(); for(int i = 0; i < ks.length; i++) { tb.add(ks[i]).add(" = ").add(get(ks[i])); if(i < ks.length - 1) tb.add(", "); } return tb.add(']').toString(); } }