geforkt von Mirrors/Paper
168 Zeilen
4.6 KiB
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);
|
|
}
|
|
}
|