From 1b7fe4ad3cefa1b86c8a9678cf4b54704c95c301 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 28 Dec 2019 00:38:39 +0800 Subject: trying to optimise it --- .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 89 +++++++++------------- 1 file changed, 37 insertions(+), 52 deletions(-) (limited to 'src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java index 42913d71c..b6613d79e 100644 --- a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java @@ -8,20 +8,14 @@ package me.shedaniel.rei.impl; import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryRegistry; import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.annotations.Internal; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DefaultedList; -import it.unimi.dsi.fastutil.Hash; -import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; -import it.unimi.dsi.fastutil.objects.ObjectSets; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import javax.annotation.Nullable; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; @Deprecated @@ -29,39 +23,37 @@ import java.util.concurrent.CopyOnWriteArrayList; public class EntryRegistryImpl implements EntryRegistry { private final CopyOnWriteArrayList entries = Lists.newCopyOnWriteArrayList(); - private final Set entrySet = ObjectSets.synchronize(new ObjectOpenCustomHashSet<>(new Hash.Strategy() { - @Override - public int hashCode(EntryStack entry) { - return entry == null ? 0 : entry.hashOfAll(); - } + private final LinkedList linkedList = Lists.newLinkedList(); - @Override - public boolean equals(EntryStack a, EntryStack b) { - if (a == null || b == null) { - return a == b; - } else { - boolean result = a.equalsAll(b); - assert result == b.equalsAll(a) : "a.equalsAll(b) != b.equalsAll(a); (a = " + a + ", b = " + b + ")"; - return result; - } - } - })); + public void distinct() { + TreeSet set = new TreeSet<>((i, j) -> i.equalsAll(j) ? 0 : 1); + set.addAll(linkedList); + entries.clear(); + entries.addAll(set); + linkedList.clear(); + } @Override public List getStacksList() { - return entries; + return RecipeHelper.getInstance().arePluginsLoading() && !linkedList.isEmpty() ? linkedList : entries; } public void reset() { entries.clear(); - entrySet.clear(); + linkedList.clear(); } @Override - public ItemStack[] getAllStacksFromItem(Item item) { - DefaultedList list = DefaultedList.of(); - list.add(item.getStackForRender()); + public List appendStacksForItem(Item item) { + DefaultedList list = new DefaultedLinkedList(Lists.newLinkedList(), null); item.appendStacks(item.getGroup(), list); + if (list.isEmpty()) list.add(item.getStackForRender()); + return list; + } + + @Override + public ItemStack[] getAllStacksFromItem(Item item) { + List list = appendStacksForItem(item); ItemStack[] array = list.toArray(new ItemStack[0]); Arrays.sort(array, (a, b) -> ItemStack.areEqualIgnoreDamage(a, b) ? 0 : 1); return array; @@ -71,43 +63,36 @@ public class EntryRegistryImpl implements EntryRegistry { @Deprecated public void registerEntryAfter(EntryStack afterEntry, EntryStack stack, boolean checkAlreadyContains) { if (stack.isEmpty()) return; - boolean isNew = entrySet.add(stack); - if (checkAlreadyContains && !isNew) { - return; - } if (afterEntry == null) { - entries.add(stack); + linkedList.add(stack); } else { - int last = entries.size(); - for (int i = 0; i < entries.size(); i++) - if (entries.get(i).equalsAll(afterEntry)) + int last = linkedList.size(); + for (int i = last - 1; i >= 0; i++) + if (linkedList.get(i).equalsAll(afterEntry)) { last = i + 1; - entries.add(last, stack); + break; + } + linkedList.add(last, stack); } } @Override public void registerEntriesAfter(EntryStack afterStack, Collection stacks) { - List nonDuplicates = new ArrayList<>(); - for (EntryStack stack : stacks) { - if (entrySet.add(stack)) { - nonDuplicates.add(stack); - } - } - int index = entries.size(); if (afterStack != null) { + int index = linkedList.size(); for (int i = index - 1; i >= 0; i--) { - if (entries.get(i).equalsAll(afterStack)) { + if (linkedList.get(i).equalsAll(afterStack)) { index = i + 1; break; } } - } - entries.addAll(index, nonDuplicates); + linkedList.addAll(index, stacks); + } else linkedList.addAll(stacks); } - @Override - public void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) { - registerEntriesAfter(afterStack, Arrays.asList(stacks)); + private class DefaultedLinkedList extends DefaultedList { + public DefaultedLinkedList(List delegate, @Nullable E initialElement) { + super(delegate, initialElement); + } } } -- cgit