From 73f113ed9bc955ff81fd0ccf594ee6efefb2f8c0 Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Sat, 13 Aug 2022 15:20:48 -0700 Subject: [PATCH] Use ItemStackMap from GTNHLib --- dependencies.gradle | 2 +- repositories.gradle | 5 +- .../structurelib/util/InventoryUtility.java | 1 + .../structurelib/util/ItemStackMap.java | 464 ------------------ 4 files changed, 6 insertions(+), 466 deletions(-) delete mode 100644 src/main/java/com/gtnewhorizon/structurelib/util/ItemStackMap.java diff --git a/dependencies.gradle b/dependencies.gradle index b6456d02..f20c9900 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,5 +1,5 @@ // Add your dependencies here dependencies { - + compile("com.github.GTNewHorizons:GTNHLib:0.0.1:dev") } diff --git a/repositories.gradle b/repositories.gradle index f7d641bc..caa501d8 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -1,5 +1,8 @@ // Add any additional repositiroes for your dependencies here repositories { - + maven { + name = "GTNH" + url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" + } } diff --git a/src/main/java/com/gtnewhorizon/structurelib/util/InventoryUtility.java b/src/main/java/com/gtnewhorizon/structurelib/util/InventoryUtility.java index e572e8f5..989f223b 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/util/InventoryUtility.java +++ b/src/main/java/com/gtnewhorizon/structurelib/util/InventoryUtility.java @@ -18,6 +18,7 @@ */ package com.gtnewhorizon.structurelib.util; +import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap; import com.gtnewhorizon.structurelib.util.InventoryUtility.ItemStackExtractor.APIType; import com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode; import java.util.*; diff --git a/src/main/java/com/gtnewhorizon/structurelib/util/ItemStackMap.java b/src/main/java/com/gtnewhorizon/structurelib/util/ItemStackMap.java deleted file mode 100644 index 9f729e69..00000000 --- a/src/main/java/com/gtnewhorizon/structurelib/util/ItemStackMap.java +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (c) 2021, glee8e, Code Chicken. - * - * This file is originally part of NotEnoughtItem by Code Chicken. - * It is adapted to implement the standard Map interface by glease - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 2.1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package com.gtnewhorizon.structurelib.util; - -import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE; - -import com.google.common.base.Objects; -import com.google.common.collect.Iterators; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -/** - * A map class for ItemStack keys with wildcard damage/NBT. Optimised for lookup. - *

- * This map does NOT support null values or null keys! null will be silently ignored! - *

