HalfByteSectionPalette class

Пакет: com.hypixel.hytale.server.core.universe.world.chunk.section.palette

Файл: com/hypixel/hytale/server/core/universe/world/chunk/section/palette/HalfByteSectionPalette.java

extends: AbstractSectionPalette

Поля (71)

МодификаторыТипИмя
final int KEY_MASK
Int2ShortMap var1
Byte2ByteMap var1
int var10
short var10
byte var10
byte var11
byte[] var12
it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry var13
byte var15
byte var16
byte var17
short var2
int var2
byte var2
ObjectIterator var2
ByteSet var2
int var2
Int2ByteMap var2
byte var3
byte var3
int var3
it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry var3
ByteSet var3
ByteSet var3
int var3
IntIterator var3
Byte2IntMap var3
int var4
byte var4
int var4
int var4
byte var4
int var4
int var4
int var4
BitSet var4
Entry var5
byte var5
short var5
byte var5
byte var5
it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var5
ObjectIterator var5
Byte2ByteMap var5
var5
Byte2ShortMap var5
int var6
byte var6
int var6
int var6
int var6
byte var6
it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var6
int var6
ObjectIterator var6
var6
byte var7
boolean var7
byte var7
byte var7
int var7
byte var7
it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var7
int var8
int var8
byte var8
byte var8
int var9
int var9
int var9

Методы (24)

