68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.level.lighting;
 | |
| 
 | |
| import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet;
 | |
| 
 | |
| public class LeveledPriorityQueue {
 | |
| 	private final int levelCount;
 | |
| 	private final LongLinkedOpenHashSet[] queues;
 | |
| 	private int firstQueuedLevel;
 | |
| 
 | |
| 	public LeveledPriorityQueue(int levelCount, int expectedSize) {
 | |
| 		this.levelCount = levelCount;
 | |
| 		this.queues = new LongLinkedOpenHashSet[levelCount];
 | |
| 
 | |
| 		for (int i = 0; i < levelCount; i++) {
 | |
| 			this.queues[i] = new LongLinkedOpenHashSet(expectedSize, 0.5F) {
 | |
| 				@Override
 | |
| 				protected void rehash(int i) {
 | |
| 					if (i > expectedSize) {
 | |
| 						super.rehash(i);
 | |
| 					}
 | |
| 				}
 | |
| 			};
 | |
| 		}
 | |
| 
 | |
| 		this.firstQueuedLevel = levelCount;
 | |
| 	}
 | |
| 
 | |
| 	public long removeFirstLong() {
 | |
| 		LongLinkedOpenHashSet longLinkedOpenHashSet = this.queues[this.firstQueuedLevel];
 | |
| 		long l = longLinkedOpenHashSet.removeFirstLong();
 | |
| 		if (longLinkedOpenHashSet.isEmpty()) {
 | |
| 			this.checkFirstQueuedLevel(this.levelCount);
 | |
| 		}
 | |
| 
 | |
| 		return l;
 | |
| 	}
 | |
| 
 | |
| 	public boolean isEmpty() {
 | |
| 		return this.firstQueuedLevel >= this.levelCount;
 | |
| 	}
 | |
| 
 | |
| 	public void dequeue(long value, int levelIndex, int endIndex) {
 | |
| 		LongLinkedOpenHashSet longLinkedOpenHashSet = this.queues[levelIndex];
 | |
| 		longLinkedOpenHashSet.remove(value);
 | |
| 		if (longLinkedOpenHashSet.isEmpty() && this.firstQueuedLevel == levelIndex) {
 | |
| 			this.checkFirstQueuedLevel(endIndex);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void enqueue(long value, int levelIndex) {
 | |
| 		this.queues[levelIndex].add(value);
 | |
| 		if (this.firstQueuedLevel > levelIndex) {
 | |
| 			this.firstQueuedLevel = levelIndex;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private void checkFirstQueuedLevel(int endLevelIndex) {
 | |
| 		int i = this.firstQueuedLevel;
 | |
| 		this.firstQueuedLevel = endLevelIndex;
 | |
| 
 | |
| 		for (int j = i + 1; j < endLevelIndex; j++) {
 | |
| 			if (!this.queues[j].isEmpty()) {
 | |
| 				this.firstQueuedLevel = j;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |