You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/12/05 20:10:40 UTC
svn commit: r1772779 -
/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java
Author: schor
Date: Mon Dec 5 20:10:40 2016
New Revision: 1772779
URL: http://svn.apache.org/viewvc?rev=1772779&view=rev
Log:
[UIMA-4674] add iterator over values
Modified:
uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java
Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java?rev=1772779&r1=1772778&r2=1772779&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/Int2ObjHashMap.java Mon Dec 5 20:10:40 2016
@@ -21,6 +21,7 @@ package org.apache.uima.internal.util;
import java.lang.reflect.Array;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.uima.util.impl.Constants;
@@ -309,98 +310,97 @@ public class Int2ObjHashMap<T> {
* @param key -
* @return the probeAddr in keys array - might have a 0 value, or the key value if found
*/
- private int find(final int key) {
- if (key == 0) {
- throw new IllegalArgumentException("0 is an invalid key");
- }
-
- final int hash = Misc.hashInt(key);
+ private int find(final int key) {
+ if (key == 0) {
+ throw new IllegalArgumentException("0 is an invalid key");
+ }
+
+ final int hash = Misc.hashInt(key);
+
+ final int[] localKeys = keys;
+ final int bitMask = localKeys.length - 1;
+ int probeAddr = hash & bitMask;
+
+ // fast paths
+ final int testKey = localKeys[probeAddr];
+ if (testKey == 0 || testKey == key) {
+ if (TUNE) {
+ updateHistogram(1);
+ }
+ return probeAddr;
+ }
- final int[] localKeys = keys;
- final int bitMask = localKeys.length - 1;
- int probeAddr = hash & bitMask;
-
- // fast paths
- final int testKey = localKeys[probeAddr];
- if (testKey == 0 || testKey == key) {
- if (TUNE) {
- updateHistogram(1);
- }
- return probeAddr;
- }
-
- return find2(localKeys, key, probeAddr);
- }
-
+ return find2(localKeys, key, probeAddr);
+ }
- private int find2(final int[] localKeys, final int key, int probeAddr) {
- final int bitMask = localKeys.length - 1;
- int nbrProbes = 2;
- int probeDelta = 1;
- probeAddr = bitMask & (probeAddr + (probeDelta++));
-
- while (true) {
- final int testKey = localKeys[probeAddr];
- if (testKey == 0 || testKey == key) {
- break;
- }
- nbrProbes++;
- probeAddr = bitMask & (probeAddr + (probeDelta++));
- }
-
- if (TUNE) {
- final int pv = histogram[nbrProbes];
-
- histogram[nbrProbes] = 1 + pv;
- if (maxProbe < nbrProbes) {
- maxProbe = nbrProbes;
- }
- }
- return probeAddr;
- }
-
- private void updateHistogram(int nbrProbes) {
- histogram[nbrProbes] = 1 + histogram[nbrProbes];
- if (maxProbe < nbrProbes) {
- maxProbe = nbrProbes;
- }
- }
-
- public T get(int key) {
- return (key == 0) ? null : values[find(key)];
- }
-
- public boolean containsKey(int key) {
- int probeAddr = find(key);
- return probeAddr != 0 && keys[probeAddr] != 0;
- }
-
- public boolean isKeyValid(int position) {
- return (position != 0) && (keys[position] != 0);
- }
-
- public T put(int key, T value) {
- final int i = find(key);
- final boolean keyNotFound = keys[i] == 0;
- final T prevValue = values[i];
- keys[i] = key;
- values[i] = value;
- if (keyNotFound) {
- incrementSize();
- }
- return prevValue;
- }
+ private int find2(final int[] localKeys, final int key, int probeAddr) {
+ final int bitMask = localKeys.length - 1;
+ int nbrProbes = 2;
+ int probeDelta = 1;
+ probeAddr = bitMask & (probeAddr + (probeDelta++));
+
+ while (true) {
+ final int testKey = localKeys[probeAddr];
+ if (testKey == 0 || testKey == key) {
+ break;
+ }
+ nbrProbes++;
+ probeAddr = bitMask & (probeAddr + (probeDelta++));
+ }
+
+ if (TUNE) {
+ final int pv = histogram[nbrProbes];
+
+ histogram[nbrProbes] = 1 + pv;
+ if (maxProbe < nbrProbes) {
+ maxProbe = nbrProbes;
+ }
+ }
+ return probeAddr;
+ }
+
+ private void updateHistogram(int nbrProbes) {
+ histogram[nbrProbes] = 1 + histogram[nbrProbes];
+ if (maxProbe < nbrProbes) {
+ maxProbe = nbrProbes;
+ }
+ }
+
+ public T get(int key) {
+ return (key == 0) ? null : values[find(key)];
+ }
+
+ public boolean containsKey(int key) {
+ int probeAddr = find(key);
+ return probeAddr != 0 && keys[probeAddr] != 0;
+ }
- public void putInner(int key, T value) {
- final int i = find(key);
- assert(keys[i] == 0);
- keys[i] = key;
- values[i] = value;
- }
-
- public int size() {
- return size;
- }
+ public boolean isKeyValid(int position) {
+ return (position != 0) && (keys[position] != 0);
+ }
+
+ public T put(int key, T value) {
+ final int i = find(key);
+ final boolean keyNotFound = keys[i] == 0;
+ final T prevValue = values[i];
+ keys[i] = key;
+ values[i] = value;
+ if (keyNotFound) {
+ incrementSize();
+ }
+ return prevValue;
+ }
+
+ public void putInner(int key, T value) {
+ final int i = find(key);
+ assert (keys[i] == 0);
+ keys[i] = key;
+ values[i] = value;
+ }
+
+ public int size() {
+ return size;
+ }
public int[] getSortedKeys() {
final int size = size();
@@ -430,6 +430,48 @@ public class Int2ObjHashMap<T> {
public IntKeyValueIterator keyValueIterator(int aKey) {
throw new UnsupportedOperationException();// only makes sense for sorted things
}
+
+ public Iterator<T> values() {
+ return new Iterator<T>() {
+
+ /**
+ * Keep this always pointing to a non-0 entry, or
+ * if not valid, outside the range
+ */
+ private int curPosition = 0;
+ { moveToNextFilled(); } // non-static initializer
+
+
+ @Override
+ public boolean hasNext() {
+ return curPosition < keys.length;
+ }
+
+ @Override
+ public T next() {
+ try {
+ final T r = values[curPosition++];
+ moveToNextFilled();
+ return r;
+ } catch (IndexOutOfBoundsException e) {
+ throw new NoSuchElementException();
+ }
+ }
+
+ private void moveToNextFilled() {
+ final int max = keys.length;
+ while (true) {
+ if (curPosition >= max) {
+ return;
+ }
+ if (keys[curPosition] != 0) {
+ return;
+ }
+ curPosition ++;
+ }
+ }
+ };
+ }
public void showHistogram() {
if (TUNE) {