From 01472327420c131b759d0b3db4fb59623bf95e3f Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 3 May 2021 00:29:57 +0800 Subject: Cache search results Signed-off-by: shedaniel --- .../impl/client/entry/filtering/FilteringRule.java | 10 +++------ .../impl/client/gui/ContainerScreenOverlay.java | 2 ++ .../rei/impl/client/search/argument/Argument.java | 26 +++++++++++++++++----- .../client/search/argument/type/ArgumentType.java | 7 ++++++ 4 files changed, 33 insertions(+), 12 deletions(-) (limited to 'runtime') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java index dd8cd6340..69bfaca27 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.rules.SearchFilteringRule; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.Util; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; @@ -46,15 +47,10 @@ import java.util.function.BiFunction; @Environment(EnvType.CLIENT) public interface FilteringRule> { ResourceKey>> REGISTRY_KEY = ResourceKey.createRegistryKey(new ResourceLocation("roughlyenoughitems", "filtering_rule")); - Registry> REGISTRY = createRegistry(); - - @ApiStatus.Internal - static Registry> createRegistry() { - MappedRegistry> registry = new MappedRegistry<>(REGISTRY_KEY, Lifecycle.stable()); + Registry> REGISTRY = Util.make(new MappedRegistry<>(REGISTRY_KEY, Lifecycle.stable()), registry -> { Registry.register(registry, new ResourceLocation("roughlyenoughitems", "search"), new SearchFilteringRule()); Registry.register(registry, new ResourceLocation("roughlyenoughitems", "manual"), new ManualFilteringRule()); - return registry; - } + }); static CompoundTag save(FilteringRule rule, CompoundTag tag) { tag.putString("id", REGISTRY.getKey(rule).toString()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java index 8abd4ea35..80881a3da 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java @@ -68,6 +68,7 @@ import me.shedaniel.rei.impl.client.gui.widget.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; +import me.shedaniel.rei.impl.client.search.argument.Argument; import me.shedaniel.rei.impl.common.util.Weather; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -209,6 +210,7 @@ public class ContainerScreenOverlay extends REIOverlay { } public void init() { + Argument.SEARCH_CACHE.clear(); draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), DraggableStackVisitor.from(() -> ScreenRegistry.getInstance().getDraggableVisitors())); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java index dcabfbdf2..7fd96e637 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java @@ -25,8 +25,14 @@ package me.shedaniel.rei.impl.client.search.argument; import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; +import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import me.shedaniel.rei.api.client.gui.config.SearchMode; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.search.IntRange; import me.shedaniel.rei.impl.client.search.argument.type.AlwaysMatchingArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType; @@ -51,6 +57,7 @@ import java.util.regex.Pattern; @Environment(EnvType.CLIENT) public class Argument { public static final String SPACE = " ", EMPTY = ""; + public static final Short2ObjectMap> SEARCH_CACHE = new Short2ObjectOpenHashMap<>(); static final Argument ALWAYS = new Argument<>(AlwaysMatchingArgumentType.INSTANCE, EMPTY, true, -1, -1, true); private ArgumentType argumentType; private String text; @@ -180,11 +187,10 @@ public class Argument { private static boolean matches(EntryStack stack, AlternativeArgument alternativeArgument, Mutable mutable) { if (alternativeArgument.isEmpty()) return true; + long hashExact = EntryStacks.hashExact(stack); for (Argument argument : alternativeArgument) { - mutable.setValue(null); - - if (matches(argument.getArgument(), mutable, stack, argument.getText(), argument.filterData) == argument.isRegular()) { + if (matches((short) argument.getArgument().getIndex(), argument.getArgument(), mutable, stack, hashExact, argument.getText(), argument.filterData) == argument.isRegular()) { return true; } } @@ -192,8 +198,18 @@ public class Argument { return false; } - private static boolean matches(ArgumentType argumentType, Mutable data, EntryStack stack, String filter, R filterData) { - return argumentType.matches((Mutable) data, stack, filter, (T) filterData); + private static boolean matches(short argumentIndex, ArgumentType argumentType, Mutable data, EntryStack stack, long hashExact, String filter, R filterData) { + Long2ObjectMap map = SEARCH_CACHE.get(argumentIndex); + if (map == null) { + SEARCH_CACHE.put(argumentIndex, map = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap<>())); + } + Z value = (Z) map.get(hashExact); + data.setValue(value); + boolean matches = argumentType.matches((Mutable) data, stack, filter, (T) filterData); + if (value == null) { + map.put(hashExact, data.getValue()); + } + return matches; } public ArgumentType getArgument() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java index 9aa9882f4..d46eacaf6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java @@ -36,6 +36,8 @@ import org.jetbrains.annotations.Nullable; @ApiStatus.Internal @Environment(EnvType.CLIENT) public abstract class ArgumentType { + private int index = -1; + public ArgumentType() { } @@ -83,4 +85,9 @@ public abstract class ArgumentType { public abstract boolean matches(Mutable data, EntryStack stack, String searchText, T filterData); public abstract T prepareSearchFilter(String searchText); + + public int getIndex() { + if (index >= 0) return index; + return index = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.indexOf(this); + } } -- cgit