mirror of
https://github.com/Minestom/Minestom.git
synced 2025-02-04 06:21:52 +01:00
Improve replaceAll
This commit is contained in:
parent
9c8fcc4286
commit
b821619a91
@ -87,64 +87,12 @@ final class PaletteImpl implements Palette, Cloneable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getAll(@NotNull EntryConsumer consumer) {
|
public void getAll(@NotNull EntryConsumer consumer) {
|
||||||
getAllOptional(consumer, true);
|
retrieveAll(consumer, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getAllPresent(@NotNull EntryConsumer consumer) {
|
public void getAllPresent(@NotNull EntryConsumer consumer) {
|
||||||
getAllOptional(consumer, false);
|
retrieveAll(consumer, false);
|
||||||
}
|
|
||||||
|
|
||||||
void getAllOptional(@NotNull EntryConsumer consumer, boolean consumeEmpty) {
|
|
||||||
final long[] values = this.values;
|
|
||||||
final int dimension = this.dimension;
|
|
||||||
if (values.length == 0) {
|
|
||||||
if (consumeEmpty) {
|
|
||||||
// No values, give all 0 to make the consumer happy
|
|
||||||
for (int y = 0; y < dimension; y++)
|
|
||||||
for (int z = 0; z < dimension; z++)
|
|
||||||
for (int x = 0; x < dimension; x++)
|
|
||||||
consumer.accept(x, y, z, 0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final int bitsPerEntry = this.bitsPerEntry;
|
|
||||||
final int magicMask = MAGIC_MASKS[bitsPerEntry];
|
|
||||||
final int valuesPerLong = VALUES_PER_LONG[bitsPerEntry];
|
|
||||||
final int size = this.size;
|
|
||||||
final int dimensionMinus = dimension - 1;
|
|
||||||
final int[] ids = hasPalette ? paletteToValueList.elements() : null;
|
|
||||||
final int dimensionBitCount = this.dimensionBitCount;
|
|
||||||
final int shiftedDimensionBitCount = dimensionBitCount << 1;
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
final long value = values[i];
|
|
||||||
int index = i * valuesPerLong;
|
|
||||||
final int maxIndex = Math.min(index + valuesPerLong, size);
|
|
||||||
if (value == 0) {
|
|
||||||
// No values in this long, skip
|
|
||||||
if (consumeEmpty) {
|
|
||||||
for (; index < maxIndex; index++) {
|
|
||||||
final int y = index >> shiftedDimensionBitCount;
|
|
||||||
final int z = index >> dimensionBitCount & dimensionMinus;
|
|
||||||
final int x = index & dimensionMinus;
|
|
||||||
consumer.accept(x, y, z, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int bitIndex = 0;
|
|
||||||
for (; index < maxIndex; index++) {
|
|
||||||
final short paletteIndex = (short) (value >> bitIndex & magicMask);
|
|
||||||
if (paletteIndex != 0 || consumeEmpty) {
|
|
||||||
final int result = ids != null ? ids[paletteIndex] : paletteIndex;
|
|
||||||
final int y = index >> shiftedDimensionBitCount;
|
|
||||||
final int z = index >> dimensionBitCount & dimensionMinus;
|
|
||||||
final int x = index & dimensionMinus;
|
|
||||||
consumer.accept(x, y, z, result);
|
|
||||||
}
|
|
||||||
bitIndex += bitsPerEntry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -344,6 +292,58 @@ final class PaletteImpl implements Palette, Cloneable {
|
|||||||
return bitsPerEntry > maxBitsPerEntry ? 15 : bitsPerEntry;
|
return bitsPerEntry > maxBitsPerEntry ? 15 : bitsPerEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void retrieveAll(@NotNull EntryConsumer consumer, boolean consumeEmpty) {
|
||||||
|
final long[] values = this.values;
|
||||||
|
final int dimension = this.dimension;
|
||||||
|
if (values.length == 0) {
|
||||||
|
if (consumeEmpty) {
|
||||||
|
// No values, give all 0 to make the consumer happy
|
||||||
|
for (int y = 0; y < dimension; y++)
|
||||||
|
for (int z = 0; z < dimension; z++)
|
||||||
|
for (int x = 0; x < dimension; x++)
|
||||||
|
consumer.accept(x, y, z, 0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final int bitsPerEntry = this.bitsPerEntry;
|
||||||
|
final int magicMask = MAGIC_MASKS[bitsPerEntry];
|
||||||
|
final int valuesPerLong = VALUES_PER_LONG[bitsPerEntry];
|
||||||
|
final int size = this.size;
|
||||||
|
final int dimensionMinus = dimension - 1;
|
||||||
|
final int[] ids = hasPalette ? paletteToValueList.elements() : null;
|
||||||
|
final int dimensionBitCount = this.dimensionBitCount;
|
||||||
|
final int shiftedDimensionBitCount = dimensionBitCount << 1;
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
final long value = values[i];
|
||||||
|
int index = i * valuesPerLong;
|
||||||
|
final int maxIndex = Math.min(index + valuesPerLong, size);
|
||||||
|
if (value == 0) {
|
||||||
|
// No values in this long, skip
|
||||||
|
if (consumeEmpty) {
|
||||||
|
for (; index < maxIndex; index++) {
|
||||||
|
final int y = index >> shiftedDimensionBitCount;
|
||||||
|
final int z = index >> dimensionBitCount & dimensionMinus;
|
||||||
|
final int x = index & dimensionMinus;
|
||||||
|
consumer.accept(x, y, z, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int bitIndex = 0;
|
||||||
|
for (; index < maxIndex; index++) {
|
||||||
|
final short paletteIndex = (short) (value >> bitIndex & magicMask);
|
||||||
|
if (paletteIndex != 0 || consumeEmpty) {
|
||||||
|
final int result = ids != null ? ids[paletteIndex] : paletteIndex;
|
||||||
|
final int y = index >> shiftedDimensionBitCount;
|
||||||
|
final int z = index >> dimensionBitCount & dimensionMinus;
|
||||||
|
final int x = index & dimensionMinus;
|
||||||
|
consumer.accept(x, y, z, result);
|
||||||
|
}
|
||||||
|
bitIndex += bitsPerEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateAll(int[] paletteValues) {
|
private void updateAll(int[] paletteValues) {
|
||||||
final int size = this.size;
|
final int size = this.size;
|
||||||
assert paletteValues.length >= size;
|
assert paletteValues.length >= size;
|
||||||
@ -374,20 +374,11 @@ final class PaletteImpl implements Palette, Cloneable {
|
|||||||
palette.lastPaletteIndex = lastPaletteIndex;
|
palette.lastPaletteIndex = lastPaletteIndex;
|
||||||
palette.paletteToValueList = paletteToValueList;
|
palette.paletteToValueList = paletteToValueList;
|
||||||
palette.valueToPaletteMap = valueToPaletteMap;
|
palette.valueToPaletteMap = valueToPaletteMap;
|
||||||
for (int y = 0; y < dimension; y++) {
|
getAll(palette::set);
|
||||||
for (int z = 0; z < dimension; z++) {
|
|
||||||
for (int x = 0; x < dimension; x++) {
|
|
||||||
palette.set(x, y, z, get(x, y, z));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.bitsPerEntry = palette.bitsPerEntry;
|
this.bitsPerEntry = palette.bitsPerEntry;
|
||||||
|
|
||||||
this.hasPalette = palette.hasPalette;
|
this.hasPalette = palette.hasPalette;
|
||||||
this.lastPaletteIndex = palette.lastPaletteIndex;
|
this.lastPaletteIndex = palette.lastPaletteIndex;
|
||||||
this.count = palette.count;
|
this.count = palette.count;
|
||||||
|
|
||||||
this.values = palette.values;
|
this.values = palette.values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user