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

参数:

  • 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
        );
    }
}

引用的其他类

  • LoggedChatMessage

    • 引用位置: 方法调用
    • 关联成员: System.identityHashCode()
  • IdMap

    • 引用位置: 实现
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.murmurHash3Mixer()