3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-25 07:40:06 +01:00
Paper/src/main/java/net/minecraft/server/IntHashMap.java

168 Zeilen
4.6 KiB
Java

package net.minecraft.server;
import java.util.HashSet;
import java.util.Set;
public class IntHashMap {
private transient IntHashMapEntry[] a = new IntHashMapEntry[16];
private transient int b;
private int c = 12;
private final float d = 0.75F;
private transient volatile int e;
// private Set f = new HashSet(); // CraftBukkit - expensive and unused
public IntHashMap() {}
private static int g(int i) {
i ^= i >>> 20 ^ i >>> 12;
return i ^ i >>> 7 ^ i >>> 4;
}
private static int a(int i, int j) {
return i & j - 1;
}
public Object get(int i) {
int j = g(i);
for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) {
if (inthashmapentry.a == i) {
return inthashmapentry.b;
}
}
return null;
}
public boolean b(int i) {
return this.c(i) != null;
}
final IntHashMapEntry c(int i) {
int j = g(i);
for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) {
if (inthashmapentry.a == i) {
return inthashmapentry;
}
}
return null;
}
public void a(int i, Object object) {
// this.f.add(Integer.valueOf(i)); // CraftBukkit
int j = g(i);
int k = a(j, this.a.length);
for (IntHashMapEntry inthashmapentry = this.a[k]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) {
if (inthashmapentry.a == i) {
inthashmapentry.b = object;
return;
}
}
++this.e;
this.a(j, i, object, k);
}
private void h(int i) {
IntHashMapEntry[] ainthashmapentry = this.a;
int j = ainthashmapentry.length;
if (j == 1073741824) {
this.c = Integer.MAX_VALUE;
} else {
IntHashMapEntry[] ainthashmapentry1 = new IntHashMapEntry[i];
this.a(ainthashmapentry1);
this.a = ainthashmapentry1;
this.c = (int) ((float) i * this.d);
}
}
private void a(IntHashMapEntry[] ainthashmapentry) {
IntHashMapEntry[] ainthashmapentry1 = this.a;
int i = ainthashmapentry.length;
for (int j = 0; j < ainthashmapentry1.length; ++j) {
IntHashMapEntry inthashmapentry = ainthashmapentry1[j];
if (inthashmapentry != null) {
ainthashmapentry1[j] = null;
IntHashMapEntry inthashmapentry1;
do {
inthashmapentry1 = inthashmapentry.c;
int k = a(inthashmapentry.d, i);
inthashmapentry.c = ainthashmapentry[k];
ainthashmapentry[k] = inthashmapentry;
inthashmapentry = inthashmapentry1;
} while (inthashmapentry1 != null);
}
}
}
public Object d(int i) {
// this.f.remove(Integer.valueOf(i)); // CraftBukkit
IntHashMapEntry inthashmapentry = this.e(i);
return inthashmapentry == null ? null : inthashmapentry.b;
}
final IntHashMapEntry e(int i) {
int j = g(i);
int k = a(j, this.a.length);
IntHashMapEntry inthashmapentry = this.a[k];
IntHashMapEntry inthashmapentry1;
IntHashMapEntry inthashmapentry2;
for (inthashmapentry1 = inthashmapentry; inthashmapentry1 != null; inthashmapentry1 = inthashmapentry2) {
inthashmapentry2 = inthashmapentry1.c;
if (inthashmapentry1.a == i) {
++this.e;
--this.b;
if (inthashmapentry == inthashmapentry1) {
this.a[k] = inthashmapentry2;
} else {
inthashmapentry.c = inthashmapentry2;
}
return inthashmapentry1;
}
inthashmapentry = inthashmapentry1;
}
return inthashmapentry1;
}
public void c() {
++this.e;
IntHashMapEntry[] ainthashmapentry = this.a;
for (int i = 0; i < ainthashmapentry.length; ++i) {
ainthashmapentry[i] = null;
}
this.b = 0;
}
private void a(int i, int j, Object object, int k) {
IntHashMapEntry inthashmapentry = this.a[k];
this.a[k] = new IntHashMapEntry(i, j, object, inthashmapentry);
if (this.b++ >= this.c) {
this.h(2 * this.a.length);
}
}
static int f(int i) {
return g(i);
}
}