aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java13
-rw-r--r--forge/build.gradle2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java96
3 files changed, 84 insertions, 27 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java b/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java
index 0d20cf7f9..946d9336f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java
@@ -265,6 +265,19 @@ public class CollectionUtils {
return l == null ? Collections.emptyList() : l;
}
+ public static <T, R> List<R> mapAndFilter(Iterable<T> list, Predicate<R> predicate, Function<T, R> function) {
+ List<R> l = null;
+ for (T t : list) {
+ R r = function.apply(t);
+ if (predicate.test(r)) {
+ if (l == null)
+ l = Lists.newArrayList();
+ l.add(r);
+ }
+ }
+ return l == null ? Collections.emptyList() : l;
+ }
+
public static <T> int sumInt(Iterable<T> list, Function<T, Integer> function) {
int sum = 0;
for (T t : list) {
diff --git a/forge/build.gradle b/forge/build.gradle
index 95d9d0ac4..4c13b0d67 100644
--- a/forge/build.gradle
+++ b/forge/build.gradle
@@ -97,6 +97,8 @@ dependencies {
// modRuntime("curse.maven:thermal-expansion-69163:3404884")
// modRuntime("curse.maven:thermal-foundation-222880:3412300")
// modRuntime("curse.maven:cofh-core-69162:3407019")
+ // modRuntime("curse.maven:advanced-peripherals-431725:3525665")
+ // modRuntime("curse.maven:cc-tweaked-282001:3434680")
}
shadowJar {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java
index 346cbb8ea..136429680 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java
@@ -26,6 +26,8 @@ package me.shedaniel.rei.impl.common.entry.type;
import com.google.common.base.MoreObjects;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
+import it.unimi.dsi.fastutil.longs.LongSet;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigObject;
@@ -69,6 +71,7 @@ public class EntryRegistryImpl implements EntryRegistry {
public List<Runnable> refilterListener = Lists.newCopyOnWriteArrayList();
private List<EntryStack<?>> preFilteredList = Lists.newCopyOnWriteArrayList();
private List<EntryStack<?>> entries = Lists.newCopyOnWriteArrayList();
+ private LongSet entriesHash = new LongOpenHashSet();
@Nullable
private List<HashedEntryStackWrapper> reloadingRegistry;
private boolean reloading;
@@ -87,6 +90,7 @@ public class EntryRegistryImpl implements EntryRegistry {
public void startReload() {
refilterListener.clear();
entries = Lists.newCopyOnWriteArrayList();
+ entriesHash = new LongOpenHashSet();
reloadingRegistry = Lists.newArrayListWithCapacity(Registry.ITEM.keySet().size() + 100);
preFilteredList = Lists.newCopyOnWriteArrayList();
reloading = true;
@@ -186,16 +190,19 @@ public class EntryRegistryImpl implements EntryRegistry {
public void addEntryAfter(@Nullable EntryStack<?> afterEntry, EntryStack<?> stack) {
if (reloading) {
int index = afterEntry != null ? reloadingRegistry.lastIndexOf(new HashedEntryStackWrapper(afterEntry)) : -1;
- if (index >= 0) {
- reloadingRegistry.add(index, new HashedEntryStackWrapper(stack));
- } else reloadingRegistry.add(new HashedEntryStackWrapper(stack));
- } else {
- preFilteredList.addAll(refilterNew(Collections.singletonList(stack)));
- queueSearchUpdate();
+ HashedEntryStackWrapper wrapper = new HashedEntryStackWrapper(stack);
+ if (this.entriesHash.add(wrapper.hashExact())) {
+ if (index >= 0) {
+ reloadingRegistry.add(index, wrapper);
+ } else reloadingRegistry.add(wrapper);
+ }
+ } else if (this.entriesHash.add(EntryStacks.hashExact(stack))) {
if (afterEntry != null) {
int index = entries.lastIndexOf(afterEntry);
entries.add(index, stack);
} else entries.add(stack);
+ preFilteredList.addAll(refilterNew(Collections.singletonList(stack)));
+ queueSearchUpdate();
}
}
@@ -203,16 +210,18 @@ public class EntryRegistryImpl implements EntryRegistry {
public void addEntriesAfter(@Nullable EntryStack<?> afterEntry, Collection<? extends EntryStack<?>> stacks) {
if (reloading) {
int index = afterEntry != null ? reloadingRegistry.lastIndexOf(new HashedEntryStackWrapper(afterEntry)) : -1;
+ List<HashedEntryStackWrapper> filtered = CollectionUtils.mapAndFilter(stacks, wrapper -> entriesHash.add(wrapper.hashExact()), HashedEntryStackWrapper::new);
if (index >= 0) {
- reloadingRegistry.addAll(index, CollectionUtils.mapParallel(stacks, HashedEntryStackWrapper::new));
- } else reloadingRegistry.addAll(CollectionUtils.mapParallel(stacks, HashedEntryStackWrapper::new));
+ reloadingRegistry.addAll(index, filtered);
+ } else reloadingRegistry.addAll(filtered);
} else {
- preFilteredList.addAll(refilterNew((Collection<EntryStack<?>>) stacks));
- queueSearchUpdate();
+ List<EntryStack<?>> filtered = CollectionUtils.filterToList((Collection<EntryStack<?>>) stacks, stack -> entriesHash.add(EntryStacks.hashExact(stack)));
if (afterEntry != null) {
int index = entries.lastIndexOf(afterEntry);
- entries.addAll(index, stacks);
- } else entries.addAll(stacks);
+ entries.addAll(index, filtered);
+ } else entries.addAll(filtered);
+ preFilteredList.addAll(refilterNew(filtered));
+ queueSearchUpdate();
}
}
@@ -255,49 +264,82 @@ public class EntryRegistryImpl implements EntryRegistry {
@Override
public boolean alreadyContain(EntryStack<?> stack) {
- if (reloading) {
- return reloadingRegistry.parallelStream().anyMatch(s -> EntryStacks.equalsExact(s.unwrap(), stack));
- }
- return entries.parallelStream().anyMatch(s -> EntryStacks.equalsExact(s, stack));
+ return entriesHash.contains(EntryStacks.hashExact(stack));
}
@Override
public boolean removeEntry(EntryStack<?> stack) {
if (reloading) {
- return reloadingRegistry.remove(new HashedEntryStackWrapper(stack));
+ HashedEntryStackWrapper wrapper = new HashedEntryStackWrapper(stack);
+ reloadingRegistry.remove(wrapper);
+ return entriesHash.remove(wrapper.hashExact());
} else {
preFilteredList.remove(stack);
- return entries.remove(stack);
+ entries.remove(stack);
+ return entriesHash.remove(EntryStacks.hashExact(stack));
}
}
@Override
public boolean removeEntryIf(Predicate<? extends EntryStack<?>> predicate) {
if (reloading) {
- return reloadingRegistry.removeIf(wrapper -> ((Predicate<EntryStack<?>>) predicate).test(wrapper.unwrap()));
+ return reloadingRegistry.removeIf(wrapper -> {
+ if (((Predicate<EntryStack<?>>) predicate).test(wrapper.unwrap())) {
+ entriesHash.remove(wrapper.hashExact());
+ return true;
+ }
+
+ return false;
+ });
} else {
- preFilteredList.removeIf((Predicate<EntryStack<?>>) predicate);
- return entries.removeIf((Predicate<EntryStack<?>>) predicate);
+ Predicate<EntryStack<?>> entryStackPredicate = stack -> {
+ if (((Predicate<EntryStack<?>>) predicate).test(stack)) {
+ entriesHash.remove(EntryStacks.hashExact(stack));
+ return true;
+ }
+
+ return false;
+ };
+ preFilteredList.removeIf(entryStackPredicate);
+ return entries.removeIf(entryStackPredicate);
}
}
@Override
public boolean removeEntryExactHashIf(LongPredicate predicate) {
+ LongPredicate entryStackPredicate = hash -> {
+ if (predicate.test(hash)) {
+ entriesHash.remove(hash);
+ return true;
+ }
+
+ return false;
+ };
+
if (reloading) {
- return reloadingRegistry.removeIf(wrapper -> predicate.test(wrapper.hashExact()));
+ return reloadingRegistry.removeIf(wrapper -> entryStackPredicate.test(wrapper.hashExact()));
} else {
- preFilteredList.removeIf(stack -> predicate.test(EntryStacks.hashExact(stack)));
- return entries.removeIf(stack -> predicate.test(EntryStacks.hashExact(stack)));
+ preFilteredList.removeIf(stack -> entryStackPredicate.test(EntryStacks.hashExact(stack)));
+ return entries.removeIf(stack -> entryStackPredicate.test(EntryStacks.hashExact(stack)));
}
}
@Override
public boolean removeEntryFuzzyHashIf(LongPredicate predicate) {
+ Predicate<EntryStack<?>> entryStackPredicate = stack -> {
+ if (predicate.test(EntryStacks.hashFuzzy(stack))) {
+ entriesHash.remove(EntryStacks.hashExact(stack));
+ return true;
+ }
+
+ return false;
+ };
+
if (reloading) {
- return reloadingRegistry.removeIf(wrapper -> predicate.test(EntryStacks.hashFuzzy(wrapper.unwrap())));
+ return reloadingRegistry.removeIf(wrapper -> entryStackPredicate.test(wrapper.unwrap()));
} else {
- preFilteredList.removeIf(stack -> predicate.test(EntryStacks.hashFuzzy(stack)));
- return entries.removeIf(stack -> predicate.test(EntryStacks.hashFuzzy(stack)));
+ preFilteredList.removeIf(entryStackPredicate);
+ return entries.removeIf(entryStackPredicate);
}
}
}