changes to the clean up of StackLists, related to #838

This commit is contained in:
way2muchnoise
2017-01-16 17:08:49 +01:00
parent 82fb275a3f
commit b9164231ac
2 changed files with 15 additions and 9 deletions

View File

@@ -11,15 +11,14 @@ import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
public class StackListItem implements IStackList<ItemStack> {
private ArrayListMultimap<Item, ItemStack> stacks = ArrayListMultimap.create();
private List<ItemStack> removeTracker = new LinkedList<>();
protected boolean needsCleanup = false;
private Set<Item> touchedItems = new HashSet<>();
@Override
public void add(@Nonnull ItemStack stack, int size) {
@@ -47,6 +46,7 @@ public class StackListItem implements IStackList<ItemStack> {
otherStack.shrink(size);
if (otherStack.isEmpty()) {
touchedItems.add(stack.getItem());
needsCleanup = true;
}
@@ -68,6 +68,7 @@ public class StackListItem implements IStackList<ItemStack> {
otherStack.shrink(size);
if (otherStack.isEmpty()) {
touchedItems.add(stack.getItem());
needsCleanup = true;
}
@@ -125,13 +126,14 @@ public class StackListItem implements IStackList<ItemStack> {
@Override
public void clean() {
List<Pair<Item, ItemStack>> toRemove = stacks.asMap().entrySet().stream()
.flatMap(entry -> entry.getValue().stream().map(value -> Pair.of(entry.getKey(), value)))
List<Pair<Item, ItemStack>> toRemove = touchedItems.stream()
.flatMap(item -> stacks.get(item).stream().map(stack -> Pair.of(item, stack)))
.filter(pair -> pair.getValue().isEmpty())
.collect(Collectors.toList());
toRemove.forEach(pair -> stacks.remove(pair.getLeft(), pair.getRight()));
touchedItems.clear();
needsCleanup = false;
}

View File

@@ -5,17 +5,17 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
public class StackListItemOredicted implements IStackList<ItemStack> {
private StackListItem underlyingList;
private ArrayListMultimap<Integer, ItemStack> stacks = ArrayListMultimap.create();
private Set<Integer> touchedIds = new HashSet<>();
private StackListItemOredicted() {
}
@@ -50,6 +50,7 @@ public class StackListItemOredicted implements IStackList<ItemStack> {
public boolean remove(@Nonnull ItemStack stack, int size) {
boolean rvalue = underlyingList.remove(stack, size);
if (underlyingList.needsCleanup) {
touchedIds.addAll(Arrays.stream(OreDictionary.getOreIDs(stack)).boxed().collect(Collectors.toList()));
clean();
}
return rvalue;
@@ -59,6 +60,7 @@ public class StackListItemOredicted implements IStackList<ItemStack> {
public boolean trackedRemove(@Nonnull ItemStack stack, int size) {
boolean rvalue = underlyingList.trackedRemove(stack, size);
if (underlyingList.needsCleanup) {
touchedIds.addAll(Arrays.stream(OreDictionary.getOreIDs(stack)).boxed().collect(Collectors.toList()));
clean();
}
return rvalue;
@@ -117,11 +119,13 @@ public class StackListItemOredicted implements IStackList<ItemStack> {
}
private void localClean() {
List<Map.Entry<Integer, ItemStack>> toRemove = stacks.entries().stream()
List<Map.Entry<Integer, ItemStack>> toRemove = touchedIds.stream()
.flatMap(id -> stacks.get(id).stream().map(stack -> Pair.of(id, stack)))
.filter(entry -> entry.getValue().isEmpty())
.collect(Collectors.toList());
toRemove.forEach(entry -> stacks.remove(entry.getKey(), entry.getValue()));
touchedIds.clear();
}
@Override