- * Originally created by CodeChicken for NotEnoughItems. Adapted to {@code Map} interface by glee8e - * @author CodeChiken - * @author glee8e - */ -public final class ItemStackMap extends AbstractMap { - public static final NBTTagCompound WILDCARD_TAG; - - static { - WILDCARD_TAG = new NBTTagCompound(); - WILDCARD_TAG.setBoolean("*", true); - } - - private final HashMap itemMap = new HashMap<>(); - private int size; - - static ItemStack newItemStack(Item item, int size, int damage, NBTTagCompound tag) { - ItemStack stack = new ItemStack(item, size, damage); - stack.stackTagCompound = tag; - return stack; - } - - static int actualDamage(ItemStack stack) { - return Items.diamond.getDamage(stack); - } - - static int getKeyType(int damage, NBTTagCompound tag) { - int i = 0; - if (isWildcard(damage)) i = 1; - if (isWildcard(tag)) i |= 2; - return i; - } - - static ItemStack wildcard(Item item) { - return newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG); - } - - static boolean isWildcard(int damage) { - return damage == WILDCARD_VALUE; - } - - static boolean isWildcard(NBTTagCompound tag) { - return tag != null && tag.getBoolean("*"); - } - - @Override - public T get(Object key) { - if (!(key instanceof ItemStack)) return null; - ItemStack stack = ((ItemStack) key); - if (stack.getItem() == null) return null; - DetailMap map = itemMap.get(stack.getItem()); - return map == null ? null : map.get(stack); - } - - @Override - public T put(ItemStack key, T value) { - if (key == null || key.getItem() == null || value == null) return null; - return itemMap.computeIfAbsent(key.getItem(), k -> new DetailMap()).put(key, value); - } - - @Override - public T remove(Object key) { - if (!(key instanceof ItemStack)) return null; - ItemStack stack = ((ItemStack) key); - if (stack.getItem() == null) return null; - DetailMap map = itemMap.get(stack.getItem()); - return map == null ? null : map.remove(stack); - } - - @Override - public boolean containsKey(Object key) { - if (!(key instanceof ItemStack)) return false; - ItemStack stack = ((ItemStack) key); - if (stack.getItem() == null) return false; - DetailMap map = itemMap.get(stack.getItem()); - return map != null && map.get(stack) != null; - } - - @Override - public void clear() { - itemMap.clear(); - size = 0; - } - - @Override - public Set> entrySet() { - return new SetView(); - } - - private static class StackMetaKey { - public final int damage; - public final NBTTagCompound tag; - - public StackMetaKey(int damage, NBTTagCompound tag) { - this.damage = damage; - this.tag = tag; - } - - public StackMetaKey(ItemStack key) { - this(actualDamage(key), key.stackTagCompound); - } - - public int hashCode() { - return Objects.hashCode(damage, tag); - } - - public boolean equals(Object o) { - if (!(o instanceof StackMetaKey)) return false; - StackMetaKey t = (StackMetaKey) o; - return damage == t.damage && Objects.equal(tag, t.tag); - } - } - - private static class DetailIter implements Iterator> { - private final Item owner; - private final ItemStackMap.DetailMap backing; - - @Nullable - private final Iterator> damageIter; - - @Nullable - private final Iterator> tagIter; - - @Nullable - private final Iterator> metaIter; - - private DetailIterState state = DetailIterState.NOT_STARTED; - private boolean removed = false; - - private DetailIter(Map.Entry.DetailMap> input) { - this.owner = input.getKey(); - this.backing = input.getValue(); - damageIter = - backing.damageMap != null ? backing.damageMap.entrySet().iterator() : null; - tagIter = backing.tagMap != null ? backing.tagMap.entrySet().iterator() : null; - metaIter = backing.metaMap != null ? backing.metaMap.entrySet().iterator() : null; - } - - private DetailIterState nextState() { - switch (state) { - case NOT_STARTED: - if (backing.hasWildcard) return DetailIterState.WILDCARD; - case WILDCARD: - case DAMAGE: - if (damageIter != null && damageIter.hasNext()) return DetailIterState.DAMAGE; - case TAG: - if (tagIter != null && tagIter.hasNext()) return DetailIterState.TAG; - case META: - if (metaIter != null && metaIter.hasNext()) return DetailIterState.META; - case DONE: - return DetailIterState.DONE; - default: - throw new IllegalStateException("Unexpected value: " + state); - } - } - - @Override - public void remove() { - if (removed) throw new IllegalStateException("remove() called twice"); - state.remove(this); - removed = true; - } - - @Override - public boolean hasNext() { - return nextState() != DetailIterState.DONE; - } - - @Override - public Map.Entry next() { - DetailIterState nextState = nextState(); - if (nextState == DetailIterState.DONE) throw new NoSuchElementException(); - state = nextState; - removed = false; - return nextState.get(this); - } - - private enum DetailIterState { - NOT_STARTED { - @Override - Map.Entry get(DetailIter iter) { - throw new AssertionError("Should not call get on NOT_STARTED"); - } - - @Override - void remove(DetailIter iter) { - throw new IllegalStateException("next() never called"); - } - }, - WILDCARD { - @Override - Map.Entry get(DetailIter iter) { - return new Map.Entry() { - private final ItemStack key = wildcard(iter.owner); - - @Override - public ItemStack getKey() { - return key; - } - - @Override - public T getValue() { - return iter.backing.wildcard; - } - - @Override - public T setValue(T value) { - return iter.backing.wildcard = value; - } - }; - } - - @Override - void remove(DetailIter iter) { - assert iter.backing.hasWildcard; - iter.backing.wildcard = null; - iter.backing.hasWildcard = false; - } - }, - DAMAGE { - @Override - Map.Entry get(DetailIter iter) { - assert iter.damageIter != null; - Map.Entry entry = iter.damageIter.next(); - return new ItemStackEntry<>(newItemStack(iter.owner, 1, entry.getKey(), WILDCARD_TAG), entry); - } - - @Override - void remove(DetailIter iter) { - assert iter.damageIter != null; - iter.damageIter.remove(); - } - }, - TAG { - @Override - Map.Entry get(DetailIter iter) { - assert iter.tagIter != null; - Map.Entry entry = iter.tagIter.next(); - return new ItemStackEntry<>(newItemStack(iter.owner, 1, WILDCARD_VALUE, entry.getKey()), entry); - } - - @Override - void remove(DetailIter iter) { - assert iter.tagIter != null; - iter.tagIter.remove(); - } - }, - META { - @Override - Map.Entry get(DetailIter iter) { - assert iter.metaIter != null; - Map.Entry entry = iter.metaIter.next(); - return new ItemStackEntry<>( - newItemStack(iter.owner, 1, entry.getKey().damage, entry.getKey().tag), entry); - } - - @Override - void remove(DetailIter iter) { - assert iter.metaIter != null; - iter.metaIter.remove(); - } - }, - DONE { - @Override - Map.Entry get(DetailIter iter) { - throw new AssertionError("Should not call get on DONE"); - } - - @Override - void remove(DetailIter iter) { - throw new AssertionError("Should not call remove on DONE"); - } - }; - - abstract Map.Entry get(DetailIter iter); - - abstract void remove(DetailIter iter); - - private static class ItemStackEntry implements Map.Entry { - private final ItemStack key; - private final Map.Entry entry; - - public ItemStackEntry(ItemStack key, Map.Entry entry) { - this.key = key; - this.entry = entry; - } - - @Override - public ItemStack getKey() { - return key; - } - - @Override - public T getValue() { - return entry.getValue(); - } - - @Override - public T setValue(T value) { - return entry.setValue(value); - } - } - } - } - - private class DetailMap { - private boolean hasWildcard; - private T wildcard; - private HashMap damageMap; - private HashMap tagMap; - private HashMap metaMap; - private int size; - - public T get(ItemStack key) { - if (wildcard != null) return wildcard; - - if (damageMap != null) { - final T ret = damageMap.get(actualDamage(key)); - if (ret != null) return ret; - } - if (tagMap != null) { - final T ret = tagMap.get(key.stackTagCompound); - if (ret != null) return ret; - } - if (metaMap != null) return metaMap.get(new StackMetaKey(key)); - - return null; - } - - public T put(ItemStack key, T value) { - try { - switch (getKeyType(actualDamage(key), key.stackTagCompound)) { - case 0: - if (metaMap == null) metaMap = new HashMap<>(); - return metaMap.put(new StackMetaKey(key), value); - case 1: - if (tagMap == null) tagMap = new HashMap<>(); - return tagMap.put(key.stackTagCompound, value); - case 2: - if (damageMap == null) damageMap = new HashMap<>(); - return damageMap.put(actualDamage(key), value); - case 3: - T ret = wildcard; - wildcard = value; - hasWildcard = true; - return ret; - } - } finally { - updateSize(); - } - return null; - } - - public T remove(ItemStack key) { - try { - switch (getKeyType(actualDamage(key), key.stackTagCompound)) { - case 0: - return metaMap != null ? metaMap.remove(new StackMetaKey(key)) : null; - case 1: - return tagMap != null ? tagMap.remove(key.stackTagCompound) : null; - case 2: - return damageMap != null ? damageMap.remove(actualDamage(key)) : null; - case 3: - T ret = wildcard; - wildcard = null; - hasWildcard = false; - return ret; - } - } finally { - updateSize(); - } - return null; - } - - private void updateSize() { - int newSize = (hasWildcard ? 1 : 0) - + (metaMap != null ? metaMap.size() : 0) - + (tagMap != null ? tagMap.size() : 0) - + (damageMap != null ? damageMap.size() : 0); - - if (newSize != size) { - ItemStackMap.this.size += newSize - size; - size = newSize; - } - } - } - - private class SetView extends AbstractSet> { - @Override - public boolean contains(Object o) { - if (!(o instanceof Map.Entry)) return false; - Map.Entry entry = (Map.Entry) o; - return java.util.Objects.equals(get(entry.getKey()), entry.getValue()); - } - - @Override - public boolean add(Map.Entry itemStackTEntry) { - return itemStackTEntry.getKey() != null - && itemStackTEntry.getValue() != null - && put(itemStackTEntry.getKey(), itemStackTEntry.getValue()) == null; - } - - @Override - public boolean remove(Object o) { - if (!(o instanceof Map.Entry)) return false; - Map.Entry entry = (Map.Entry) o; - return ItemStackMap.this.remove(entry.getKey(), entry.getValue()); - } - - @Nonnull - @Override - public Iterator> iterator() { - return Iterators.concat(Iterators.transform(itemMap.entrySet().iterator(), DetailIter::new)); - } - - @Override - public int size() { - return size; - } - } -}