Bucket class
Пакет: com.hypixel.hytale.common.collection
Файл: com/hypixel/hytale/common/collection/BucketList.java
Поля (5)
| Модификаторы | Тип | Имя |
|---|---|---|
|
protected BucketItem<E>[] |
bucketItems |
|
protected boolean |
isEmpty |
|
protected boolean |
isUnsorted |
|
protected int |
size |
|
BucketItem[] |
var2 |
Методы (11)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public void |
addpublic void add(@Nonnull BucketItem<E> var1) |
|
public void |
clearpublic void clear(@Nonnull BucketItemPool<E> var1) |
|
|
for for(int var2 = 0; var2 < this.size; var2++) |
|
public BucketItem<E>[] |
getItemspublic BucketItem<E>[] getItems() |
|
|
if if(!this.isEmpty) |
|
|
if if(this.size == this.bucketItems.length) |
|
|
if if(this.size > 1) |
|
public boolean |
isEmptypublic boolean isEmpty() |
|
public boolean |
isUnsortedpublic boolean isUnsorted() |
|
public int |
sizepublic int size() |
|
public void |
sortpublic void sort(@Nonnull BucketList.SortBufferProvider var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.common.collection;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrays;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrays;
class="kw">import java.util.Comparator;
class="kw">import java.util.function.IntFunction;
class="kw">import java.util.function.Predicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class BucketList<E> {
class="kw">public class="kw">static class="kw">final int INITIAL_BUCKET_ITEM_ARRAY_SIZE = 4;
class="kw">public class="kw">static class="kw">final Comparator<BucketItem<?>> CLOSER_TO_SELF = Comparator.comparingDouble(var0 -> var0.squaredDistance);
class="kw">protected class="kw">static class="kw">final byte[] EMPTY_INDICES = new byte[]{-1};
class="kw">protected BucketItemPool<E> bucketItemPool;
@Nullable
class="kw">protected BucketList.Bucket<E>[] buckets;
class="kw">protected byte[] bucketIndices = EMPTY_INDICES;
class="kw">protected int bucketCount;
class="kw">protected int squaredMaxDistance;
class="kw">public BucketList(BucketItemPool<E> var1) {
this.bucketItemPool = var1;
}
class="kw">public void setBucketItemPool(@Nonnull BucketItemPool<E> var1) {
this.clear();
this.bucketItemPool = var1;
}
class="kw">public void clear() {
if (this.buckets != null && this.bucketItemPool != null) {
for (BucketList.Bucket var4 : this.buckets) {
var4.clear(this.bucketItemPool);
}
}
}
class="kw">public void reset() {
this.clear();
this.buckets = null;
this.bucketCount = 0;
this.bucketIndices = EMPTY_INDICES;
}
class="kw">public void configure(@Nonnull int[] var1) {
this.configure(var1, 4);
}
class="kw">public void configure(@Nonnull int[] var1, int var2) {
if (var1 == null) {
throw new IllegalArgumentException("bucketRanges can't be null");
}
if (var1.length <= 0) {
throw new IllegalArgumentException("bucketRanges can't beempty");
}
int[] var3 = (int[])var1.clone();
IntArrays.quickSort(var3);
if (var3[0] <= 0) {
throw new IllegalArgumentException("bucketRanges entries must be >0");
}
this.configureWithPreSortedArray(var3, var2);
}
class="kw">public void configureWithPreSortedArray(@Nonnull int[] var1) {
this.configureWithPreSortedArray(var1, 4);
}
class="kw">public void configureWithPreSortedArray(@Nonnull int[] var1, int var2) {
this.clear();
this.bucketCount = var1.length;
this.squaredMaxDistance = var1[this.bucketCount - 1];
this.squaredMaxDistance = this.squaredMaxDistance * this.squaredMaxDistance;
this.buckets = new BucketList.Bucket[this.bucketCount];
this.bucketIndices = new byte[this.squaredMaxDistance + 1];
int var3 = 0;
for (int var4 = 0; var4 < this.bucketCount; var4++) {
int var5 = var1[var4] * var1[var4];
this.buckets[var4] = new BucketList.Bucket<>(var2);
for (int var6 = var3; var6 < var5; var6++) {
this.bucketIndices[var6] = (byte)var4;
}
var3 = var5;
}
this.bucketIndices[this.bucketIndices.length - 1] = -1;
}
class="kw">public void configureWithPresortedArray(@Nonnull IntArrayList var1, int var2) {
this.configureWithPreSortedArray(var1.toIntArray(), var2);
}
class="kw">public boolean add(@Nonnull E var1, double var2) {
int var4 = this.getFirstBucketIndex((int)var2);
if (var4 < 0) {
class="kw">return false;
}
BucketItem var5 = this.bucketItemPool.allocate(var1, var2);
this.buckets[var4].add(var5);
class="kw">return true;
}
class="kw">public int getBucketCount() {
class="kw">return this.buckets != null ? this.buckets.length : 0;
}
@Nullable
class="kw">public BucketList.Bucket<E> getBucket(int var1) {
class="kw">return var1 >= 0 && var1 < this.getBucketCount() ? this.buckets[var1] : null;
}
class="kw">public int getFirstBucketIndex(int var1) {
if (var1 == 0) {
class="kw">return this.bucketIndices[0];
}
var1 = Math.min(var1, this.squaredMaxDistance);
class="kw">return var1 <= 0 ? -1 : this.bucketIndices[var1];
}
class="kw">public int getLastBucketIndex(int var1) {
int var2 = Math.min(var1, this.squaredMaxDistance) - 1;
class="kw">return var2 < 0 ? -1 : this.bucketIndices[var2];
}
@Nullable
class="kw">public E getClosestInRange(int var1, int var2, @Nonnull Predicate<E> var3, @Nonnull BucketList.SortBufferProvider var4) {
int var5 = var1 * var1;
int var6 = this.getFirstBucketIndex(var5);
if (var6 < 0) {
class="kw">return null;
}
int var7 = var2 * var2;
int var8 = this.getLastBucketIndex(var7);
for (int var9 = var6; var9 <= var8; var9++) {
BucketList.Bucket var10 = this.buckets[var9];
if (!var10.isEmpty) {
if (var10.isUnsorted) {
var10.sort(var4);
}
BucketItem[] var11 = var10.bucketItems;
int var12 = 0;
for (int var13 = var10.size; var12 < var13; var12++) {
BucketItem var14 = var11[var12];
double var15 = var14.squaredDistance;
if (!(var15 < var5)) {
if (var15 >= var7) {
class="kw">return null;
}
Object var17 = var14.item;
if (var17 != null && var3.test(var17)) {
class="kw">return var17;
}
}
}
}
}
class="kw">return null;
}
class="kw">public class="kw">static void addBucketDistance(@Nonnull IntArrayList var0, int var1, int var2) {
addBucketDistance(var0, var1, var2, -1);
}
class="kw">public class="kw">static void addBucketDistance(@Nonnull IntArrayList var0, int var1, int var2, int var3) {
if (var2 >= 1) {
int var4 = 0;
int var5;
for (var5 = var0.size(); var4 < var5; var4++) {
int var6 = var0.getInt(var4);
if (var6 == var2) {
class="kw">return;
}
if (var6 > var2) {
break;
}
}
var0.add(var4, var2);
if (++var5 > var1) {
int var15 = var0.getInt(0);
int var7 = area(0, var15);
int var8 = Integer.MAX_VALUE;
int var9 = -1;
for (int var13 = 1; var13 < var5; var13++) {
int var10 = var0.getInt(var13);
int var11 = area(var15, var10);
int var12 = var7 + var11;
if (var12 <= var8 && var15 != var3) {
var9 = var13 - 1;
var8 = var12;
}
var15 = var10;
var7 = var11;
}
var0.removeInt(var9);
}
}
}
class="kw">protected class="kw">static int area(int var0, int var1) {
class="kw">return var1 * var1 - var0 * var0;
}
class="kw">public class="kw">static class Bucket<E> {
class="kw">protected BucketItem<E>[] bucketItems;
class="kw">protected int size;
class="kw">protected boolean isUnsorted;
class="kw">protected boolean isEmpty;
class="kw">public Bucket(int var1) {
this.bucketItems = new BucketItem[var1];
this.size = 0;
this.isUnsorted = false;
this.isEmpty = true;
}
class="kw">public BucketItem<E>[] getItems() {
class="kw">return this.bucketItems;
}
class="kw">public int size() {
class="kw">return this.size;
}
class="kw">public boolean isUnsorted() {
class="kw">return this.isUnsorted;
}
class="kw">public boolean isEmpty() {
class="kw">return this.isEmpty;
}
class="kw">public void clear(@Nonnull BucketItemPool<E> var1) {
if (!this.isEmpty) {
var1.deallocate(this.bucketItems, this.size);
for (int var2 = 0; var2 < this.size; var2++) {
this.bucketItems[var2] = null;
}
this.size = 0;
this.isUnsorted = false;
this.isEmpty = true;
}
}
class="kw">public void add(@Nonnull BucketItem<E> var1) {
this.isEmpty = false;
if (this.size == this.bucketItems.length) {
this.bucketItems = (BucketItem<E>[])ObjectArrays.grow(this.bucketItems, this.size + 1);
}
this.bucketItems[this.size++] = var1;
this.isUnsorted = true;
}
class="kw">public void sort(@Nonnull BucketList.SortBufferProvider var1) {
this.isUnsorted = false;
if (this.size > 1) {
BucketItem[] var2 = var1.apply(this.size);
System.arraycopy(this.bucketItems, 0, var2, 0, this.size);
ObjectArrays.mergeSort(this.bucketItems, 0, this.size, BucketList.CLOSER_TO_SELF, var2);
}
}
}
class="kw">public class="kw">static class SortBufferProvider class="kw">implements IntFunction<BucketItem[]> {
class="kw">protected BucketItem[] buffer = new BucketItem[4];
class="kw">public SortBufferProvider() {
}
class="kw">public BucketItem[] apply(int var1) {
if (var1 <= this.buffer.length) {
class="kw">return this.buffer;
}
this.buffer = (BucketItem[])ObjectArrays.grow(this.buffer, var1);
class="kw">return this.buffer;
}
}
}