CrudeIncrementalIntIdentityHashBiMap.java
net.minecraft.util.CrudeIncrementalIntIdentityHashBiMap
信息
- 全限定名:net.minecraft.util.CrudeIncrementalIntIdentityHashBiMap
- 类型:public class
- 包:net.minecraft.util
- 源码路径:src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
- 起始行号:L10
- 实现:IdMap
- 职责:
TODO
字段/常量
-
NOT_FOUND- 类型:
int - 修饰符:
private static final - 源码定位:
L11 - 说明:
TODO
- 类型:
-
EMPTY_SLOT- 类型:
Object - 修饰符:
private static final - 源码定位:
L12 - 说明:
TODO
- 类型:
-
LOADFACTOR- 类型:
float - 修饰符:
private static final - 源码定位:
L13 - 说明:
TODO
- 类型:
-
keys- 类型:
K[] - 修饰符:
private - 源码定位:
L14 - 说明:
TODO
- 类型:
-
values- 类型:
int[] - 修饰符:
private - 源码定位:
L15 - 说明:
TODO
- 类型:
-
byId- 类型:
K[] - 修饰符:
private - 源码定位:
L16 - 说明:
TODO
- 类型:
-
nextId- 类型:
int - 修饰符:
private - 源码定位:
L17 - 说明:
TODO
- 类型:
-
size- 类型:
int - 修饰符:
private - 源码定位:
L18 - 说明:
TODO
- 类型:
内部类/嵌套类型
- 无
构造器
private CrudeIncrementalIntIdentityHashBiMap(int capacity) @ L20
- 构造器名:CrudeIncrementalIntIdentityHashBiMap
- 源码定位:L20
- 修饰符:private
参数:
- capacity: int
说明:
TODO
private CrudeIncrementalIntIdentityHashBiMap(K[] keys, int[] values, K[] byId, int nextId, int size) @ L26
- 构造器名:CrudeIncrementalIntIdentityHashBiMap
- 源码定位:L26
- 修饰符:private
参数:
- keys: K[]
- values: int[]
- byId: K[]
- nextId: int
- size: int
说明:
TODO
方法
下面的方法块按源码顺序生成。
public static <A> CrudeIncrementalIntIdentityHashBiMap<A> create(int initialCapacity) @ L34
- 方法名:create
- 源码定位:L34
- 返回类型: CrudeIncrementalIntIdentityHashBiMap
- 修饰符:public static
参数:
- initialCapacity: int
说明:
TODO
public int getId(K thing) @ L38
- 方法名:getId
- 源码定位:L38
- 返回类型:int
- 修饰符:public
参数:
- thing: K
说明:
TODO
public K byId(int id) @ L43
- 方法名:byId
- 源码定位:L43
- 返回类型:K
- 修饰符:public
参数:
- id: int
说明:
TODO
private int getValue(int index) @ L48
- 方法名:getValue
- 源码定位:L48
- 返回类型:int
- 修饰符:private
参数:
- index: int
说明:
TODO
public boolean contains(K key) @ L52
- 方法名:contains
- 源码定位:L52
- 返回类型:boolean
- 修饰符:public
参数:
- key: K
说明:
TODO
public boolean contains(int id) @ L56
- 方法名:contains
- 源码定位:L56
- 返回类型:boolean
- 修饰符:public
参数:
- id: int
说明:
TODO
public int add(K key) @ L60
- 方法名:add
- 源码定位:L60
- 返回类型:int
- 修饰符:public
参数:
- key: K
说明:
TODO
private int nextId() @ L66
- 方法名:nextId
- 源码定位:L66
- 返回类型:int
- 修饰符:private
参数:
- 无
说明:
TODO
private void grow(int newSize) @ L74
- 方法名:grow
- 源码定位:L74
- 返回类型:void
- 修饰符:private
参数:
- newSize: int
说明:
TODO
public void addMapping(K key, int id) @ L92
- 方法名:addMapping
- 源码定位:L92
- 返回类型:void
- 修饰符:public
参数:
- key: K
- id: int
说明:
TODO
private int hash(K key) @ L114
- 方法名:hash
- 源码定位:L114
- 返回类型:int
- 修饰符:private
参数:
- key: K
说明:
TODO
private int indexOf(K key, int startFrom) @ L118
- 方法名:indexOf
- 源码定位:L118
- 返回类型:int
- 修饰符:private
参数:
- key: K
- startFrom: int
说明:
TODO
private int findEmpty(int startFrom) @ L142
- 方法名:findEmpty
- 源码定位:L142
- 返回类型:int
- 修饰符:private
参数:
- startFrom: int
说明:
TODO
public Iterator<K> iterator() @ L158
- 方法名:iterator
- 源码定位:L158
- 返回类型:Iterator
- 修饰符:public
参数:
- 无
说明:
TODO
public void clear() @ L163
- 方法名:clear
- 源码定位:L163
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public int size() @ L170
- 方法名:size
- 源码定位:L170
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public CrudeIncrementalIntIdentityHashBiMap<K> copy() @ L175
- 方法名:copy
- 源码定位:L175
- 返回类型:CrudeIncrementalIntIdentityHashBiMap
- 修饰符:public
参数:
- 无
说明:
TODO
代码
public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
private static final int NOT_FOUND = -1;
private static final Object EMPTY_SLOT = null;
private static final float LOADFACTOR = 0.8F;
private @Nullable K[] keys;
private int[] values;
private @Nullable K[] byId;
private int nextId;
private int size;
private CrudeIncrementalIntIdentityHashBiMap(int capacity) {
this.keys = (K[])(new Object[capacity]);
this.values = new int[capacity];
this.byId = (K[])(new Object[capacity]);
}
private CrudeIncrementalIntIdentityHashBiMap(K[] keys, int[] values, K[] byId, int nextId, int size) {
this.keys = keys;
this.values = values;
this.byId = byId;
this.nextId = nextId;
this.size = size;
}
public static <A> CrudeIncrementalIntIdentityHashBiMap<A> create(int initialCapacity) {
return new CrudeIncrementalIntIdentityHashBiMap((int)(initialCapacity / 0.8F));
}
@Override
public int getId(@Nullable K thing) {
return this.getValue(this.indexOf(thing, this.hash(thing)));
}
@Override
public @Nullable K byId(int id) {
return id >= 0 && id < this.byId.length ? this.byId[id] : null;
}
private int getValue(int index) {
return index == -1 ? -1 : this.values[index];
}
public boolean contains(K key) {
return this.getId(key) != -1;
}
public boolean contains(int id) {
return this.byId(id) != null;
}
public int add(K key) {
int value = this.nextId();
this.addMapping(key, value);
return value;
}
private int nextId() {
while (this.nextId < this.byId.length && this.byId[this.nextId] != null) {
this.nextId++;
}
return this.nextId;
}
private void grow(int newSize) {
K[] oldKeys = this.keys;
int[] oldValues = this.values;
CrudeIncrementalIntIdentityHashBiMap<K> resized = new CrudeIncrementalIntIdentityHashBiMap<>(newSize);
for (int i = 0; i < oldKeys.length; i++) {
if (oldKeys[i] != null) {
resized.addMapping(oldKeys[i], oldValues[i]);
}
}
this.keys = resized.keys;
this.values = resized.values;
this.byId = resized.byId;
this.nextId = resized.nextId;
this.size = resized.size;
}
public void addMapping(K key, int id) {
int minSize = Math.max(id, this.size + 1);
if (minSize >= this.keys.length * 0.8F) {
int newSize = this.keys.length << 1;
while (newSize < id) {
newSize <<= 1;
}
this.grow(newSize);
}
int index = this.findEmpty(this.hash(key));
this.keys[index] = key;
this.values[index] = id;
this.byId[id] = key;
this.size++;
if (id == this.nextId) {
this.nextId++;
}
}
private int hash(@Nullable K key) {
return (Mth.murmurHash3Mixer(System.identityHashCode(key)) & 2147483647) % this.keys.length;
}
private int indexOf(@Nullable K key, int startFrom) {
for (int i = startFrom; i < this.keys.length; i++) {
if (this.keys[i] == key) {
return i;
}
if (this.keys[i] == EMPTY_SLOT) {
return -1;
}
}
for (int i = 0; i < startFrom; i++) {
if (this.keys[i] == key) {
return i;
}
if (this.keys[i] == EMPTY_SLOT) {
return -1;
}
}
return -1;
}
private int findEmpty(int startFrom) {
for (int i = startFrom; i < this.keys.length; i++) {
if (this.keys[i] == EMPTY_SLOT) {
return i;
}
}
for (int ix = 0; ix < startFrom; ix++) {
if (this.keys[ix] == EMPTY_SLOT) {
return ix;
}
}
throw new RuntimeException("Overflowed :(");
}
@Override
public Iterator<K> iterator() {
return Iterators.filter(Iterators.forArray(this.byId), Predicates.notNull());
}
public void clear() {
Arrays.fill(this.keys, null);
Arrays.fill(this.byId, null);
this.nextId = 0;
this.size = 0;
}
@Override
public int size() {
return this.size;
}
public CrudeIncrementalIntIdentityHashBiMap<K> copy() {
return new CrudeIncrementalIntIdentityHashBiMap<>(
(K[])((Object[])this.keys.clone()), (int[])this.values.clone(), (K[])((Object[])this.byId.clone()), this.nextId, this.size
);
}
}