МодификаторыВозвратСигнатура
private ByteSet buildInternalByteSetByteSet buildInternalByteSet(IntList var1)
private void createBlockIdvoid createBlockId(byte var1, int var2)
private boolean decrementBlockCountboolean decrementBlockCount(byte var1)
for for(int var8 = var6; var8 < var9; var8++)
for for(int var8 = var6; var8 < var4; var8++)
for for(int var9 = var6; var9 < var4; var9++)
for for(int var7 = 0; var7 < var6; var7++)
for for(int var16 = 0; var16 < 32768; var16++)
for for(int var14 = 0; var14 < var0.blocks.length; var14++)
abstract for for(int var3 = var1.size()
abstract for for(int var3 = 0; var3 < var1.size()
if if(var6 == var3)
if if(var2 == 1)
if if(var4 != -128)
if if(var5 == null)
if if(var5 != null)
private void incrementBlockCountvoid incrementBlockCount(byte var1)
private boolean isValidInternalIdboolean isValidInternalId(int var1)
private int nextInternalIdint nextInternalId(byte var1)
static int sUnsignedInternalIdint sUnsignedInternalId(byte var0)
private int unsignedInternalIdint unsignedInternalId(byte var1)
while while(var9 < var1.length)
while while(var4 < 32768)
while while(var4 < 32768)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.chunk.section.palette;

class="kw">import com.hypixel.hytale.common.util.BitUtil;
class="kw">import com.hypixel.hytale.function.consumer.BiIntConsumer;
class="kw">import com.hypixel.hytale.math.util.NumberUtil;
class="kw">import com.hypixel.hytale.protocol.packets.world.PaletteType;
class="kw">import com.hypixel.hytale.server.core.util.io.MemorySegmentUtil;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2ByteMap;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2ByteOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2IntMap;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2ShortMap;
class="kw">import it.unimi.dsi.fastutil.bytes.Byte2ShortOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.bytes.ByteSet;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ByteMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ByteOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ShortMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ShortMaps;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ShortOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntIterator;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ShortMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.foreign.ValueLayout;
class="kw">import java.util.BitSet;
class="kw">import java.util.function.IntConsumer;
class="kw">import javax.annotation.Nonnull;

class="kw">public class="kw">final class HalfByteSectionPalette class="kw">extends AbstractSectionPalette {
   class="kw">private class="kw">static class="kw">final int KEY_MASK = 15;
   class="kw">public class="kw">static class="kw">final int MAX_SIZE = 16;
   class="kw">final Int2ByteMap externalToInternal;
   class="kw">final Byte2IntMap internalToExternal;
   class="kw">final BitSet internalIdSet;
   class="kw">final Byte2ShortMap internalIdCount;
   class="kw">final byte[] blocks;

   class="kw">public HalfByteSectionPalette() {
      this.externalToInternal = new Int2ByteOpenHashMap();
      this.internalToExternal = new Byte2IntOpenHashMap();
      this.internalIdSet = new BitSet(16);
      this.internalIdCount = new Byte2ShortOpenHashMap();
      this.blocks = new byte[16384];
      this.externalToInternal.put(0, (byte)0);
      this.internalToExternal.put((byte)0, 0);
      this.internalIdSet.set(0);
      this.internalIdCount.put((byte)0, (short)-32768);
   }

   HalfByteSectionPalette(Int2ByteMap var1, Byte2IntMap var2, BitSet var3, Byte2ShortMap var4, byte[] var5) {
      this.externalToInternal = var1;
      this.internalToExternal = var2;
      this.internalIdSet = var3;
      this.internalIdCount = var4;
      this.blocks = var5;
   }

   class="kw">public HalfByteSectionPalette(@Nonnull int[] var1, @Nonnull Int2ShortMap var2) {
      this.blocks = new byte[16384];
      this.externalToInternal = new Int2ByteOpenHashMap(var2.size());
      this.internalToExternal = new Byte2IntOpenHashMap(var2.size());
      this.internalIdSet = new BitSet(var2.size());
      this.internalIdCount = new Byte2ShortOpenHashMap(var2.size());
      byte var3 = 0;

      for (ObjectIterator var4 = Int2ShortMaps.fastIterable(var2).iterator(); var4.hasNext(); var3++) {
         Entry var5 = (Entry)var4.next();
         this.internalToExternal.put(var3, var5.getIntKey());
         this.externalToInternal.put(var5.getIntKey(), var3);
         this.internalIdSet.set(this.unsignedInternalId(var3));
         this.internalIdCount.put(var3, var5.getShortValue());
      }

      int var9 = 0;

      while (var9 < var1.length) {
         int var10 = var1[var9];
         int var6 = var9;

         do {
            var9++;
         } while (var9 < var1.length && var1[var9] == var10);

         byte var7 = this.externalToInternal.get(var10);

         for (int var8 = var6; var8 < var9; var8++) {
            BitUtil.setNibble(this.blocks, var8, var7);
         }
      }
   }

   @Nonnull
   @Override
   class="kw">public PaletteType getPaletteType() {
      class="kw">return PaletteType.HalfByte;
   }

   @Override
   class="kw">public int get(int var1) {
      class="kw">return this.internalToExternal.get(BitUtil.getNibble(this.blocks, var1));
   }

   @Nonnull
   @Override
   class="kw">public AbstractSectionPalette.SetResult set(int var1, int var2) {
      byte var3 = BitUtil.getNibble(this.blocks, var1);
      if (this.externalToInternal.containsKey(var2)) {
         byte var6 = this.externalToInternal.get(var2);
         if (var6 == var3) {
            class="kw">return AbstractSectionPalette.SetResult.UNCHANGED;
         }

         boolean var7 = this.decrementBlockCount(var3);
         this.incrementBlockCount(var6);
         BitUtil.setNibble(this.blocks, var1, var6);
         class="kw">return var7 ? AbstractSectionPalette.SetResult.ADDED_OR_REMOVED : AbstractSectionPalette.SetResult.CHANGED;
      } else {
         int var4 = this.nextInternalId(var3);
         if (!this.isValidInternalId(var4)) {
            class="kw">return AbstractSectionPalette.SetResult.REQUIRES_PROMOTE;
         }

         this.decrementBlockCount(var3);
         byte var5 = (byte)var4;
         this.createBlockId(var5, var2);
         BitUtil.setNibble(this.blocks, var1, var5);
         class="kw">return AbstractSectionPalette.SetResult.ADDED_OR_REMOVED;
      }
   }

   class="kw">private int nextInternalId(byte var1) {
      class="kw">return this.internalIdCount.get(var1) == 1 ? this.unsignedInternalId(var1) : this.internalIdSet.nextClearBit(0);
   }

   class="kw">private void createBlockId(byte var1, int var2) {
      this.internalToExternal.put(var1, var2);
      this.externalToInternal.put(var2, var1);
      this.internalIdSet.set(this.unsignedInternalId(var1));
      this.internalIdCount.put(var1, (short)1);
   }

   class="kw">private boolean decrementBlockCount(byte var1) {
      short var2 = this.internalIdCount.get(var1);
      if (var2 == 1) {
         this.internalIdCount.remove(var1);
         int var3 = this.internalToExternal.remove(var1);
         this.externalToInternal.remove(var3);
         this.internalIdSet.clear(this.unsignedInternalId(var1));
         class="kw">return true;
      } else {
         this.internalIdCount.mergeShort(var1, (short)1, NumberUtil::subtract);
         class="kw">return false;
      }
   }

   class="kw">private void incrementBlockCount(byte var1) {
      this.internalIdCount.mergeShort(var1, (short)1, NumberUtil::sum);
   }

   @Override
   class="kw">public boolean contains(int var1) {
      class="kw">return this.externalToInternal.containsKey(var1);
   }

   @Override
   class="kw">public boolean containsAny(@Nonnull IntList var1) {
      int var2 = 0;

      for (int var3 = var1.size(); var2 < var3; var2++) {
         if (this.externalToInternal.containsKey(var1.getInt(var2))) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   @Override
   class="kw">public int count() {
      class="kw">return this.internalIdCount.size();
   }

   @Override
   class="kw">public int count(int var1) {
      if (this.externalToInternal.containsKey(var1)) {
         byte var2 = this.externalToInternal.get(var1);
         class="kw">return this.internalIdCount.get(var2);
      } else {
         class="kw">return 0;
      }
   }

   @Nonnull
   @Override
   class="kw">public IntSet values() {
      class="kw">return new IntOpenHashSet(this.externalToInternal.keySet());
   }

   @Override
   class="kw">public void forEachValue(@Nonnull IntConsumer var1) {
      this.externalToInternal.keySet().forEach(var1);
   }

   @Nonnull
   @Override
   class="kw">public Int2ShortMap valueCounts() {
      Int2ShortMap var1 = new Int2ShortOpenHashMap();
      ObjectIterator var2 = this.internalIdCount.byte2ShortEntrySet().iterator();

      while (var2.hasNext()) {
         it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry var3 = (it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry)var2.next();
         byte var4 = var3.getByteKey();
         short var5 = var3.getShortValue();
         int var6 = this.internalToExternal.get(var4);
         var1.put(var6, var5);
      }

      class="kw">return var1;
   }

   @Override
   class="kw">public boolean shouldDemote() {
      class="kw">return this.isSolid(0);
   }

   @Nonnull
   @Override
   class="kw">public AbstractSectionPalette demote() {
      class="kw">return EmptySectionPalette.INSTANCE;
   }

   @Nonnull
   class="kw">public ByteSectionPalette promote() {
      class="kw">return ByteSectionPalette.fromHalfBytePalette(this);
   }

   class="kw">private boolean isValidInternalId(int var1) {
      class="kw">return (var1 & 15) == var1;
   }

   class="kw">private int unsignedInternalId(byte var1) {
      class="kw">return var1 & 15;
   }

   class="kw">private class="kw">static int sUnsignedInternalId(byte var0) {
      class="kw">return var0 & 15;
   }

   @Override
   class="kw">public void find(@Nonnull IntList var1, @Nonnull IntConsumer var2) {
      ByteSet var3 = this.buildInternalByteSet(var1);
      if (!var3.isEmpty()) {
         int var4 = 0;
         byte var5 = BitUtil.getNibble(this.blocks, 0);

         while (var4 < 32768) {
            int var6 = var4;
            byte var7 = var5;

            do {
               var4++;
            } while (var4 < 32768 && (var5 = BitUtil.getNibble(this.blocks, var4)) == var7);

            if (var3.contains(var7)) {
               for (int var8 = var6; var8 < var4; var8++) {
                  var2.accept(var8);
               }
            }
         }
      }
   }

   @Override
   class="kw">public void find(@Nonnull IntList var1, @Nonnull BiIntConsumer var2) {
      ByteSet var3 = this.buildInternalByteSet(var1);
      if (!var3.isEmpty()) {
         int var4 = 0;
         byte var5 = BitUtil.getNibble(this.blocks, 0);

         while (var4 < 32768) {
            int var6 = var4;
            byte var7 = var5;

            do {
               var4++;
            } while (var4 < 32768 && (var5 = BitUtil.getNibble(this.blocks, var4)) == var7);

            if (var3.contains(var7)) {
               int var8 = this.internalToExternal.get(var7);

               for (int var9 = var6; var9 < var4; var9++) {
                  var2.accept(var9, var8);
               }
            }
         }
      }
   }

   class="kw">private ByteSet buildInternalByteSet(IntList var1) {
      ByteSet var2 = PaletteSetProvider.get().getByteSet(var1.size());

      for (int var3 = 0; var3 < var1.size(); var3++) {
         byte var4 = this.externalToInternal.getOrDefault(var1.getInt(var3), (byte)-128);
         if (var4 != -128) {
            var2.add(var4);
         }
      }

      class="kw">return var2;
   }

   @Override
   class="kw">public int serializedPacketByteSize() {
      class="kw">return 2 + 7 * this.internalToExternal.size() + this.blocks.length;
   }

   @Override
   class="kw">public int serializeForPacket(MemorySegment var1, int var2) {
      int var3 = var2;
      var1.set(MemorySegmentUtil.SHORT_LE, var3, (short)this.internalToExternal.size());
      var3 += 2;

      for (ObjectIterator var4 = this.internalToExternal.byte2IntEntrySet().iterator(); var4.hasNext(); var3 += 7) {
         it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var5 = (it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry)var4.next();
         byte var6 = var5.getByteKey();
         int var7 = var5.getIntValue();
         var1.set(ValueLayout.JAVA_BYTE, var3, var6);
         var1.set(MemorySegmentUtil.INT_LE, var3 + 1, var7);
         var1.set(MemorySegmentUtil.SHORT_LE, var3 + 1 + 4, this.internalIdCount.get(var6));
      }

      MemorySegment.copy(this.blocks, 0, var1, ValueLayout.JAVA_BYTE, var3, this.blocks.length);
      var3 += this.blocks.length;
      class="kw">return var3 - var2;
   }

   @Override
   class="kw">public int serializedByteSize(AbstractSectionPalette.KeyMemorySerializer var1) {
      int var2 = 2 + 3 * this.internalToExternal.size() + this.blocks.length;
      IntIterator var3 = this.internalToExternal.values().iterator();

      while (var3.hasNext()) {
         int var4 = (Integer)var3.next();
         var2 += var1.keySize(var4);
      }

      class="kw">return var2;
   }

   @Override
   class="kw">public int serialize(AbstractSectionPalette.KeyMemorySerializer var1, MemorySegment var2, int var3) {
      int var4 = var3;
      var2.set(MemorySegmentUtil.SHORT_BE, var4, (short)this.internalToExternal.size());
      var4 += 2;
      ObjectIterator var5 = this.internalToExternal.byte2IntEntrySet().iterator();

      while (var5.hasNext()) {
         it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var6 = (it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry)var5.next();
         byte var7 = var6.getByteKey();
         int var8 = var6.getIntValue();
         var2.set(ValueLayout.JAVA_BYTE, var4, var7);
         var4 += 1 + var1.serialize(var2, var4 + 1, var8);
         var2.set(MemorySegmentUtil.SHORT_BE, var4, this.internalIdCount.get(var7));
         var4 += 2;
      }

      MemorySegment.copy(this.blocks, 0, var2, ValueLayout.JAVA_BYTE, var4, this.blocks.length);
      var4 += this.blocks.length;
      class="kw">return var4 - var3;
   }

   @Override
   class="kw">public int deserialize(AbstractSectionPalette.KeyMemoryDeserializer var1, MemorySegment var2, int var3) {
      int var4 = var3;
      this.externalToInternal.clear();
      this.internalToExternal.clear();
      this.internalIdSet.clear();
      this.internalIdCount.clear();
      Byte2ByteMap var5 = null;
      int var6 = var2.get(MemorySegmentUtil.SHORT_BE, var4);
      var4 += 2;

      for (int var7 = 0; var7 < var6; var7++) {
         byte var8 = var2.get(ValueLayout.JAVA_BYTE, var4);
         int var9 = var1.deserialize(var2, ++var4);
         var4 += var1.keySize(var2, var4);
         short var10 = var2.get(MemorySegmentUtil.SHORT_BE, var4);
         var4 += 2;
         if (this.externalToInternal.containsKey(var9)) {
            byte var11 = this.externalToInternal.get(var9);
            if (var5 == null) {
               var5 = new Byte2ByteOpenHashMap();
            }

            var5.put(var8, var11);
            this.internalIdCount.mergeShort(var11, var10, NumberUtil::sum);
         } else {
            this.externalToInternal.put(var9, var8);
            this.internalToExternal.put(var8, var9);
            this.internalIdSet.set(this.unsignedInternalId(var8));
            this.internalIdCount.put(var8, var10);
         }
      }

      MemorySegment.copy(var2, ValueLayout.JAVA_BYTE, var4, this.blocks, 0, this.blocks.length);
      var4 += this.blocks.length;
      if (var5 != null) {
         for (int var16 = 0; var16 < 32768; var16++) {
            byte var17 = BitUtil.getNibble(this.blocks, var16);
            if (var5.containsKey(var17)) {
               BitUtil.setNibble(this.blocks, var16, var5.get(var17));
            }
         }
      }

      class="kw">return var4 - var3;
   }

   @Nonnull
   class="kw">public class="kw">static HalfByteSectionPalette fromBytePalette(@Nonnull ByteSectionPalette var0) {
      if (var0.count() > 16) {
         throw new IllegalStateException("Cannot demote byte palette to half byte palette. Too many blocks! Count: " + var0.count());
      }

      Byte2ByteMap var1 = new Byte2ByteOpenHashMap();
      Int2ByteMap var2 = new Int2ByteOpenHashMap();
      Byte2IntMap var3 = new Byte2IntOpenHashMap();
      BitSet var4 = new BitSet(16);
      Byte2ShortMap var5 = new Byte2ShortOpenHashMap();
      ObjectIterator var6 = var0.internalToExternal.byte2IntEntrySet().iterator();

      while (var6.hasNext()) {
         it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry var7 = (it.unimi.dsi.fastutil.bytes.Byte2IntMap.Entry)var6.next();
         byte var8 = var7.getByteKey();
         int var9 = var7.getIntValue();
         byte var10 = (byte)var4.nextClearBit(0);
         var4.set(sUnsignedInternalId(var10));
         var1.put(var8, var10);
         var3.put(var10, var9);
         var2.put(var9, var10);
      }

      var6 = var0.internalIdCount.byte2ShortEntrySet().iterator();

      while (var6.hasNext()) {
         it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry var13 = (it.unimi.dsi.fastutil.bytes.Byte2ShortMap.Entry)var6.next();
         var5.put(var1.get(var13.getByteKey()), var13.getShortValue());
      }

      byte[] var12 = new byte[16384];

      for (int var14 = 0; var14 < var0.blocks.length; var14++) {
         byte var15 = var0.blocks[var14];
         byte var16 = var1.get(var15);
         BitUtil.setNibble(var12, var14, var16);
      }

      class="kw">return new HalfByteSectionPalette(var2, var3, var4, var5, var12);
   }
}