replace ItemEncodedPattern cache with something that actually works

This commit is contained in:
PrototypeTrousers
2023-06-15 21:43:27 -03:00
parent 9d2549bdd8
commit a7c2824624
2 changed files with 107 additions and 3 deletions
@@ -0,0 +1,101 @@
package appeng.util.item;
import it.unimi.dsi.fastutil.Hash;
import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
import java.util.Objects;
/**
* Original code by Eutro, butchered by Prototypetrousers.
* A configurable generator of hashing strategies, allowing for consideration of select properties of ItemStacks when
* considering equality.
*/
public interface ItemStackHashStrategy extends Hash.Strategy<ItemStack> {
/**
* @return a builder object for producing a custom ItemStackHashStrategy.
*/
static ItemStackHashStrategyBuilder builder() {
return new ItemStackHashStrategyBuilder();
}
/**
* Generates an ItemStackHash configured to compare every aspect of ItemStacks except the number
* of items in the stack.
*
* @return the ItemStackHashStrategy as described above.
*/
static ItemStackHashStrategy comparingAllButCount() {
return builder().compareItem(true)
.compareDamage(true)
.compareTag(true)
.build();
}
/**
* Builder pattern class for generating customized ItemStackHashStrategy
*/
class ItemStackHashStrategyBuilder {
private boolean item, damage, tag;
/**
* Defines whether the Item type should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareItem(boolean choice) {
item = choice;
return this;
}
/**
* Defines whether damage values should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareDamage(boolean choice) {
damage = choice;
return this;
}
/**
* Defines whether NBT Tags should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareTag(boolean choice) {
tag = choice;
return this;
}
/**
* @return the ItemStackHashStrategy as configured by "compare" methods.
*/
public ItemStackHashStrategy build() {
return new ItemStackHashStrategy() {
@Override
public int hashCode(@Nullable ItemStack o) {
return o == null || o.isEmpty() ? 0 : Objects.hash(
item ? o.getItem() : null,
damage ? o.getItemDamage() : null,
tag ? o.getTagCompound() : null
);
}
@Override
public boolean equals(@Nullable ItemStack a, @Nullable ItemStack b) {
if (a == null || a.isEmpty()) return b == null || b.isEmpty();
if (b == null || b.isEmpty()) return false;
return (!item || a.getItem() == b.getItem()) &&
(!damage || a.getItemDamage() == b.getItemDamage()) &&
(!tag || Objects.equals(a.getTagCompound(), b.getTagCompound()));
}
};
}
}
}