|
|
@ -92,16 +92,15 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> { |
|
|
|
* @return the instance mapped to toFind, or null if no mapping exists. |
|
|
|
* @return the instance mapped to toFind, or null if no mapping exists. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public V get(final AnyObjectId toFind) { |
|
|
|
public V get(final AnyObjectId toFind) { |
|
|
|
int i = toFind.w1 & mask; |
|
|
|
final int msk = mask; |
|
|
|
|
|
|
|
int i = toFind.w1 & msk; |
|
|
|
final V[] tbl = table; |
|
|
|
final V[] tbl = table; |
|
|
|
final int end = tbl.length; |
|
|
|
|
|
|
|
V obj; |
|
|
|
V obj; |
|
|
|
|
|
|
|
|
|
|
|
while ((obj = tbl[i]) != null) { |
|
|
|
while ((obj = tbl[i]) != null) { |
|
|
|
if (AnyObjectId.equals(obj, toFind)) |
|
|
|
if (AnyObjectId.equals(obj, toFind)) |
|
|
|
return obj; |
|
|
|
return obj; |
|
|
|
if (++i == end) |
|
|
|
i = (i + 1) & msk; |
|
|
|
i = 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
@ -157,16 +156,15 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> { |
|
|
|
* type of instance to store. |
|
|
|
* type of instance to store. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public <Q extends V> V addIfAbsent(final Q newValue) { |
|
|
|
public <Q extends V> V addIfAbsent(final Q newValue) { |
|
|
|
int i = newValue.w1 & mask; |
|
|
|
final int msk = mask; |
|
|
|
|
|
|
|
int i = newValue.w1 & msk; |
|
|
|
final V[] tbl = table; |
|
|
|
final V[] tbl = table; |
|
|
|
final int end = tbl.length; |
|
|
|
|
|
|
|
V obj; |
|
|
|
V obj; |
|
|
|
|
|
|
|
|
|
|
|
while ((obj = tbl[i]) != null) { |
|
|
|
while ((obj = tbl[i]) != null) { |
|
|
|
if (AnyObjectId.equals(obj, newValue)) |
|
|
|
if (AnyObjectId.equals(obj, newValue)) |
|
|
|
return obj; |
|
|
|
return obj; |
|
|
|
if (++i == end) |
|
|
|
i = (i + 1) & msk; |
|
|
|
i = 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (++size == grow) { |
|
|
|
if (++size == grow) { |
|
|
@ -218,13 +216,11 @@ public class ObjectIdSubclassMap<V extends ObjectId> implements Iterable<V> { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void insert(final V newValue) { |
|
|
|
private void insert(final V newValue) { |
|
|
|
int j = newValue.w1 & mask; |
|
|
|
final int msk = mask; |
|
|
|
|
|
|
|
int j = newValue.w1 & msk; |
|
|
|
final V[] tbl = table; |
|
|
|
final V[] tbl = table; |
|
|
|
final int end = tbl.length; |
|
|
|
while (tbl[j] != null) |
|
|
|
while (tbl[j] != null) { |
|
|
|
j = (j + 1) & msk; |
|
|
|
if (++j == end) |
|
|
|
|
|
|
|
j = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
tbl[j] = newValue; |
|
|
|
tbl[j] = newValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|