More specialized versions of iterators in IEnhancedContainer

This commit is contained in:
DBotThePony 2025-03-14 22:09:32 +07:00
parent 54012cf136
commit 448041fe2e
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -76,10 +76,22 @@ interface IEnhancedContainer<out S : IContainerSlot> : Container, RecipeInput, I
} }
fun nonEmptySlotIterator(): Iterator<S> { fun nonEmptySlotIterator(): Iterator<S> {
return slotIterator().filter { it.isNotEmpty } return nonEmptySlotIndexIterator().map { containerSlot(it) }
} }
private fun slotIterator(allowedSlots: IntCollection, predicate: Predicate<ItemStack>): IntIterator { fun emptySlotIterator(): Iterator<S> {
return emptySlotIndexIterator().map { containerSlot(it) }
}
fun nonEmptySlotIterator(allowedSlots: IntCollection): Iterator<S> {
return nonEmptySlotIndexIterator(allowedSlots).map { containerSlot(it) }
}
fun emptySlotIterator(allowedSlots: IntCollection): Iterator<S> {
return emptySlotIndexIterator(allowedSlots).map { containerSlot(it) }
}
private fun slotIndexWalker(allowedSlots: IntCollection, predicate: Predicate<ItemStack>): IntIterator {
return object : IntIterator() { return object : IntIterator() {
private val parent = allowedSlots.intIterator() private val parent = allowedSlots.intIterator()
private var foundNext = false private var foundNext = false
@ -120,6 +132,14 @@ interface IEnhancedContainer<out S : IContainerSlot> : Container, RecipeInput, I
} }
} }
fun emptySlotIndexIterator(allowedSlots: IntCollection): IntIterator {
return slotIndexWalker(allowedSlots) { it.isEmpty }
}
fun nonEmptySlotIndexIterator(allowedSlots: IntCollection): IntIterator {
return slotIndexWalker(allowedSlots) { it.isNotEmpty }
}
fun emptySlotIndexIterator(): IntIterator { fun emptySlotIndexIterator(): IntIterator {
return emptySlotIndexIterator(slotRange) return emptySlotIndexIterator(slotRange)
} }
@ -128,20 +148,30 @@ interface IEnhancedContainer<out S : IContainerSlot> : Container, RecipeInput, I
return nonEmptySlotIndexIterator(slotRange) return nonEmptySlotIndexIterator(slotRange)
} }
fun emptySlotIndexIterator(allowedSlots: IntCollection): IntIterator { fun slotIndexWithItemIterator(item: Item): IntIterator {
return slotIterator(allowedSlots) { it.isEmpty } return slotIndexWithItemIterator(item, slotRange)
} }
fun nonEmptySlotIndexIterator(allowedSlots: IntCollection): IntIterator { fun slotIndexWithItemIterator(item: Item, allowedSlots: IntCollection): IntIterator {
return slotIterator(allowedSlots) { it.isNotEmpty } val parent = nonEmptySlotIndexIterator(allowedSlots).filter { this[it].isNotEmpty && this[it].item === item }
return object : IntIterator() {
override fun nextInt(): Int {
return parent.next()
}
override fun hasNext(): Boolean {
return parent.hasNext()
}
}
} }
fun slotWithItemIterator(item: Item): IntIterator { fun slotWithItemIterator(item: Item): Iterator<S> {
return slotWithItemIterator(item, slotRange) return slotWithItemIterator(item, slotRange)
} }
fun slotWithItemIterator(item: Item, allowedSlots: IntCollection): IntIterator { fun slotWithItemIterator(item: Item, allowedSlots: IntCollection): Iterator<S> {
return slotIterator(allowedSlots) { it.isNotEmpty && it.item === item } return slotIndexWithItemIterator(item, allowedSlots).map { containerSlot(it) }
} }
fun nextEmptySlot(startIndex: Int): Int { fun nextEmptySlot(startIndex: Int): Int {
@ -257,9 +287,7 @@ interface IEnhancedContainer<out S : IContainerSlot> : Container, RecipeInput, I
return stack return stack
// двигаем в одинаковые слоты // двигаем в одинаковые слоты
for (i in slotWithItemIterator(stack.item, slots)) { for (slot in slotWithItemIterator(stack.item, slots)) {
val slot = containerSlot(i)
val condition: Boolean val condition: Boolean
if (slot is IFilteredContainerSlot) { if (slot is IFilteredContainerSlot) {
@ -295,9 +323,7 @@ interface IEnhancedContainer<out S : IContainerSlot> : Container, RecipeInput, I
} }
if (!onlyIntoExisting) { if (!onlyIntoExisting) {
for (i in emptySlotIndexIterator(slots)) { for (slot in emptySlotIterator(slots)) {
val slot = containerSlot(i)
val condition: Boolean val condition: Boolean
if (slot is IFilteredContainerSlot) { if (slot is IFilteredContainerSlot) {