/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.util.inventory; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; import net.minecraft.item.ItemStack; /** * This is a custom data structure designed specifically for using ItemStacks as * elements of a Set. * * Its backed by an ArrayList, so as expected, most operations result in * traversing the list one or more times. * * @author CovertJaguar <http://www.railcraft.info> */ public class ItemStackSet implements Set<ItemStack> { private List<ItemStack> set = new ArrayList<ItemStack>(); @Override public int size() { return set.size(); } @Override public boolean isEmpty() { return set.isEmpty(); } @Override public boolean contains(Object obj) { if (!(obj instanceof ItemStack)) { return false; } ItemStack check = (ItemStack) obj; for (ItemStack stack : set) { if (InvTools.isItemEqual(stack, check)) { return true; } } return false; } @Override public Iterator<ItemStack> iterator() { return set.iterator(); } @Override public Object[] toArray() { return set.toArray(); } @Override public <T> T[] toArray(T[] a) { return set.toArray(a); } @Override public boolean add(ItemStack e) { if (contains(e)) { return false; } set.add(e); return true; } @Override public boolean remove(Object obj) { if (!(obj instanceof ItemStack)) { return false; } boolean changed = false; ItemStack check = (ItemStack) obj; Iterator<ItemStack> it = set.iterator(); while (it.hasNext()) { ItemStack stack = it.next(); if (InvTools.isItemEqual(stack, check)) { it.remove(); changed = true; } } return changed; } @Override public boolean containsAll(Collection<?> c) { for (Object obj : c) { if (!(obj instanceof ItemStack)) { return false; } if (!contains((ItemStack) obj)) { return false; } } return true; } @Override public boolean addAll(Collection<? extends ItemStack> c) { boolean changed = false; for (ItemStack stack : c) { changed |= add(stack); } return changed; } @Override public boolean retainAll(Collection<?> c) { boolean changed = false; Iterator<ItemStack> it = set.iterator(); while (it.hasNext()) { ItemStack stack = it.next(); if (!c.contains(it)) { it.remove(); changed = true; } } return changed; } @Override public boolean removeAll(Collection<?> c) { boolean changed = false; Iterator<ItemStack> it = set.iterator(); while (it.hasNext()) { ItemStack stack = it.next(); if (c.contains(it)) { it.remove(); changed = true; } } return changed; } @Override public void clear() { set.clear(); } }