public int get(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = Hashing.evenHash(key, mask); int value = missingValue; while (entries[index + 1] != missingValue) { if (entries[index] == key) { value = entries[index + 1]; break; } index = next(index, mask); } return value; }
public int remove(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int keyIndex = Hashing.evenHash(key, mask); int oldValue = missingValue; while (entries[keyIndex + 1] != missingValue) { if (entries[keyIndex] == key) { oldValue = entries[keyIndex + 1]; entries[keyIndex + 1] = missingValue; size--; compactChain(keyIndex); break; } keyIndex = next(keyIndex, mask); } return oldValue; }
index = next(index, mask);
@SuppressWarnings("FinalParameters") private void compactChain(@DoNotSub int deleteKeyIndex) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int keyIndex = deleteKeyIndex; while (true) { keyIndex = next(keyIndex, mask); if (entries[keyIndex + 1] == missingValue) { break; } @DoNotSub final int hash = Hashing.evenHash(entries[keyIndex], mask); if ((keyIndex < hash && (hash <= deleteKeyIndex || deleteKeyIndex <= keyIndex)) || (hash <= deleteKeyIndex && deleteKeyIndex <= keyIndex)) { entries[deleteKeyIndex] = entries[keyIndex]; entries[deleteKeyIndex + 1] = entries[keyIndex + 1]; entries[keyIndex + 1] = missingValue; deleteKeyIndex = keyIndex; } } }
private void rehash(@DoNotSub final int newCapacity) { final int[] oldEntries = entries; final int missingValue = this.missingValue; @DoNotSub final int length = entries.length; capacity(newCapacity); final int[] newEntries = entries; @DoNotSub final int mask = entries.length - 1; for (@DoNotSub int keyIndex = 0; keyIndex < length; keyIndex += 2) { final int value = oldEntries[keyIndex + 1]; if (value != missingValue) { final int key = oldEntries[keyIndex]; @DoNotSub int index = Hashing.evenHash(key, mask); while (newEntries[index + 1] != missingValue) { index = next(index, mask); } newEntries[index] = key; newEntries[index + 1] = value; } } }
public int get(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = Hashing.evenHash(key, mask); int value = missingValue; while (entries[index + 1] != missingValue) { if (entries[index] == key) { value = entries[index + 1]; break; } index = next(index, mask); } return value; }
public int get(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = Hashing.evenHash(key, mask); int value = missingValue; int candidateKey; while ((candidateKey = entries[index]) != missingValue) { if (candidateKey == key) { value = entries[index + 1]; break; } index = next(index, mask); } return value; }
public int remove(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int keyIndex = Hashing.evenHash(key, mask); int oldValue = missingValue; while (entries[keyIndex + 1] != missingValue) { if (entries[keyIndex] == key) { oldValue = entries[keyIndex + 1]; entries[keyIndex + 1] = missingValue; size--; compactChain(keyIndex); break; } keyIndex = next(keyIndex, mask); } return oldValue; }
index = next(index, mask);
public int put(final int key, final int value) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = Hashing.evenHash(key, mask); int oldValue = missingValue; int candidateKey; while ((candidateKey = entries[index]) != missingValue) { if (candidateKey == key) { oldValue = entries[index + 1]; break; } index = next(index, mask); } if (oldValue == missingValue) { ++size; entries[index] = key; } entries[index + 1] = value; increaseCapacity(); return oldValue; }
public int remove(final int key) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = Hashing.evenHash(key, mask); int oldValue = missingValue; int candidateKey; while ((candidateKey = entries[index]) != missingValue) { if (candidateKey == key) { @DoNotSub final int valueIndex = index + 1; oldValue = entries[valueIndex]; entries[index] = missingValue; entries[valueIndex] = missingValue; size--; compactChain(index); break; } index = next(index, mask); } return oldValue; }
@SuppressWarnings("FinalParameters") private void compactChain(@DoNotSub int deleteKeyIndex) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int keyIndex = deleteKeyIndex; while (true) { keyIndex = next(keyIndex, mask); if (entries[keyIndex + 1] == missingValue) { break; } @DoNotSub final int hash = Hashing.evenHash(entries[keyIndex], mask); if ((keyIndex < hash && (hash <= deleteKeyIndex || deleteKeyIndex <= keyIndex)) || (hash <= deleteKeyIndex && deleteKeyIndex <= keyIndex)) { entries[deleteKeyIndex] = entries[keyIndex]; entries[deleteKeyIndex + 1] = entries[keyIndex + 1]; entries[keyIndex + 1] = missingValue; deleteKeyIndex = keyIndex; } } }
private void compactChain(@DoNotSub int deleteIndex) { final int[] entries = this.entries; final int missingValue = this.missingValue; @DoNotSub final int mask = entries.length - 1; @DoNotSub int index = deleteIndex; while (true) { index = next(index, mask); if (entries[index] == missingValue) { break; } @DoNotSub final int hash = Hashing.evenHash(entries[index], mask); if ((index < hash && (hash <= deleteIndex || deleteIndex <= index)) || (hash <= deleteIndex && deleteIndex <= index)) { entries[deleteIndex] = entries[index]; entries[deleteIndex + 1] = entries[index + 1]; entries[index] = missingValue; entries[index + 1] = missingValue; deleteIndex = index; } } }
private void rehash(@DoNotSub final int newCapacity) { final int[] oldEntries = entries; final int missingValue = this.missingValue; @DoNotSub final int length = entries.length; capacity(newCapacity); final int[] newEntries = entries; @DoNotSub final int mask = entries.length - 1; for (@DoNotSub int keyIndex = 0; keyIndex < length; keyIndex += 2) { final int value = oldEntries[keyIndex + 1]; if (value != missingValue) { final int key = oldEntries[keyIndex]; @DoNotSub int index = Hashing.evenHash(key, mask); while (newEntries[index + 1] != missingValue) { index = next(index, mask); } newEntries[index] = key; newEntries[index + 1] = value; } } }