package com.mojang.blaze3d.vulkan; import it.unimi.dsi.fastutil.objects.ReferenceArrayList; import it.unimi.dsi.fastutil.objects.ReferenceList; public class DestructionQueue implements AutoCloseable { private final DestructionQueue.Destroyer destroyCallback; private final ReferenceList> destructionQueues; private int currentDestructionQueueIndex = 0; public DestructionQueue(final int internalQueueCount, final DestructionQueue.Destroyer destroyCallback) { this.destroyCallback = destroyCallback; this.destructionQueues = new ReferenceArrayList<>(internalQueueCount); for (int i = 0; i < internalQueueCount; i++) { this.destructionQueues.add(new ReferenceArrayList()); } } public void close() { for (int i = 0; i < this.destructionQueues.size(); i++) { if (this.rotate()) { i = 0; } } } public boolean rotate() { this.currentDestructionQueueIndex++; this.currentDestructionQueueIndex = this.currentDestructionQueueIndex % this.destructionQueues.size(); ReferenceArrayList currentQueue = (ReferenceArrayList)this.destructionQueues.set(this.currentDestructionQueueIndex, new ReferenceArrayList()); if (currentQueue.isEmpty()) { return false; } else { this.destroyCallback.begin(currentQueue.size()); currentQueue.forEach(this.destroyCallback::destroy); this.destroyCallback.end(); return true; } } public void add(final T t) { ReferenceArrayList currentQueue = (ReferenceArrayList)this.destructionQueues.get(this.currentDestructionQueueIndex); currentQueue.add(t); } public interface Destroyer { default void begin(final int count) { } void destroy(T t); default void end() { } } }