aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2019-12-28 00:38:39 +0800
committershedaniel <daniel@shedaniel.me>2019-12-28 00:38:39 +0800
commit1b7fe4ad3cefa1b86c8a9678cf4b54704c95c301 (patch)
treefcde590305aa3503c8ef72374b76ea3ca16d8cd3 /src/main
parent99d4e59c0d8d4acc5200f5b3b40a1b4f0b34157b (diff)
downloadRoughlyEnoughItems-1b7fe4ad3cefa1b86c8a9678cf4b54704c95c301.tar.gz
RoughlyEnoughItems-1b7fe4ad3cefa1b86c8a9678cf4b54704c95c301.tar.bz2
RoughlyEnoughItems-1b7fe4ad3cefa1b86c8a9678cf4b54704c95c301.zip
trying to optimise it
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/me/shedaniel/rei/api/EntryRegistry.java13
-rw-r--r--src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java89
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java12
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java38
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java9
-rw-r--r--src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java22
6 files changed, 88 insertions, 95 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java
index a7765036d..c850345d9 100644
--- a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java
+++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java
@@ -10,6 +10,7 @@ import me.shedaniel.rei.utils.CollectionUtils;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -27,6 +28,8 @@ public interface EntryRegistry {
*/
List<EntryStack> getStacksList();
+ List<ItemStack> appendStacksForItem(Item item);
+
/**
* Gets all possible stacks from an item
*
@@ -66,11 +69,7 @@ public interface EntryRegistry {
* @param stacks the stacks to register
*/
default void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) {
- for (int i = stacks.length - 1; i >= 0; i--) {
- EntryStack stack = stacks[i];
- if (stack != null && !stack.isEmpty())
- registerEntryAfter(afterStack, stack);
- }
+ registerEntriesAfter(afterStack, Arrays.asList(stacks));
}
/**
@@ -79,9 +78,7 @@ public interface EntryRegistry {
* @param afterStack the stack to put after
* @param stacks the stacks to register
*/
- default void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) {
- registerEntriesAfter(afterStack, stacks.toArray(new EntryStack[0]));
- }
+ void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks);
/**
* Registers multiple stacks to the item list
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<EntryStack> entries = Lists.newCopyOnWriteArrayList();
- private final Set<EntryStack> entrySet = ObjectSets.synchronize(new ObjectOpenCustomHashSet<>(new Hash.Strategy<EntryStack>() {
- @Override
- public int hashCode(EntryStack entry) {
- return entry == null ? 0 : entry.hashOfAll();
- }
+ private final LinkedList<EntryStack> 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<EntryStack> set = new TreeSet<>((i, j) -> i.equalsAll(j) ? 0 : 1);
+ set.addAll(linkedList);
+ entries.clear();
+ entries.addAll(set);
+ linkedList.clear();
+ }
@Override
public List<EntryStack> 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<ItemStack> list = DefaultedList.of();
- list.add(item.getStackForRender());
+ public List<ItemStack> appendStacksForItem(Item item) {
+ DefaultedList<ItemStack> 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<ItemStack> 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<? extends EntryStack> stacks) {
- List<EntryStack> 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<E> extends DefaultedList<E> {
+ public DefaultedLinkedList(List<E> delegate, @Nullable E initialElement) {
+ super(delegate, initialElement);
+ }
}
}
diff --git a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java
index 3778cd5f0..2e6138cb2 100644
--- a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java
+++ b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java
@@ -116,17 +116,17 @@ public class ItemEntryStack extends AbstractEntryStack {
@Override
public int hashCode() {
- if (hash == -1) {
+// if (hash == -1) {
int result = 1;
- result = 31 * result + getType().ordinal();
+ result = 31 * result + getType().hashCode();
result = 31 * result + itemStack.getItem().hashCode();
result = 31 * result + itemStack.getCount();
result = 31 * result + (itemStack.hasTag() ? itemStack.getTag().hashCode() : 0);
hash = result;
- if (hash == -1) {
- hash = -2;
- }
- }
+// if (hash == -1) {
+// hash = -2;
+// }
+// }
return hash;
}
diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
index 8db27a8c7..4337e4ad1 100644
--- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
+++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
@@ -47,16 +47,16 @@ public class RecipeHelperImpl implements RecipeHelper {
VISIBILITY_HANDLER_COMPARATOR = comparator.reversed();
}
- private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList();
- private final List<RecipeFunction> recipeFunctions = Lists.newArrayList();
- private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList();
- private final AtomicInteger recipeCount = new AtomicInteger();
- private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newHashMap();
- private final List<RecipeCategory<?>> categories = Lists.newArrayList();
- private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newHashMap();
- private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newHashMap();
- private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
- private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newArrayList();
+ private final List<AutoTransferHandler> autoTransferHandlers = Lists.newLinkedList();
+ private final List<RecipeFunction> recipeFunctions = Lists.newLinkedList();
+ private final List<ScreenClickArea> screenClickAreas = Lists.newLinkedList();
+ private final int[] recipeCount = {0};
+ private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
+ private final List<RecipeCategory<?>> categories = Lists.newLinkedList();
+ private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newLinkedHashMap();
+ private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newLinkedHashMap();
+ private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newLinkedList();
+ private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newLinkedList();
private RecipeManager recipeManager;
private boolean arePluginsLoading = false;
@@ -118,14 +118,14 @@ public class RecipeHelperImpl implements RecipeHelper {
public void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display) {
if (!recipeCategoryListMap.containsKey(categoryIdentifier))
return;
- recipeCount.incrementAndGet();
+ recipeCount[0]++;
recipeCategoryListMap.get(categoryIdentifier).add(display);
}
private void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display, int index) {
if (!recipeCategoryListMap.containsKey(categoryIdentifier))
return;
- recipeCount.incrementAndGet();
+ recipeCount[0]++;
recipeCategoryListMap.get(categoryIdentifier).add(index, display);
}
@@ -249,7 +249,7 @@ public class RecipeHelperImpl implements RecipeHelper {
long startTime = System.currentTimeMillis();
arePluginsLoading = true;
ScreenHelper.clearData();
- this.recipeCount.set(0);
+ recipeCount[0] = 0;
this.recipeManager = recipeManager;
this.recipeCategoryListMap.clear();
this.categories.clear();
@@ -277,7 +277,9 @@ public class RecipeHelperImpl implements RecipeHelper {
for (REIPluginEntry plugin : plugins) {
try {
if (reiVersion instanceof SemanticVersion)
- if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) {
+ if (plugin.getMinimumVersion() == null) {
+ RoughlyEnoughItemsCore.LOGGER.warn("[REI] Plugin " + plugin.getPluginIdentifier().toString() + " did not provide a minimum version, skipping version check!");
+ } else if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) {
throw new IllegalStateException("Requires " + plugin.getMinimumVersion().getFriendlyString() + " version of REI!");
}
if (plugin instanceof REIPluginV0) {
@@ -300,6 +302,9 @@ public class RecipeHelperImpl implements RecipeHelper {
RoughlyEnoughItemsCore.LOGGER.error("[REI] " + identifier.toString() + " plugin failed to load!", e);
}
}
+ // Remove duplicate entries
+ ((EntryRegistryImpl) EntryRegistry.getInstance()).distinct();
+
for (REIPluginV0 plugin : reiPluginV0s) {
Identifier identifier = plugin.getPluginIdentifier();
try {
@@ -333,12 +338,13 @@ public class RecipeHelperImpl implements RecipeHelper {
return -1f;
}
});
+
// Clear Cache
((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true);
long usedTime = System.currentTimeMillis() - startTime;
- RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount.get(), DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
+ RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount[0], DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
arePluginsLoading = false;
}
@@ -355,7 +361,7 @@ public class RecipeHelperImpl implements RecipeHelper {
@Override
public int getRecipeCount() {
- return recipeCount.get();
+ return recipeCount[0];
}
@Override
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
index c0ccf527b..c876a6f1f 100644
--- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
+++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
@@ -94,16 +94,13 @@ public class DefaultPlugin implements REIPluginV0 {
return;
}
for (Item item : Registry.ITEM) {
- ItemStack[] stacks = null;
+ List<ItemStack> stacks = null;
try {
- stacks = entryRegistry.getAllStacksFromItem(item);
- for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
- entryRegistry.registerEntry(EntryStack.create(stack));
- }
+ stacks = entryRegistry.appendStacksForItem(item);
} catch (Exception ignored) {
}
if (stacks != null) {
- for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
+ for (ItemStack stack : entryRegistry.appendStacksForItem(item)) {
entryRegistry.registerEntry(EntryStack.create(stack));
}
} else
diff --git a/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java b/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java
index 9064fd499..9eebeaee0 100644
--- a/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java
+++ b/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java
@@ -15,10 +15,14 @@ import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.LogManager;
import org.jetbrains.annotations.TestOnly;
+import java.util.Random;
+
@TestOnly
@Deprecated
public class REITestPlugin implements REIPluginV0 {
+ private Random random = new Random();
+
@Override
public void preRegister() {
LogManager.getLogger().error("REI Test Plugin is enabled! If you see this unintentionally, please report this!");
@@ -32,17 +36,21 @@ public class REITestPlugin implements REIPluginV0 {
@Override
public void registerEntries(EntryRegistry entryRegistry) {
for (Item item : Registry.ITEM) {
- entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
- entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
- entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
+ for (int i = 0; i < 15; i++)
+ entryRegistry.registerEntry(transformStack(EntryStack.create(item)));
try {
- for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
- entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
- entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
- entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
+ for (ItemStack stack : entryRegistry.appendStacksForItem(item)) {
+ for (int i = 0; i < 15; i++)
+ entryRegistry.registerEntry(transformStack(EntryStack.create(stack)));
}
} catch (Exception e) {
}
}
}
+
+ public EntryStack transformStack(EntryStack stack) {
+ stack.setAmount(random.nextInt(Integer.MAX_VALUE));
+ return stack;
+ }
+
}