From c2b7f0458968e2c0c3793c5a3364d8a878266dd6 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 29 Jan 2022 15:31:06 +0800 Subject: Close #739 --- .../comparison/EntryComparatorRegistryImpl.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java index f2a202778..42e20d6b8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java @@ -29,11 +29,14 @@ import me.shedaniel.rei.api.common.entry.comparison.EntryComparatorRegistry; import me.shedaniel.rei.api.common.registry.ReloadStage; import org.jetbrains.annotations.ApiStatus; +import java.util.ArrayList; import java.util.IdentityHashMap; +import java.util.List; import java.util.Map; @ApiStatus.Internal public abstract class EntryComparatorRegistryImpl implements EntryComparatorRegistry { + private final List> globalComparators = new ArrayList<>(); private final Map> comparators = new IdentityHashMap<>(); @Override @@ -45,6 +48,11 @@ public abstract class EntryComparatorRegistryImpl implements EntryComparat this.comparators.put(entry, comparator); } + @Override + public void registerGlobal(EntryComparator comparator) { + this.globalComparators.add(comparator); + } + @Override public ReloadStage getStage() { return ReloadStage.START; @@ -52,6 +60,7 @@ public abstract class EntryComparatorRegistryImpl implements EntryComparat @Override public void startReload() { + globalComparators.clear(); comparators.clear(); } @@ -62,19 +71,22 @@ public abstract class EntryComparatorRegistryImpl implements EntryComparat @Override public long hashOf(ComparisonContext context, T stack) { EntryComparator comparator = comparators.get(getEntry(stack)); - if (comparator != null) { - return comparator.hash(context, stack); + if (comparator == null) comparator = defaultComparator(); + long hash = 1L; + hash = hash * 31 + comparator.hash(context, stack); + for (EntryComparator globalComparator : globalComparators) { + hash = hash * 31 + globalComparator.hash(context, stack); } - return defaultComparator().hash(context, stack); + return hash; } @Override public boolean containsComparator(S item) { - return comparators.containsKey(item); + return !globalComparators.isEmpty() || comparators.containsKey(item); } @Override public int comparatorSize() { - return this.comparators.size(); + return this.globalComparators.size() + this.comparators.size(); } } -- cgit