package net.minecraft.world.level.lighting; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minecraft.world.level.chunk.DataLayer; import org.jetbrains.annotations.Nullable; public abstract class DataLayerStorageMap> { private static final int CACHE_SIZE = 2; private final long[] lastSectionKeys = new long[2]; private final DataLayer[] lastSections = new DataLayer[2]; private boolean cacheEnabled; protected final Long2ObjectOpenHashMap map; protected DataLayerStorageMap(Long2ObjectOpenHashMap map) { this.map = map; this.clearCache(); this.cacheEnabled = true; } public abstract M copy(); public DataLayer copyDataLayer(long index) { DataLayer dataLayer = this.map.get(index).copy(); this.map.put(index, dataLayer); this.clearCache(); return dataLayer; } public boolean hasLayer(long sectionPos) { return this.map.containsKey(sectionPos); } @Nullable public DataLayer getLayer(long sectionPos) { if (this.cacheEnabled) { for (int i = 0; i < 2; i++) { if (sectionPos == this.lastSectionKeys[i]) { return this.lastSections[i]; } } } DataLayer dataLayer = this.map.get(sectionPos); if (dataLayer == null) { return null; } else { if (this.cacheEnabled) { for (int j = 1; j > 0; j--) { this.lastSectionKeys[j] = this.lastSectionKeys[j - 1]; this.lastSections[j] = this.lastSections[j - 1]; } this.lastSectionKeys[0] = sectionPos; this.lastSections[0] = dataLayer; } return dataLayer; } } @Nullable public DataLayer removeLayer(long sectionPos) { return this.map.remove(sectionPos); } public void setLayer(long sectionPos, DataLayer array) { this.map.put(sectionPos, array); } public void clearCache() { for (int i = 0; i < 2; i++) { this.lastSectionKeys[i] = Long.MAX_VALUE; this.lastSections[i] = null; } } public void disableCache() { this.cacheEnabled = false; } }